用户通过键盘输入控制物体的运动,是无法简单的通过直线运动来实现的。本小节就来讲解包括斜方向运动在内的可通过键盘控制的物体运动
- 通过键盘输入控制物体运动
根据键盘输入左右移动物体
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip
{
//物体移动速度
private var v:int;
//舞台宽度
private var STAGE_WIDTH:int;
//舞台高度
private var STAGE_HEIGHT:int;
//记录被按下的键
private var boadr:Array = new Array();
public function Main()
{
//舞台宽度
STAGE_WIDTH = stage.stageWidth;
//舞台高度
STAGE_HEIGHT = stage.stageHeight;
//初始化速度
v = 3;
//物体的初始位置
plan.x = STAGE_WIDTH / 2;
plan.y = STAGE_HEIGHT / 2;
//键盘侦听
this.stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
this.stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
this.addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onDown(e:KeyboardEvent)
{
//将按下的键 保存在数组中
boadr[e.keyCode] = true;
}
private function onUp(e:KeyboardEvent)
{
//注销抬起的键
boadr[e.keyCode] = false;
}
private function onFrame(e:Event)
{
//判断按键数组中是否有“左键” 有就移动物体
if (boadr[Keyboard.LEFT])
{
plan.x -= v;
}
//判断按键数组中是否有“右键” 有就移动物体
if (boadr[Keyboard.RIGHT])
{
plan.x += v;
}
}
}
}
- 多个按键输入
接下来让我们尝试使物体不只在左右方向运动,还可以上下方向移动:
使物体可以在上下左右方向运动
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip
{
//物体移动速度
private var v:int;
//舞台宽度
private var STAGE_WIDTH:int;
//舞台高度
private var STAGE_HEIGHT:int;
//记录被按下的键
private var boadr:Array = new Array();
public function Main()
{
//舞台宽度
STAGE_WIDTH = stage.stageWidth;
//舞台高度
STAGE_HEIGHT = stage.stageHeight;
//初始化速度
v = 3;
//物体的初始位置
plan.x = STAGE_WIDTH / 2;
plan.y = STAGE_HEIGHT / 2;
//键盘侦听
this.stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
this.stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
this.addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onDown(e:KeyboardEvent)
{
//将按下的键 保存在数组中
boadr[e.keyCode] = true;
}
private function onUp(e:KeyboardEvent)
{
//注销抬起的键
boadr[e.keyCode] = false;
}
private function onFrame(e:Event)
{
//判断按键数组中是否有“左键” 有就移动物体
if (boadr[Keyboard.LEFT])
{
plan.x -= v;
}
//判断按键数组中是否有“右键” 有就移动物体
if (boadr[Keyboard.RIGHT])
{
plan.x += v;
}
//判断按键数组中是否有“上键” 有就移动物体
if (boadr[Keyboard.UP])
{
plan.y -= v;
}
//判断按键数组中是否有“下键” 有就移动物体
if (boadr[Keyboard.DOWN])
{
plan.y += v;
}
}
}
}
想必物体的上诉运动大家都能想象出来。但问题是物体的速度回如何变化呢?,比如上方向键和左方向键同时被按住时:
plan.y -= v;
plan.x -= v;
这两个运动将同时进行,那么显然物体的速度要比单方向的 v 更快
这种情况下,物体沿斜方向的运动速度究竟是多少呢?
这个时候就需要使用数学上的勾股定理了。
简单的将,勾股定理就是能够通过直角三角形的两条边的长度,计算出剩下一条边的长度。假设直角三角形斜边c,两直角边分别为a、b,那么公式为
c²=a² + b²
由此定理,可知,如果物体在x轴方向的速度为Vx,y轴方向的速度为Vy,那么物体沿斜方向的速度为 V² = Vx²+ Vy²。
由于 x轴 和y轴方向相同 所以 开根号后 物体实际的运动速度大概是物体单方向速度的√2倍。这在很多游戏中是被允许的。
但是,我们试试如何让斜方向运动速度也保持一致吧:
使斜方向运动速度保持不变
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Main extends MovieClip
{
//物体移动速度
private var v:int;
//舞台宽度
private var STAGE_WIDTH:int;
//舞台高度
private var STAGE_HEIGHT:int;
//记录被按下的键
private var boadr:Array = new Array();
public function Main()
{
//舞台宽度
STAGE_WIDTH = stage.stageWidth;
//舞台高度
STAGE_HEIGHT = stage.stageHeight;
//初始化速度
v = 10;
//物体的初始位置 plan 速度在斜方向保持不变
plan.x = STAGE_WIDTH / 2;
plan.y = STAGE_HEIGHT / 2;
//plan1 速度在斜方向为单方向速度的 根号2倍
plan1.x = STAGE_WIDTH / 2;
plan1.y = STAGE_HEIGHT / 2;
//键盘侦听
this.stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
this.stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
this.addEventListener(Event.ENTER_FRAME, onFrame);
}
private function onDown(e:KeyboardEvent)
{
//将按下的键 保存在数组中
boadr[e.keyCode] = true;
}
private function onUp(e:KeyboardEvent)
{
//注销抬起的键
boadr[e.keyCode] = false;
}
private function onFrame(e:Event)
{
//判断按键数组中是否有“左键” 有就移动物体
if (boadr[Keyboard.LEFT])
{
if (boadr[Keyboard.UP] || boadr[Keyboard.DOWN])
{
plan.x -= v / Math.SQRT2;
}
else
{
plan.x -= v;
}
plan1.x -= v;
}
//判断按键数组中是否有“右键” 有就移动物体
if (boadr[Keyboard.RIGHT])
{
if (boadr[Keyboard.UP] || boadr[Keyboard.DOWN])
{
plan.x += v / Math.SQRT2;
}
else
{
plan.x += v;
}
plan1.x += v;
}
//判断按键数组中是否有“上键” 有就移动物体
if (boadr[Keyboard.UP])
{
if (boadr[Keyboard.LEFT] || boadr[Keyboard.RIGHT])
{
plan.y -= v / Math.SQRT2;
}
else
{
plan.y -= v;
}
plan1.y -= v;
}
//判断按键数组中是否有“下键” 有就移动物体
if (boadr[Keyboard.DOWN])
{
if (boadr[Keyboard.LEFT] || boadr[Keyboard.RIGHT])
{
plan.y += v / Math.SQRT2;
}
else
{
plan.y += v;
}
plan1.y += v;
}
}
}
}
如果物体在x轴和y轴方向的速度还是v ,那么斜方向的速度就会变成原来的
√2(1.4142)倍。因此这里将原来的速度乘以1/
√2,斜方向的速度就会仍然保持v不变。但是上面程序只考虑到两个按键同时按下的情况,而没有考虑到三个键同时按下的情况。比如左,上,下同时按下时,上下的运动就会抵消,但是由于上下键被按下,所以左方向的速度就会减少(为原来的1/
√2倍)。