1.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 = 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倍)。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值