欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flash AS3教程:小游戏开发实战尝试

程序员文章站 2022-04-08 19:21:23
前面讲解了Flash AS3教程:Direction类和Dot类,前面都是理论的讲解,这篇来一个实战,做一个类似坦克游戏的程序。 http://www.webjx.com/files/media/dirtanke.swf 这几天也写了... 08-10-06...
前面讲解了flash as3教程:direction类和dot类,前面都是理论的讲解,这篇来一个实战,做一个类似坦克游戏的程序。
https://www.jb51.net/files/media/dirtanke.swf
这几天也写了一些类了,是驴子还是骡子,拿出来遛一遛就知道了,先看这个上面这个flash动画!

一个类似坦克游戏的demo程序
使用direction类来进行方向控制
使用dot类来计算距离
用上direction类和dot类之后,这个demo程序变得异常简单额。。
也没什么好说,主要透过这个例子,让大家类熟悉direction类和dot类的使用方法
不懂的可以在后面跟帖提问,高手如果看到什么有错误的地方,请指正出来,多谢指教

下面是fla的源代码:

code:
import index.base.game.direction;
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的tower属性就行引用,并且返回他的x,y或者旋转值,有人就会问了,as3不是不支持类似mc那样的直接访问显示对象,为什么我这儿却可以?
愿意是我把素材绑定在tank类上,并且对tank类做了以下编写:

code:
package{

import flash.display.sprite;

public class tank extends sprite{

public function tank(){

}

public function get tower():sprite{
return towermc;
}
}
}
光看这个类,也许你还是不明白,是什么原因,为什么会多出来一个towermc出来,详细的原因,请自己下载提供的源文件,下载下来看看吧。。不懂跟帖问!
点击下载源文件