主站
经典论坛
作品集
Think.Pages
博客
维基
桌面
聚合
注册
登录
专长会员
帮助
客服QQ:6650171
经典论坛
»
Flash 8 及之前版本
» 继续AS3的按键侦听问题
‹‹ 上一主题
|
下一主题 ››
发新话题
发布投票
发布商品
发布悬赏
发布活动
发布辩论
发布视频
打印
[编程]
继续AS3的按键侦听问题
tooya
[楼主]
初级会员
帖子
32
体力
76
威望
0
离线
152 天
发短消息
加为好友
1
#
大
中
小
发表于 2006-8-8 22:54
本来还以为又是代码的哪里有问题,但找了半天发现是侦听器的问题(或者是特性)
假如第1次按下并按住某键(这里只与按键顺序有关,至于按什么键不重要)后,第2次又按下并按住某另一个键,这时会有2个键被按下并按住,
然后,松开第2次按的键,并保持第1次按的键扔被按下,这时KEY_DOWN的侦听就会停止
而松开第1次按的键,并保持第2次按的键扔被按下,这时KEY_DOWN的侦听则会继续
这种情况是什么原因?
我想要的是只要有键保持按下状态就执行KEY_DOWN侦听
积分
76
阅读权限
20
在线时间
134 小时
注册时间
2006-8-6
最后登录
2008-3-22
查看详细资料
TOP
做西部数码代理.Cn1元国际45元
mirycat
CK同伈鎖
版主
帖子
4603
体力
12051
威望
362
当前
上海 黄浦
个人网站
发短消息
作品 1
加为好友
打分 13
专长
AS,策划,项目管理
2
#
大
中
小
发表于 2006-8-8 23:42
每一次的键按下和松开是对应的
My blog
中长篇奇幻 - 黄昏国度
积分
12413
阅读权限
100
在线时间
2365 小时
注册时间
2004-10-27
最后登录
2008-8-22
查看个人网站
查看详细资料
TOP
【美橙超级G空间】688元绑定10个子目录
|
500M免费网盘空间,文件永久保留,专业服务高端设计人员
tooya
[楼主]
初级会员
帖子
32
体力
76
威望
0
离线
152 天
发短消息
加为好友
3
#
大
中
小
发表于 2006-8-9 00:37
那么用侦听的方式处理不了复杂按键吗?
AS3又没有Key.isDown,即使自己写个类模拟Key.isDown,检测按键值还是要用到侦听
[
本帖最后由 tooya 于 2006-8-9 00:43 编辑
]
积分
76
阅读权限
20
在线时间
134 小时
注册时间
2006-8-6
最后登录
2008-3-22
查看详细资料
TOP
请大家尊重和保护奥运知识产权。
wolf2999
金牌会员
帖子
1530
体力
3212
威望
4
个人网站
发短消息
加为好友
打分 2
4
#
大
中
小
发表于 2006-8-9 09:08
不用as3..as2的那个同进多键侦听我都没搞懂的.总是不能同进侦听到两个键的.
http://www.wolf2999.cn
积分
3216
阅读权限
90
性别
男
在线时间
455 小时
注册时间
2004-3-9
最后登录
2008-8-22
查看个人网站
查看详细资料
TOP
您知道经典
哪些会员写过书的
吗?
您知道互联网
职业和技能有哪些
吗?
您知道
网站运营核心是什么
吗?
mirycat
CK同伈鎖
版主
帖子
4603
体力
12051
威望
362
当前
上海 黄浦
个人网站
发短消息
作品 1
加为好友
打分 13
专长
AS,策划,项目管理
5
#
大
中
小
发表于 2006-8-9 13:41
键盘只有一副啊 -_-||| 侦听 Key 事件对应整个键盘.. 不是对应键的. 不管是逻辑上还是什么的出现这种情况很正常.
我是用 enterFrame 持续判断解决的... 期待更好的办法
My blog
中长篇奇幻 - 黄昏国度
积分
12413
阅读权限
100
在线时间
2365 小时
注册时间
2004-10-27
最后登录
2008-8-22
查看个人网站
查看详细资料
TOP
tooya
[楼主]
初级会员
帖子
32
体力
76
威望
0
离线
152 天
发短消息
加为好友
6
#
大
中
小
发表于 2006-8-9 15:37
但是用EnterFrame也需要能获得按键值,在没有Key.isDown的情况下还是需要侦听,然后用event.getCode才能获得按键值,还是AS3里有我不知道的方法可以不通过侦听获得按键值
积分
76
阅读权限
20
在线时间
134 小时
注册时间
2006-8-6
最后登录
2008-3-22
查看详细资料
TOP
mirycat
CK同伈鎖
版主
帖子
4603
体力
12051
威望
362
当前
上海 黄浦
个人网站
发短消息
作品 1
加为好友
打分 13
专长
AS,策划,项目管理
7
#
大
中
小
发表于 2006-8-9 18:58
这个是我自己的 Key 类, 未完成状态, 不过配合 onEnterFrame 可以实现对所有键盘的侦听, 我不知道你的代码怎么写的..
Key.as
package MirageSystem.ui { import flash.display.Stage; import flash.events.EventDispatcher; import flash.events.KeyboardEvent; public class Key extends EventDispatcher { /** * 初始化 Key, 传入 stage 对象, 否则无法开始侦听, 在首次使用 Key 前记得跑一下这个函数 * @param stage Stage * */ public static function init (stage:Stage):void { key = new Key(stage); } /** * 检测键是否按下 * * // 检测左上键是否同时按下, 结果存放在 result 中 * var result:Boolean = Key.isDown(Key.UP, Key.LEFT); * @param keyCodes 键码 * @return 如果按下返回 true, 否则 false * */ public static function isDown ( ... keyCodes:Array /* of uint */):Boolean { return key.isDown(keyCodes); } public static function registerKeyActions (action:Function, ... keyCodes:Array /* of uint */):void { } /** * 存放 Key 实例 */ private static var key:Key; /** * 存放已经按下的键 */ private var pressedKeys:Array = new Array(0xFF); /** * 存放最后一个按下的键 */ private var lastPressedKey:uint; /** * 存放 stage 引用 */ private var stage:Stage; /** * 静态类, 这辈子不需要实例化 * @return * */ public function Key (stage:Stage) { this.stage = stage; stage.addEventListener(KeyboardEvent.KEY_DOWN, downHandler); stage.addEventListener(KeyboardEvent.KEY_UP, upHandler); } /** * 检测键是否同时按下 * @param keyCodes 键码 * @return * */ private function isDown (keyCodes:Array /* of uint */):Boolean { var len:int = keyCodes.length; for (var i:int; i < len; i++) { if (! (pressedKeys[keyCodes[i]] as Boolean) ) return false; } return true } private function downHandler(e:KeyboardEvent):void { pressedKeys[e.keyCode] = true; } private function upHandler (e:KeyboardEvent):void { delete pressedKeys[e.keyCode]; } /** * 移除针对 stage 的侦听 * */ private function dispose ():void { stage.removeEventListener(KeyboardEvent.KEY_DOWN, downHandler); stage.removeEventListener(KeyboardEvent.KEY_UP, upHandler); } } }
提示:您可以先修改部分代码再运行
在 enterFrame 事件曲柄中我可以这样判断 2 个键同时按下
if (Key.isDown(Keyboard.ENTER, keyboard.SHIFT))
KeyTest.as
package { import MirageSystem.ui.Key; import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; import flash.ui.Keyboard; public class KeyTest extends Sprite { private var tf:TextField; public function KeyTest () { Key.init(stage); stage.addEventListener("enterFrame", enterFrameHandler); tf = new TextField(); tf.width = 400; tf.multiline = true; tf.wordWrap = true; tf.autoSize = "left"; tf.text = "Shift + 回车按下"; addChild(tf); } private function enterFrameHandler (e:Event):void { tf.visible = Key.isDown(Keyboard.ENTER, Keyboard.SHIFT); } } }
提示:您可以先修改部分代码再运行
刚刚发现, 其实这个类再扩展一下, 同样可以做做到完整的键盘捕获而不用 enterFrame
My blog
中长篇奇幻 - 黄昏国度
积分
12413
阅读权限
100
在线时间
2365 小时
注册时间
2004-10-27
最后登录
2008-8-22
查看个人网站
查看详细资料
TOP
tooya
[楼主]
初级会员
帖子
32
体力
76
威望
0
离线
152 天
发短消息
加为好友
8
#
大
中
小
发表于 2006-8-9 20:44
经过实验,又得出一些结果:
我在自己写的Key类里也用了键盘侦听,在场景里如果也用侦听,则我在1走楼所说的侦听问题仍会出现,但如果用setInterval或EnterFrame循环检测而不用侦听,一切就正常了,但是我想不通, 虽然场景里没用侦听,但Key类里也有侦听,怎么就正常了呢
积分
76
阅读权限
20
在线时间
134 小时
注册时间
2006-8-6
最后登录
2008-3-22
查看详细资料
TOP
mirycat
CK同伈鎖
版主
帖子
4603
体力
12051
威望
362
当前
上海 黄浦
个人网站
发短消息
作品 1
加为好友
打分 13
专长
AS,策划,项目管理
9
#
大
中
小
发表于 2006-8-9 20:49
因为有个数组专门保存按下的键的...
My blog
中长篇奇幻 - 黄昏国度
积分
12413
阅读权限
100
在线时间
2365 小时
注册时间
2004-10-27
最后登录
2008-8-22
查看个人网站
查看详细资料
TOP
‹‹ 上一主题
|
下一主题 ››
版块跳转
内部交流区
网站开发区
前台制作与脚本专栏
后台数据库编程
WEB标准化专栏
WAP 技术专栏
平面设计区
艺术与设计论坛
Adobe Photoshop 专栏
Fireworks 专栏
矢量图形专栏
插画手绘交流
交互设计区
用户体验综合版
UI图形设计
RIA设计与应用
Flash 8 及之前版本
Flash CS3 及 AS3
Silverlight 专版
Director 专栏
其它技术讨论区
计算机技术
英语学习和技术翻译
摄影欣赏与技术交流
无线通讯与数码设备
信息平台
企业招聘
学习工作交流区
创业版