最近做了一个纯俯视的射击类游戏,涉及到地图不规则边缘的碰撞检测,也在鼠标操作以及键盘操作飞机上犹豫了一下。现在分别做出鼠标和键盘的飞机操作做个比较,不知道大家偏好那种. 也放出源码和大家分享交流,代码很简单,我接触AS3不久,经验比较少,大家多多指点,共同进步啊。
游戏是纯俯视的,控制飞机,无论是键盘还是鼠标都会运用到三角函数的知识,分别计算出飞机在X轴和Y轴上的速度,然后在游戏的循环函数(ENTER_FRAME或者Timer)里面控制飞机在X轴和Y轴上的增加或者减少,原理大概就是这样的。
下面,先看看SWF演示吧,默认是键盘操作,方向键控制,点击相关按钮切换到鼠标操作,鼠标操作我这里做的其实就是一个简单的跟随.
下边是实现该移动功能的文档类代码,你可以封装成单独的player类去运用.
/**
* 键盘与鼠标控制游戏中的人物
* Author: Vincent chan
* URL: http://www.9stg.com
*/
package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.MouseEvent;
public class IndexDoc extends MovieClip
{
private var player:MovieClip;
private var up:Boolean = false;
private var down:Boolean = false;
private var left:Boolean = false;
private var right:Boolean = false;
private var decay:Number = .95;
private var speedX:Number = 0;
private var speedY:Number = 0;
private var speedZ:Number = .5;
private var speedR:Number = 4;
private var speed:Number = 0;
private var maxSpeed:Number = 10;
private var style:String = “key”;
public function IndexDoc()
{
//初始化UI
initUI();
//初始化事件
initEvent();
}
private function initUI():void
{
player = fly_mc;
this["key_btn"].buttonMode = true;
this["mouse_btn"].buttonMode = true;
}
private function initEvent():void
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUPHandler);
stage.addEventListener(Event.ENTER_FRAME, gameLoop);
this["key_btn"].addEventListener(MouseEvent.CLICK, changeStyle);
this["mouse_btn"].addEventListener(MouseEvent.CLICK, changeStyle);
}
private function changeStyle(e:MouseEvent):void
{
//点击按钮选择鼠标或者键盘模式
switch(e.currentTarget.name)
{
case “mouse_btn”:
style = “mouse”;
break;
case “key_btn”:
style = “key”;
break;
}
}
private function gameLoop(e:Event):void
{
//使用键盘
if(style == “key”)
{
useKey();
}
//使用鼠标
if(style == “mouse”)
{
useMouse();
}
}
private function useKey()
{
//键盘控制player的移动
if(up)
{
speedX += speedZ*Math.sin(player.rotation*(Math.PI/180));
speedY += speedZ*Math.cos(player.rotation*(Math.PI/180));
player.gotoAndStop(2);
}
else
{
speedX *= decay;
speedY *= decay;
player.gotoAndStop(1);
}
speed = Math.sqrt((speedX*speedX)+(speedY*speedY));
if( speed > maxSpeed )
{
speedX *= maxSpeed/speed;
speedY *= maxSpeed/speed;
}
player.y -= speedY;
player.x += speedX;
//控制player的角度
if(right)
{
player.rotation += speedR;
}
if(left)
{
player.rotation -= speedR;
}
//player越界处理
if( player.y < 0 ){
player.y = stage.stageHeight;
}
if( player.y > stage.stageHeight ){
player.y = 0;
}
if( player.x < 0 ){
player.x = stage.stageWidth;
}
if( player.x > stage.stageWidth ){
player.x = 0;
}
}
private function useMouse():void
{
var dx : Number = mouseX – player.x;
var dy : Number = mouseY – player.y;
player.x += dx/10;
player.y += dy/10;
var angle : Number = Math.atan2(dy, dx) * 180 / Math.PI;
player.rotation = angle + 90;
}
private function keyDownHandler(e:KeyboardEvent):void
{
switch( e.keyCode )
{
case Keyboard.UP:
up = true;
break;
case Keyboard.DOWN:
down = true;
break;
case Keyboard.LEFT:
left = true;
break;
case Keyboard.RIGHT:
right = true;
break;
}
}
private function keyUPHandler(e:KeyboardEvent):void
{
switch( e.keyCode )
{
case Keyboard.UP:
up = false;
break;
case Keyboard.DOWN:
down = false;
break;
case Keyboard.LEFT:
left = false;
break;
case Keyboard.RIGHT:
right = false;
break;
}
}
}
}
2,250 人关注





