坦克 史书尧.docx
《坦克 史书尧.docx》由会员分享,可在线阅读,更多相关《坦克 史书尧.docx(21页珍藏版)》请在冰豆网上搜索。
坦克史书尧
武汉理工大学华夏学院
课程设计
课程名称《多媒体技术应用》课程设计
题目坦克游戏
专业软件工程
班级2081
学号1022*******
姓名史书尧
成绩__________________
指导教师张玉蓉
2010年6月14日至2010年6月18日
1.打开使用flash编辑器制作一个坦克。
利用填色工具,矩形框工具等制作坦克模型,步骤如下:
1.1画出机身:
1.2画出轮子的组合,并制作成一个小动画,让轮子有颤动的迹象(使用逐帧动画),最后将轮子转化为元件:
1.3将轮子和坦克组合,这样我方的坦克就做好了
2.制作敌机:
只将我方坦克颜色(机身,和其他部分组成部位颜色改换一下)即可,构成图如下:
制作时的相关图层:
轮子部分:
炮身部分:
3.制作子弹:
3.1制作子弹飞出时的火焰(使用放射性颜色,颜色处可以使用ALPHA减淡)
3.2使用放射性黑白色画
3.3画出炮头:
使用椭圆工具(红色)画出炮头,并离散,使之被炮身覆盖
4.制作爆炸效果:
使用ALPHA和色彩渐变制作逐帧动画:
这样,基本所有的元件就做好了
2打开flashbuilder开始编辑代码
相关代码如下:
FOE类:
packagecom.wepull.tank
{
importflash.display.MovieClip;
importflash.events.Event;
importflash.events.KeyboardEvent;
importmx.controls.Alert;
importmx.controls.SWFLoader;
importmx.core.Application;
importmx.core.UIComponent;
importmx.events.FlexEvent;
publicclassFoeextendsUIComponent
{
/*加载外观*/
//定义外部swf文件的加载器
publicvarswfload:
SWFLoader=newSWFLoader();
//外观
publicvardisplay:
MovieClip;
//速度
publicvarsp:
Number=3;
//方向
publicvarasp:
String="";//U:
上R:
右D:
下L:
左
publicfunctionFoe()
{
randomAsp();
//利用外部文件加载器加载文件
//添加监听当对象构件完成后调用complete方法
addEventListener(FlexEvent.CREATION_COMPLETE,complete);
}
publicfunctioncomplete(e:
FlexEvent):
void{
swfload.source="clips/dj.swf";
swfload.addEventListener(Event.COMPLETE,swfloaded);
addChild(swfload);
}
publicfunctionswfloaded(e:
Event):
void{
display=swfload.contentasMovieClip;
addChild(display);
display.gotoAndStop
(1);
stage.addEventListener(Event.ENTER_FRAME,onflush);
}
publicfunctiononflush(e:
Event):
void{
reset();
//根据坦克的方向移动
if(asp=="U"){//向上
display.gotoAndStop
(1);
this.y-=sp;
}elseif(asp=="R"){//向右
display.gotoAndStop
(2);
this.x+=sp;
}elseif(asp=="D"){//向下
display.gotoAndStop(3);
this.y+=sp;
}elseif(asp=="L"){//向左
display.gotoAndStop(4);
this.x-=sp;
}
}
//越界的敌军重置,重新出现
publicfunctionreset():
void{
if(this.x<0||this.x>1000||this.y<0||this.y>1000){//越界
randomAsp();//随机定方向
this.x=0;
this.y=0;
}
}
//敌军被打中后
publicfunctiongoout():
void{
this.x=-10000;
this.y=-10000;
}
//随机定方向
publicfunctionrandomAsp():
void{
vari:
int=Math.random()*4;//随机函数随机出来的数在0和1之间
if(i==0){
this.asp="U";
}elseif(i==1){
this.asp="R";
}elseif(i==2){
this.asp="D";
}elseif(i==3){
this.asp="L";
}
}
}
}
Bullet类:
packagecom.wepull.tank
{
importflash.display.MovieClip;
importflash.events.Event;
importflash.events.TimerEvent;
importflash.utils.Timer;
importmx.controls.SWFLoader;
importmx.core.UIComponent;
importmx.events.FlexEvent;
publicclassBulletextendsUIComponent
{
//外部文件加载器
publicvarswfload:
SWFLoader=newSWFLoader();
//外观
publicvardisplay:
MovieClip;
//速度
publicvarsp:
Number=25;
//方向
publicvarasp:
String="";
//是否可用false为不可用
publicvaruseable:
Boolean=true;
//控制爆炸效果
publicvartimer:
Timer=newTimer(50,4);
publicfunctionBullet()
{
addEventListener(FlexEvent.CREATION_COMPLETE,complete);
//定时器时间到后执行ontimer方法
timer.addEventListener(TimerEvent.TIMER,ontimer);
}
publicfunctionontimer(e:
TimerEvent):
void{
if(timer.currentCount==1){//timer第一次
display.gotoAndStop(5);
}elseif(timer.currentCount==timer.repeatCount){
display.nextFrame();
}elseif(timer.currentCount>1&&timer.currentCountdisplay.gotoAndStop(8);
this.goout();//移除
}
}
//开始加载swf文件
publicfunctioncomplete(e:
FlexEvent):
void{
swfload.source="clips/fd.swf";//指定加载文件
swfload.addEventListener(Event.COMPLETE,swfloaded);
this.addChild(swfload);
}
//swf文件加载完成后
publicfunctionswfloaded(e:
Event):
void{
display=swfload.contentasMovieClip;
display.gotoAndStop
(1);
this.addChild(display);
stage.addEventListener(Event.ENTER_FRAME,onflush);
}
publicfunctiononflush(e:
Event):
void{
ifgoout();//监测是否越界
//跟据方向和速度移动
if(asp=="U"){//向上
display.gotoAndStop
(1);
this.y-=sp;
}elseif(asp=="R"){//向右
display.gotoAndStop
(2);
this.x+=sp;
}elseif(asp=="D"){//向下
display.gotoAndStop(3);
this.y+=sp;
}elseif(asp=="L"){//向左
display.gotoAndStop(4);
this.x-=sp;
}
}
publicfunctionblast():
void{
this.asp="";//先让子弹停下
timer.reset();//重置定时器
timer.start();//启动定时器
}
//如果子弹越界就让子弹重置可用状态
publicfunctionifgoout():
void{
if(this.x<0||this.x>1000||this.y<0||this.y>1000){//越界
goout();//回收
}
}
//把子弹放到看不见的地方
publicfunctiongoout():
void{
this.useable=true;//设置为可用状态
this.x=10000;
this.y=10000;
}
}
}
packagecom.wepull.tank
{
importflash.display.MovieClip;
importflash.events.Event;
importflash.events.KeyboardEvent;
importmx.controls.Alert;
importmx.controls.SWFLoader;
importmx.core.Application;
importmx.core.UIComponent;
importmx.events.FlexEvent;
publicclassTankextendsUIComponent
{
//移动方法发射子弹方法被击中爆炸外观
/*加载外观*/
//定义外部swf文件的加载器
publicvarswfload:
SWFLoader=newSWFLoader();
//外观
publicvardispaly:
MovieClip;
//速度
publicvarsp:
Number=10;
//方向
publicvarasp:
String="";//U:
上R:
右D:
下L:
左
//炮口方向
publicvarfireasp:
String="U";
//弹夹
publicvarbularr:
Array=newArray();
publicfunctionTank()
{
super();
//利用外部文件加载器加载文件
//添加监听当对象构件完成后调用complete方法
addEventListener(FlexEvent.CREATION_COMPLETE,complete);
}
/*指定加载文件路径并且添加加载完成事件*/
publicfunctioncomplete(e:
FlexEvent):
void{
swfload.source="clips/wj.swf";
swfload.addEventListener(Event.COMPLETE,swfloaded);
addChild(swfload);
}
publicfunctionswfloaded(e:
Event):
void{
dispaly=swfload.contentasMovieClip;
addChild(dispaly);//加载外观
dispaly.gotoAndStop
(1);//让影片剪辑转到第1帧并停止
//--每次进入新的帧就调用刷新方法
stage.addEventListener(Event.ENTER_FRAME,onflush);
//添加键盘监听键盘按下的时候
stage.addEventListener(KeyboardEvent.KEY_DOWN,onkey);
//监听键盘弹起
stage.addEventListener(KeyboardEvent.KEY_UP,onkeyend);
initBul();//初始化弹夹
}
publicfunctiononflush(e:
Event):
void{
//根据坦克的方向移动
if(asp=="U"){//向上
dispaly.gotoAndStop
(1);
this.y-=sp;
}elseif(asp=="R"){//向右
dispaly.gotoAndStop
(2);
this.x+=sp;
}elseif(asp=="D"){//向下
dispaly.gotoAndStop(3);
this.y+=sp;
}elseif(asp=="L"){//向左
dispaly.gotoAndStop(4);
this.x-=sp;
}
}
/**开火方法
*产生子弹,给子弹一个方向
*把子弹放到application中
**/
publicfunctionfire():
void{
varbul:
Bullet=getBul();
bul.useable=false;//发送出去的子弹不可用
bul.asp=this.fireasp//子弹方向与坦克炮口方向同步
bul.x=this.x;
bul.y=this.y;
//获得主application
varapp:
Application=this.parentApplicationasApplication;
app.addChild(bul);
}
//得到子弹
publicfunctiongetBul():
Bullet{
varb:
Bullet;
for(vari:
int=1;i<=50;i++){
vartemp:
Bullet=bularr[i]asBullet;//根据i得到子弹
if(temp.useable==true){//是否可用
b=temp;
returnb;
}
}
returnb;
}
/**
*a-->65
*w-->87
*d-->68
*s-->83
*j-->74
**/
publicfunctiononkey(e:
KeyboardEvent):
void{
varkey:
int=e.keyCode;
//Alert.show(String(key));
if(key==87){//往上走
asp="U";
fireasp="U";//更新炮口方向
}elseif(key==68){//向右
asp="R";
fireasp="R";//更新炮口方向
}elseif(key==83){//向下
asp="D";
fireasp="D";//更新炮口方向
}elseif(key==65){//向左
asp="L";
fireasp="L";//更新炮口方向
}elseif(key==74){//开火
fire();
}
}
//键盘弹起方向无
publicfunctiononkeyend(e:
KeyboardEvent):
void{
asp="";
}
/**对弹夹初始化
*产生子弹并放到弹夹
*同时添加到application中
**/
publicfunctioninitBul():
void{
varapp:
Application=this.parentApplicationasApplication;
for(vari:
int;i<=50;i++){
varb:
Bullet=newBullet();//产生一个子弹
b.goout();//移除到看不见的地方
bularr.push(b);//把子弹放入弹夹
app.addChild(b);
}
}
}
}
主代码:
xmlversion="1.0"encoding="utf-8"?
>
ApplicationapplicationComplete="init(event)"xmlns:
mx="layout="absolute"minWidth="955"minHeight="600">
Style>
Application{
background-image:
Embed("imgs/bg.png");
background-repeat:
repeat;
background-position:
center;
background-blend:
multiply;
borderSkin:
ClassReference("com.degrafa.skins.CSSSkin");
}
Style>
Script>
[CDATA[
importcom.wepull.tank.Bullet;
importcom.wepull.tank.Foe;
importcom.wepull.tank.Tank;
importmx.controls.Alert;
importmx.core.UIComponent;
importmx.events.FlexEvent;
publicvartank:
Tank=newTank();//产生坦克实例
publicvarf:
Foe=newFoe();
protectedfunctioninit(event:
FlexEvent):
void
{
this.addChild(tank);//将坦克实例加载到application中
tank.x=0;
tank.y=200;
this.addChild(f);
stage.addEventListener(Event.ENTER_FRAME,onflush);
}
publicfunctiononflush(e:
Event):
void{
vararr:
Array=tank.bularr;//所有子弹
for(vari:
Number=1;ivarbul:
Bullet=arr[i]asBullet;
if(bul!
=null&&bul.useable==false){
if(ifhit(bul,f)){
bul.blast();//爆炸
//bul.goout();//回收
f.goout();
//Alert.show("相撞!
");
}
}
}
}
/*检测两个对像是否相撞*/
publicfunctionifhit(o1:
UIComponent,o2:
UIComponent):
Boolean{
varm_x:
Number=Math.abs(o1.x-o2.x);//两个对象x轴的差值
varm_y:
Number=Math.abs(o1.y-o2.y);//两个对象y轴的差值
if(m_x<50&&m_y<50){//相撞
returntrue;
}
returnfalse;
}
]]>
Script>
Applicati