返回列表 回复 发帖

我用AS3.0写键盘控制的问题

我用AS3.0写键盘控制的问题,遇到了问题。他检查的是返回值。可以这样就造成了动作迟缓。
请高手指点下,怎么解决阿?还有“包”的问题。“包”到底应该怎么应用? 复制内容到剪贴板
代码:
修改过的影片:http://pub.xfla.net/up/1191414604.swf

  1. stage.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown);
  2. stage.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp);

  3. function reportKeyDown(event:KeyboardEvent):void {

  4.         if (event.keyCode == Keyboard.RIGHT) {
  5.                 mc1.x+=5;
  6.                 mc1.scaleX=1;
  7.         }
  8.         if (event.keyCode == Keyboard.LEFT) {
  9.                 mc1.x-=5;
  10.                 mc1.scaleX=-1;
  11.         }
  12. }

  13. function reportKeyUp(event:KeyboardEvent):void {

  14.         if (event.keyCode == Keyboard.SHIFT) {
  15.                 mc1.gotoAndPlay(6);
  16.         }
  17. }
复制代码



问题出处:http://www.xfla.net/viewthread.php?tid=771&extra=page%3D1

[ 本帖最后由 wch2449 于 2007-10-3 20:35 编辑 ]
想要流畅的话,结合Event.ENTER_FRAME一起使用~
喜帖街my blog
谢谢斑竹  可以给我个 具体的代码吗?
下面是问题影片
http://pub.xfla.net/up/1191393261.swf

[ 本帖最后由 wch2449 于 2007-10-3 15:41 编辑 ]
在线等啊   老大帮帮忙哈
类似这样的:
  1. stage.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown);
  2. stage.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp);
  3. var IFRun:Boolean=false;
  4. var pressKeyList:Array=[];
  5. pressKeyList[Keyboard.RIGHT]={};
  6. pressKeyList[Keyboard.LEFT]={};
  7. pressKeyList["maxN"]=0;
  8. function reportKeyDown(event:KeyboardEvent):void {
  9.         var keyCode:uint=event.keyCode;
  10.         if (pressKeyList[keyCode] && !pressKeyList[keyCode][keyCode]) {
  11.                 trace("++++",keyCode);
  12.                 pressKeyList["maxN"]+=1;
  13.                 pressKeyList[keyCode][keyCode]=true;
  14.         }
  15.         if (!IFRun) {
  16.                 IFRun=true;
  17.                 mc1.addEventListener(Event.ENTER_FRAME,mcEnterFrameHandler);
  18.         }
  19. }
  20. function mcEnterFrameHandler(event:Event):void{
  21.         trace("RUN");
  22.         if (pressKeyList[Keyboard.RIGHT][Keyboard.RIGHT]) {
  23.                 mc1.x+=5;
  24.                 mc1.scaleX=1;
  25.         }
  26.         if (pressKeyList[Keyboard.LEFT][Keyboard.LEFT]) {
  27.                 mc1.x-=5;
  28.                 mc1.scaleX=-1;
  29.         }
  30. }
  31. function reportKeyUp(event:KeyboardEvent):void {
  32.         var keyCode:uint=event.keyCode;
  33.         if (pressKeyList[keyCode] && pressKeyList[keyCode][keyCode]) {
  34.                 pressKeyList[keyCode][keyCode]=false;
  35.                 pressKeyList["maxN"]-=1;
  36.                 if (pressKeyList["maxN"]==0) {
  37.                         mc1.removeEventListener(Event.ENTER_FRAME,mcEnterFrameHandler);
  38.                         IFRun=false;
  39.                 }
  40.         }
  41. }
复制代码
//PS:仅供参考
喜帖街my blog
版主写的那个好高深啊!
我按AS2中的onEnterFrame改成这样了。:L
  1. stage.addEventListener(KeyboardEvent.KEY_DOWN,reportKeyDown);
  2. stage.addEventListener(KeyboardEvent.KEY_UP,reportKeyUp);

  3. var speed:int =new int;
  4. var scale:int=new int;

  5. function reportKeyDown(event:KeyboardEvent):void {
  6.         if (event.keyCode == Keyboard.RIGHT) {
  7.                 mc1.addEventListener(Event.ENTER_FRAME ,onEnterMove);
  8.                 speed=5;
  9.                 scale=1;
  10.         }
  11.         if (event.keyCode == Keyboard.LEFT) {
  12.                 mc1.addEventListener(Event.ENTER_FRAME ,onEnterMove);
  13.                 speed=-5;
  14.                 scale=-1;
  15.         }
  16. }

  17. function reportKeyUp(event:KeyboardEvent):void {
  18.         mc1.removeEventListener(Event.ENTER_FRAME ,onEnterMove);
  19. }

  20. function onEnterMove(e:Event) {
  21.         e.target.x+=speed;
  22.         e.target.scaleX=scale;
  23. }
复制代码
谢谢
两个都不错
但是 上面那个 功能更多
怎么就像不到呢
谢谢:) :)

研究 研究 好好~~~~~~
小弟很小交 学习AS3 的好友  有愿意的可以加我QQ吗?874518889
恩,我的的虽然长了点,主要是加进了多个键的控制,左右同时按,然后松开个,能看出效果~
喜帖街my blog
提示: 作者被禁止或删除 内容自动屏蔽
用Array来填装按键列的方法我昨晚也想到, 但不是J阵营的(老夫是M$.VB.net阵营的) 代码写不出来, 折磨了老夫一个晚上. 今天上来FLASH8求解, 果然没有来错地方.

我先拿代码去试下, 等下反馈
多谢斑竹, 问题解决了. 但请允许我问多几个问题

1. 但是如果我想把这代码单独写进一个AS文件里, 怎么办?
2. 能解释下这几行代码吗?
  1. pressKeyList[Keyboard.RIGHT]={};
  2. pressKeyList[Keyboard.LEFT]={};
  3. pressKeyList["maxN"]=0;
复制代码
  1. if (pressKeyList[keyCode] && !pressKeyList[keyCode][keyCode]) {
  2.                 trace("++++",keyCode);
  3.                 pressKeyList["maxN"]+=1;
  4.                 pressKeyList[keyCode][keyCode]=true;
  5.         }
复制代码
感激不尽

[ 本帖最后由 传说中的大师兄 于 2008-3-3 19:21 编辑 ]
http://www.techbringer.net/flash/agame.swf

我做出来了. 但是我想把KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT换成W, S, A, D, 有没有什么好办法?
那换成对应的键位值就行了

这里用数组来套对象是为了存储相应按键的状态,方便判断
喜帖街my blog
我对这两处很不理解,斑竹给讲讲好吗?
第一个地方是:
pressKeyList["maxN"]=0;
trace(pressKeyList)
看不到什么内容呢?
pressKeyList[Keyboard.RIGHT]={};
pressKeyList[Keyboard.LEFT]={};
把这两句屏蔽了
在trace(pressKeyList) 什么都没有呢?   pressKeyList["maxN"] 到底是指数组那里呢?

下边这个用法能给解释一下吗?
pressKeyList[keyCode][keyCode]  

也不明白,是二维数组? 在数组中怎么看呢?
原帖由 ycccc8202 于 2008-3-3 23:08 发表
那换成对应的键位值就行了

这里用数组来套对象是为了存储相应按键的状态,方便判断
貌似不可以直接改呢, 比如
当我把
  1. pressKeyList[Keyboard.RIGHT]={};
  2. code]

  3. 换成
  4. [code]pressKeyList[event.keyCode == 65]={};
复制代码
就出错, 说是没定义到. 是不是要先导入什么包?
pressKeyList[65]={}

可以这样改~
喜帖街my blog

回复 17# 的帖子

噢!!! 我怎么没想到! 太感谢了
我是用这种办法来解决键盘的移动的,通过键盘侦听配合着enterFrame来一起,

  1. var leftArrow:Boolean=false;
  2. var rightArrow:Boolean=false;
  3. stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownEvent);
  4. stage.addEventListener(KeyboardEvent.KEY_UP,keyUpEvent);
  5. addEventListener(Event.ENTER_FRAME,gunMove);
  6. function keyDownEvent(evt:KeyboardEvent)
  7. {
  8. if (evt.keyCode == Keyboard.LEFT)
  9. {
  10.   leftArrow=true;
  11. } else if (evt.keyCode == Keyboard.RIGHT)
  12. {
  13.   rightArrow=true;
  14. }
  15. }
  16. function keyUpEvent(evt:KeyboardEvent)
  17. {
  18. if (evt.keyCode == Keyboard.LEFT)
  19. {
  20.   leftArrow=false;
  21. } else if (evt.keyCode == Keyboard.RIGHT)
  22. {
  23.   rightArrow=false;
  24. }
  25. }
  26. function gunMove(evt:Event)
  27. {
  28. if (leftArrow && this.x > 20)
  29. {
  30.   this.x-= _speed;
  31. } else if (rightArrow && this.x < 530)
  32. {
  33.   this.x+= _speed;
  34. }
  35. }
复制代码
[ 本帖最后由 gaoxudong2001 于 2008-3-6 09:08 编辑 ]

学习
我没有天份。。但有后天的自信、顽固、拼搏、坚持。。。。。。FLASH技术交流群:56785596
第一个当你左右都按下时  不向左动也不向右动
he++
本帖最后由 hediqing 于 2009-11-19 17:39 编辑

着重于键松开时的判断:
  1. var array_key:Array=[];//按下的键通通进这数组;
  2. var keyCode:uint;//键按下时赋值;
  3. var upCode:uint;//键松开时赋值;

  4. stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyboardEvent);
  5. stage.addEventListener(KeyboardEvent.KEY_UP,remove);

  6. function onKeyboardEvent(event:KeyboardEvent):void {
  7. keyCode=event.keyCode;
  8. array_key[keyCode]=true;//键按下赋值;
  9. stage.addEventListener(Event.ENTER_FRAME,enter_Frame);//按下后开始侦听enterFrame;
  10. }
  11. function remove(event:KeyboardEvent):void {
  12. upCode=event.keyCode;
  13. array_key[upCode]=false;//键松开赋值;
  14. if (ifRun()) {
  15. keyCode=undefined;
  16. stage.removeEventListener(Event.ENTER_FRAME,enter_Frame);
  17. }
  18. }
  19. function ifRun() {//关键的判断
  20. var index:int = array_key.indexOf(true);//遍历数组中是否有按下的键(true即是按下)
  21. if (index==-1) {
  22. return true;
  23. } else {
  24. keyCode=index;
  25. return false;
  26. }

  27. }
  28. function enter_Frame(event:Event):void {
  29. switch (keyCode) {
  30. case Keyboard.UP :
  31. mc1.y -= 10;
  32. break;
  33. case Keyboard.DOWN :
  34. mc1.y += 10;
  35. break;
  36. case Keyboard.LEFT :
  37. mc1.x -= 10;
  38. break;
  39. case Keyboard.RIGHT :
  40. mc1.x += 10;
  41. break;
  42. default :
  43. break;
  44. }
  45. }
复制代码
he++
返回列表