1707/090
AS3-子弹躲避游戏(上)
先来Demo:
游戏本身很简单,本尊是一个日本人做的叫《特训!99》,移动方块不要被球击中即可。
下边说下做法,首先我们需要一个配置参数的类,当然你可以写个XML读取,或者其他的~
package{
public class Config{
public static var STAGE_W:uint = 550;
public static var STAGE_H:uint = 400;
public static var ENEMY_SIZE:uint = 5;
public static var ENEMY_MINSPEED:uint = 1;
public static var ENEMY_MAXSPEED:uint = 3;
public static var ENEMY_COLOR:uint = 0x000000;
public static var ENEMY_TOTAL:uint = 120;
public static var ROLE_SIZE:uint = 10;
public static var ROLE_COLOR:uint = 0x0066cc;
public static var ROLE_SPEED:uint = 5;
}
}
里边的变量名就是代表的含义,就不说明了……
然后就是Enemy的类,也就是黑球,这个类要实现什么功能呢,首先肯定是绘制一个形状对吧,然后呢,就是让这些形状动起来,并且判断冲出屏幕和碰撞Role等情况。这个类差不多是长这个样子:
package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import flash.events.*;
import ascb.util.NumberUtilities;//来自于as3 cook book 的第三方类
import Config;//配置文件 里边存放了游戏的基本参数
import Role;//游戏角色,也就是方块
public class Enemy extends Sprite{
private var _size:uint;//大小
private var _color:uint;//颜色
private var _spdX:Number;//x轴的速度
private var _spdY:Number;//y轴的速度
private var _directionX:int;//x轴移动方向
private var _directionY:int;//y轴移动方向
private var _minSpeed:int;//最小运动速度
private var _maxSpeed:int;//最大运动速度
private var _role:Role;
public function Enemy():void {
init();
drawCircle();
_directionX = randDirection();
_directionY = randDirection();
addEventListener(Event.ENTER_FRAME,run);
}
private function init():void{
//trace(Config.STAGE_W);
//trace(Config.STAGE_H);
_minSpeed = Config.ENEMY_MINSPEED;
_maxSpeed = Config.ENEMY_MAXSPEED;
_spdX = NumberUtilities.random(_minSpeed,_maxSpeed);
_spdY = NumberUtilities.random(_minSpeed,_maxSpeed);
_size = Config.ENEMY_SIZE;
_color = Config.ENEMY_COLOR;
x = randDis()[0];
y = randDis()[1];
}
//开始位置定了4个点
private function randDis():Array{
var aryTmp:Array = [[50,50],[Config.STAGE_W-50,50],[50,Config.STAGE_H-50],[Config.STAGE_W-50,Config.STAGE_H-50]];
var rand = NumberUtilities.random(0,3);
trace(aryTmp[rand]);
return (aryTmp[rand]);
}
//x,y轴的移动方向随机值
private function randDirection():int{
var rand = NumberUtilities.random(0,1);
if(rand){
return 1;
}else{
return -1;
}
//trace(_direction);
}
//绘制圆
private function drawCircle():void{
//trace("drawCircle");
var childCircle:Shape = new Shape();
var halfSize:uint = Math.round(_size / 2);
childCircle.graphics.beginFill(_color);
childCircle.graphics.lineStyle(0,_color);
childCircle.graphics.drawCircle(halfSize, halfSize, halfSize);
childCircle.graphics.endFill();
addChild(childCircle);
}
//enemy的位移控制
public function run(_evt:Event):void {
//trace("run");
x += _spdX * (_directionX);
y += _spdY * (_directionY);
//trace(_spdX * _direction);
//out of stage的时候改变移动方向
if(x< =0 || x>=Config.STAGE_W || y< =0 || y>=Config.STAGE_H){
_spdX = NumberUtilities.random(_minSpeed,_maxSpeed);
_spdY = NumberUtilities.random(_minSpeed,_maxSpeed);
_directionX = randDirection();
_directionY = randDirection();
//本来是打算冲出屏幕就删除的
/*if (parent){
//trace("out of stage");
removeEventListener(Event.ENTER_FRAME,run);
parent.removeChild(this);
}*/
}
hitRole();
}
//判断是否和Role碰撞了
private function hitRole(){
if(hitTestObject(_role)){
Game(root).setGameFlag(true);
}
}
//设置Role
public function setRole(roleObj:Role):void{
_role = roleObj;
}
//game over时的清除操作
public function enemyClear(){
removeEventListener(Event.ENTER_FRAME,run);
}
}
}
然后是Role类,也就是游戏主体方块,这个类很简单,绘制一个Role就可以了:
package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.Graphics;
import Config;
public class Role extends Sprite {
private var _size:uint;
private var _color:uint;
public function Role():void {
init();
}
private function init():void {
_size=Config.ROLE_SIZE;
_color=Config.ROLE_COLOR;
drawRole();
}
private function drawRole():void {
var role:Shape = new Shape();
role.graphics.beginFill(_color);
role.graphics.lineStyle(0, _color);
role.graphics.drawRect(0, 0, _size, _size);
role.graphics.endFill();
addChild(role);
}
public function roleClear(){
if (parent){
parent.removeChild(this);
}
//other code
}
}
}
最后是控制部分,请见这里《AS3-子弹躲避游戏(下)》