作者cjcat2266 (CJ Cat)
看板Flash
标题Re: [心得] 小朋友下楼梯
时间Thu Feb 16 02:35:54 2012
※ 引述《HsuanTang (HsuanTang)》之铭言:
: 但操作起来
: 它会先卡住一下 然後才连续移动
: 有点不太顺畅
其实这种游戏操作已经有种算是标准的监听方式了
"每次侦测到key down事件的时候移动一次"
会因为使用者的键盘硬体限制和软体设定而产生不同效果
所以应该要 "每个frame侦测一次按键状态,若被按下则移动"
然後利用监听key down/up事件来更新按键状态
var leftIsDown:Boolean = false;
var rightIsDown:Boolean = false;
function onKeyDown(e:KeyboardEvent):void
{
switch (e.keyCode)
{
case Keyboard.LEFT : leftIsDown = true; break;
case Keyboard.RIGHT: rightIsDown = true; break;
}
}
function onKeyUp(e:KeyboardEvent):void
{
switch (e.keyCode)
{
case Keyboard.LEFT : leftIsDown = false; break;
case Keyboard.RIGHT: rightIsDown = false; break;
}
}
function onEnterFrame(e:Event):void
{
var dx:Number = 0;
if (leftIsDown ) dx -= SPEED;
if (rightIsDown) dx += SPEED;
object.x += dx;
}
当然,要监听所有按键,可以用个Array、Dictionary、或Object来储存所有按键状态
我之前有写一个简单的Key class,可以参考看看
http://cjcat.googlecode.com/svn/trunk/src/idv/cjcat/ui/Key.as
另外,也可以额外提供函式让使用者询问 "按键是否在上一个frame被按下/放开"
这样的话需要提供一个udpate()函式,并且要求使用者每个frame开始的时候呼叫一次
可以参考Rusher 2 Game Engine的Keyboard.isPressed()和isReleased()
http://rusher.googlecode.com/svn/trunk/src/idv/cjcat/rusher/ui/Keyboard.as
另外一种做法是储存两个大小约为256(最大key code)的Array
分别用来储存当前和目前的frame的按键状态
如果同一个键的状态在两个Array中的值不同
就表示该键在上一个frame被按下或放开
以上
--
Blog
http://blog.cjcat.net
Gallery
http://cjcat2266.deviantart.com
ptt2 Board CJWorkshop
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 72.5.59.140
1F:推 dsmwang:cjcat!! 02/16 02:57
2F:推 HsuanTang:flash的dynamic variable真的好奇妙 02/16 21:18
3F:→ HsuanTang:之前不知道有Dictionary这种东西耶 等等来用用看 02/16 21:19
4F:→ HsuanTang:谢谢cjcat! 02/16 21:20