Flash AS3教程:小游戏开发实战尝试
https://www.jb51.net/files/media/dirtanke.swf
这几天也写了一些类了,是驴子还是骡子,拿出来遛一遛就知道了,先看这个上面这个flash动画!
一个类似坦克游戏的demo程序
使用direction类来进行方向控制
使用dot类来计算距离
用上direction类和dot类之后,这个demo程序变得异常简单额。。
也没什么好说,主要透过这个例子,让大家类熟悉direction类和dot类的使用方法
不懂的可以在后面跟帖提问,高手如果看到什么有错误的地方,请指正出来,多谢指教
下面是fla的源代码:
code:import index.base.game.direction;
另外注意源代码,有个地方多次对tank的tower属性就行引用,并且返回他的x,y或者旋转值,有人就会问了,as3不是不支持类似mc那样的直接访问显示对象,为什么我这儿却可以?
import index.base.events.directionevent;
import index.base.geom.dot;
//舞台属性设置
stage.showdefaultcontextmenu = false;
stage.align = "tl";
stage.scalemode = "noscale";
//创建坦克
var tank:tank = new tank;
tank.x = tank.y = 250;
addchild(tank);
//创建绑定坦克的点
var dot:dot = new dot;
dot.bind(tank);
//坦克移动
var dirtank:direction = new direction(stage);
//炮台转动
var dirtower:direction = new direction(stage,true,87,83,65,68);
//坦克炮台事件
dirtank.addeventlistener(directionevent.do,dotankfun);
dirtower.addeventlistener(directionevent.do,dotowerfun);
//坦克移动
function dotankfun(e:directionevent):void{
if(e.up){
dot.go(2,true);
}
if(e.down){
dot.go(-2,true);
}
if(e.left){
tank.rotation -= 2;
}
if(e.right){
tank.rotation = 2;
}
if(tank.x < 0) tank.x = 0;
if(tank.y < 0) tank.y = 0;
if(tank.x > stage.stagewidth) tank.x = stage.stagewidth;
if(tank.y > stage.stageheight) tank.y = stage.stageheight;
}
//是否可以发射炮台,子弹
var isbullet:boolean = true;
var isshell:boolean = true;
//炮台发射转动
function dotowerfun(e:directionevent):void{
if(e.up && isbullet){
var bullet:bullet = new bullet;
bullet.x = tank.x;
bullet.y = tank.y;
bullet.rotation = tank.rotation tank.tower.rotation;
bullet.addeventlistener(event.enter_frame,bulletfun);
addchild(bullet);
isbullet = false;
settimeout(function(){isbullet = true},200);
}
if(e.down && isshell){
var shell:shell = new shell;
shell.x = tank.x;
shell.y = tank.y;
shell.rotation = tank.rotation;
shell.addeventlistener(event.enter_frame,shellfun);
addchild(shell);
isshell = false;
settimeout(function(){isshell = true},500);
}
if(e.left){
tank.tower.rotation -= 5;
}
if(e.right){
tank.tower.rotation = 5;
}
}
//炮台
function shellfun(e:event):void{
var tmp:shell = e.currenttarget as shell;
var d:dot = new dot(tmp.x,tmp.y,tmp.rotation);
d.bind(tmp);
d.go(4,true);
if(tmp.x < 0 || tmp.x > stage.stagewidth || tmp.y < 0 || tmp.y > stage.stageheight){
removechild(tmp);
tmp.removeeventlistener(event.enter_frame,shellfun);
}
tmp = null;
d = null;
}
//子弹
function bulletfun(e:event):void{
var tmp:bullet = e.currenttarget as bullet;
var d:dot = new dot(tmp.x,tmp.y,tmp.rotation);
d.bind(tmp);
d.go(5,true);
if(tmp.x < 0 || tmp.x > stage.stagewidth || tmp.y < 0 || tmp.y > stage.stageheight){
removechild(tmp);
tmp.removeeventlistener(event.enter_frame,bulletfun);
}
tmp = null;
d = null;
}
愿意是我把素材绑定在tank类上,并且对tank类做了以下编写:
code:package{
光看这个类,也许你还是不明白,是什么原因,为什么会多出来一个towermc出来,详细的原因,请自己下载提供的源文件,下载下来看看吧。。不懂跟帖问!
import flash.display.sprite;
public class tank extends sprite{
public function tank(){
}
public function get tower():sprite{
return towermc;
}
}
}
点击下载源文件
上一篇: Minor GC&Full GC&Major GC区别及触发条件
下一篇: 钢铁侠发福了