9RIA.com天地会 - 论坛

返回列表 发帖

天地培训

9RIA天地会官方培训机构

Adobe官方认证培训中心

[其他] 有人要来PK一下么..

回答正确的加1威望..欢迎续贴
我先出招啊~

AS3中的队列怎么实现?
1

评分人数

  • 黑羽

黑羽 赐本贴 威望 + 5  诏曰: 好活动!^_^ 威望鼓励

哥们,行行好别拜我了,我还没死

天地人才库
数据结构忘的差不多了,不过还是说下自己的想法
好象要用到指针吧,在flash中好象还没有,可不可以用一个数组存储队列,加上一些方法,什么删队尾的,添加到队首的,判空的……等
呵呵,随便说说,看高手的方法
blog:
http://blog.sina.com.cn/flashfan

TOP

好问题,支持一下:

答案如下:
队列(Queue)又称先进先出表(First In First Out),即先加入队列的元素删除时先离开队列,加入元素的一头叫“队头”,删除元素的一头叫“队尾”。

基于队列的基本特性,在As3中可以用Array类来实现:
加入队列:Array.push(object);
离开队列:Array.shift();

  1. // 新建队列
  2. var Queue:Array = new Array();

  3. // 加入队列
  4. Queue.push("a1");
  5. Queue.push("a2");
  6. Queue.push("a3");
  7. Queue.push("a4");
  8. Queue.push("a5");

  9. // 打印队列
  10. trace(Queue);        // 打印结果:a1,a2,a3,a4,a5

  11. // 离开队列
  12. Queue.shift();

  13. // 打印队列
  14. trace(Queue);        // 打印结果:a2,a3,a4,a5。先加入的元素”a1“先离开队列
复制代码


以上是最简单的队列实现
1

评分人数

  • 猫粮

猫粮 赐本贴 威望 + 2 银子 + 10  诏曰: 回答正确! 请morningyi出题继续PK ...

i can always make you smile......

TOP

好兄弟,讲义气!---by eko

踏上天地会荣耀之路!

 

申请舵主

加入掘金队

加入译林军

知识专题整理

 

咨询(QQ):

1442604479(小地)

 

既然说到了“队列”,就顺便把和队列概念相似的“栈”一起说了吧。

栈(Stack):是一种和队列类似的另外一种特殊的线性表,栈又称为后进先出表(Last In First Out),即后加入表的元素,先被删除。插入、删除的一端称为“栈顶”,另外一端称为“栈底”

栈也可以用Array类来实现:
进栈:Array.push(object);
出栈:Array.pop();

  1. // 新建栈
  2. var Stack:Array = new Array();

  3. // 入栈
  4. Stack.push("a1");
  5. Stack.push("a2");
  6. Stack.push("a3");
  7. Stack.push("a4");
  8. Stack.push("a5");

  9. // 打印栈
  10. trace(Stack);        // 打印结果:a1,a2,a3,a4,a5

  11. // 出栈
  12. Stack.pop();

  13. // 打印栈
  14. trace(Stack);        // 打印结果:a1,a2,a3,a4。后进栈的元素”a5“先出栈
复制代码
i can always make you smile......

TOP

早知道蛮好问如何在AS3中实现栈了,现在自问自答了。

出一到关于显示编程的问题:

“写一个函数,将一个DisplayObjectContainer中所有的显示元素清除(removeChild),包括其中子DisplayObjectContainer中的都要清除”

函数定义:
  1. clearAllDisplayList(container:DisplayObjectContainer)
复制代码
i can always make you smile......

TOP

一开始PK就用杀人招…
其实这是个递归,也很好做…
我们用到的是DisplayObjectContainer的两个东东
1.numChildren
2.removeChildAt.

根据mx.core.Container的源码:
  1.    
  2.     public function removeAllChildren():void
  3.     {
  4.         while (numChildren > 0)
  5.         {
  6.             removeChildAt(0);
  7.         }
  8.     }
复制代码

就可以做到咯!
当然你还会问我,这样移除的是子对象,孙对象还没移除呢!
当然爷爷最好不要管孙子的事,有代沟嘛,我们要的是让爷爷的儿子来移除它的儿子。
相关的知识我已经写在另一篇文章中
轻松几行让你AS3程序不再“内存泄露”
就是说,我们在Container的remove事件中添加removeAllChildren()函数,就能达到想要的效果。

PS:要我写一个遍历树的函数也不是不可以,但是我觉得既然是PK,那么回答就回答点估计以后会用在企业开发用途上的答案
如果觉得不过瘾硬要写个遍历Container再移除的代码,也ok,跟帖吧...(主要是要调试,懒得调..)哈哈

继续出小招:
我加载了一个MP3,要怎么在它没完全加载前获得它的长度?(不能从外部获取当前Mp3的长度)

[ 本帖最后由 猫粮 于 2007-11-10 17:17 编辑 ]
哥们,行行好别拜我了,我还没死

TOP

试想一下,你加载的是一个流~是无法获取他的长度信息的...因为你不知道合时才能加载完...除非你从外部获取他的长度信息.要么,你可以把长度信息写的ID3上- -

TOP

function clearAllDisplayList(container : DisplayObjectContainer) : void {
        var count : int = container.numChildren;
        for (var i : int = 0;i < count; i++) {
                container.removeChildAt(0);
        }
        if(container is Sprite) (container as Sprite).graphics.clear();
}

TOP

as2:totalTime =sound.duration/sound.getBytesLoaded()*sound.getBytesTotal();
as3:同理
1

评分人数

  • 猫粮

猫粮 赐本贴 威望 + 1 银子 + 5  诏曰: 答对!分送上!请wizim出题

TOP

flash as3中没有Key.isDown()方法,我们做游戏需要时刻知道用户的按键状态,写个类实现一下isDown()吧!

TOP

参考资料:as2中isDown(键盘代码)是用来返回指定的按键代码有没有按下的,按下返回true 否则返回false

TOP

再这样PK下去老本都要亏掉了啊....
猫粮不干啊~不干啊~你们一上来就出狠招…
算了...教大家一招十分猥琐的招数,大家看招吧!
这招非常狠毒,请大家善加利用…
  1. /**
  2. * ...
  3. * @author 猫粮
  4. * @version 0.1
  5. */

  6. package  {
  7.         import flash.display.Sprite;
  8.         import flash.events.KeyboardEvent;

  9.         public class isKeyDown  extends Sprite{
  10.                
  11.                 public function isKeyDown() {
  12.                               //我QJ了Object..
  13.                         Object.prototype.KeyHandler = new KeyHandler();
  14.                         stage.addEventListener(KeyboardEvent.KEY_DOWN,keydownHandler);
  15.                         stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);
  16.                 }
  17.                 public function keydownHandler(e:KeyboardEvent):void
  18.                 {
  19.                        
  20.                         if(Object["KeyHandler"][e.keyCode] == undefined || Object["KeyHandler"][e.keyCode]== false)                                               
  21.                                 Object["KeyHandler"][e.keyCode]=true;
  22.                        
  23.                 }
  24.                 public function keyUpHandler(e:KeyboardEvent):void
  25.                 {
  26.                         if(Object["KeyHandler"][e.keyCode] == undefined || Object["KeyHandler"][e.keyCode] == true)
  27.                                 Object["KeyHandler"][e.keyCode]=false;
  28.                 }
  29.                     //这个函数可以在任何地方用....
  30.                 public function KeyDown(keyCode:uint):Boolean
  31.                 {
  32.                         return Object["KeyHandler"][keyCode];
  33.                 }
  34.                
  35.         }
  36. }

  37. /**
  38. * ...
  39. * @author 猫粮
  40. * @version 0.1
  41. */

  42. package  {

  43.         public dynamic class KeyHandler {
  44.                
  45.                 public function KeyHandler() {
  46.                        
  47.                 }
  48.                
  49.         }
  50.        
  51. }
复制代码


今天吐血严重,明天继续出题....
哥们,行行好别拜我了,我还没死

TOP

猫粮回答的很好,如果做游戏,一般还是把监听放在Stage上的。大家可以简化一下猫粮的类来使用
等待猫粮吐血后出题

TOP

原帖由 morningyi 于 2007-11-10 16:41 发表
早知道蛮好问如何在AS3中实现栈了,现在自问自答了。

出一到关于显示编程的问题:

“写一个函数,将一个DisplayObjectContainer中所有的显示元素清除(removeChild),包括其中子DisplayObjectContainer中的都要清除”

函数定 ...



我用的当然是递归调用,爷爷容器当然不管孙子的事情,孙子的事情由孙子自己处理啦,答案见清除指定显示对象中的所有元素
i can always make you smile......

TOP

我想还是贴出做游戏专用的stage按键监听的比较好:

  1. package tools{
  2.         public class KeyIsDown{
  3.                 private static var obj;
  4.                
  5.                 public static function init(stage){
  6.                         obj = new Object();
  7.                         stage.addEventListener("keyDown", keydownHandler);
  8.                         stage.addEventListener("keyUp", keyupHandler);
  9.                 }
  10.                
  11.                 public static function isDown(key){
  12.                         return(obj[key] ? true : false);
  13.                 }
  14.                
  15.                 private static function keydownHandler(event){
  16.                         obj[event.keyCode] = true;
  17.                 }
  18.                
  19.                 private static function keyupHandler(event){
  20.                         obj[event.keyCode] = false;
  21.                 }
  22.                
  23.         }
  24. }
复制代码


开始的时候在文档类构造的时候KeyIsDown.init(stage)一下
然后在任何地方KeyIsDown.isDown(keycode)都可以返回keycode有没有按下了

TOP

返回列表