站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2ME 专题Java活动图像程序和游戏编写(2)

Java活动图像程序和游戏编写(2)

摘要: Java活动图像程序和游戏编写(2)
<tr><td>
http:///tech/article794.html
三 小方块变成动画卡通.
现在我们增强程序功能.没有人愿意看到他控制的对象是一个呆板小方块.程序改动后,小方块将有如下变化: 用户不按下任何控制键,小方块静止,但它周期性的改变自己的图样.此后,我们不再把我们控制的对象叫小方块,而叫小卡通"格格".用户按下方向键后,格格的样子变成指向那个方向的箭头.
首先读者用PhotoShop之类的图像处理软件生成下面八个图片.注意:图片大小都是10 X 10点,带有如本文所示一样的Alpha通道(Alpha通道的黑色部分将使图片的对应部分透明,从而不被显示出来,这样背景就可见了),用GIF格式存盘.这些图片就是格格移动时的显示图片.图片的文件名就用相应图片下面的.
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
向上图片 Alpha通道 右上图片 Alpha通道 向右图片 Alpha通道 右下图片 Alpha通道
[] up.gif up_right.gif right.gif down_right.gif

|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
向下图片 Alpha通道 左下图片 Alpha通道 向左图片 Alpha通道 左上图片 Alpha通道
down.gif down_left.gif left.gif up_left.gif
[] 然后读者再用PhotoShop之类的图像处理软件生成下面两个图片.图片大小都是20 X 20点,同样带有Alpha通道.用GIF格式存盘,这是格格静止时的显示图片,它们被交替显示以形成动画效果.图片的文件名就用相应图片下面的.
|||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| |||||||
[]格格图片1 Alpha通道 格格图片2 Alpha通道
center_open.gif center_close.gif
格格静止时画面的处理很简单.假如格格现在的位置和刚才相同,表示格格静止.此时,过一段时间,就更换格格的图片.格格的样子就会周期性的改变形成动画效果.
移动时判断就不好办了.用户可能按下一个,两个,甚至三个方向键,四个方向一加组合,可能性太多,很难根据那个方向键被按下了来选择应该显示那个图片.我们用如下技巧解决问题: 用格格现在的位置和刚才的位置比较,现在的位置在刚才位置的右边,说明格格在向右移动,就选择向右的图片显示;在右上方,说明格格在向右上方移动,就选择向右上方的图片显示,等等.这样,最多只有八种可能,便于处理了.相信读者会有办法让格格移动时也显示动画图像.
然后问题就来了.画面被显示的同时,程序又在改变它,于是画面闪烁.这时程序必须使用双缓冲技术.双缓冲的含义是:你在内存中开辟一片区域作为后台画面,程序对它更新,修改,完成后,再显示它.这样,被显示的图像永远是已经完全画好的图像,程序修改的也不是正在被显示的图像.双缓冲技术可以完全解决图像的闪烁问题.
读者可以这样使用双缓冲技术:
1.使用 Image 类的 CreatImage(int weith, int heigh) 创建后台图像.
如: Image off_screen_buffer= null;
off_screen_buffer=createImage(400,350);//创建宽为400点,高为300点的图像.
2.使用 Graphics 类的getGraphics()取图形设备环境.
如: Graphics off_screen=off_screen_buffer.getGraphics();
3.在此图形设备环境上画图,这时是画在后台图像上的.
如: off_screen.drawImage(back_ground,0,0,this);
4.显示.假如当前图形设备环境是g.
如: g.drawImage(off_screen_buffer);
并不复杂,对不对?
下面给出程序.依然配合上面的HTML在浏览器中运行.为使程序容易被理解,笔者依然给出全部的程序码.
import java.awt.*;
import java.applet.*;
public class wumin1 extends Applet
[]{;
carton carton_1=null;//声明一个carton类的实例.
public void start()
{;
if (carton_1==null)//假如未初始化
{;
carton_1=new carton(getGraphics(),this);//初始化?
carton_1.start();//启动?
};
};
public void stop()
{;
carton_1.stop();//停止?
[] carton_1=null;//释放资源?
};
//键被按下事件的处理.
public boolean keyDown(Event e,int key)
{;
if (key==Event.UP)//假如是向上键被按下
[] carton_1.set_direction(0);//向上的布尔变量置true
if (key==Event.DOWN)//假如是向下键被按下
carton_1.set_direction(1);//向下的布尔变量置true
if (key==Event.LEFT)//假如是向左键被按下
carton_1.set_direction(2);//向左的布尔变量true
if (key==Event.RIGHT)//假如是向右键被按下
carton_1.set_direction(3);//向右的布尔变量置true
return true;
};
//键被松开事件的处理.
public boolean keyUp(Event e,int key)
{;
if (key==Event.UP)//假如是向上键被松开
carton_1.clear_direction(0);//向上的布尔变量置false
if (key==Event.DOWN)//假如是向下键被松开
carton_1.clear_direction(1);//向下的布尔变量置false
if (key==Event.LEFT)//假如是向左键被松开
carton_1.clear_direction(2);//向左的布尔变量置false
if (key==Event.RIGHT)//假如是向右键被松开
carton_1.clear_direction(3);//向右的布尔变量置false
return true;
};
};
//格格所属类的描述
class carton extends Thread//从Thread类派生
{;
Graphics g,off_screen=null;//g是当前的图形设备环境,off_screen是后台缓冲区图形设备环境
[] boolean up=false,down=false,left=false,right=false;//四个方向布尔变量
boolean img_now_switch=true;//图片切换开关.
int position_x=200,position_y=150,pos_x,pos_y;//(position_x,position_y)是格格当前位置,(pos_x,pos_y)是刚才的位置
int img_now_switch_count=0;//格格图片切换计数.到一定值就切换
[] int img_now_switch_count_top=30;//切换值.图片切换计数到此值,就切换
Image img_center_close,img_center_open,img_up,img_down,img_left;
Image img_right,img_up_left,img_up_right,img_down_left,img_down_right;//全部的图片
Image img_now;//现在要显示的图片(当前图片).它会改变的
Image off_screen_buffer=null;//后台图形缓冲
Applet applet;
int sleep_time=5;
Color my_color;
//初始化时要将各种环境准备好
public carton(Graphics a,Applet app)
{;
g=a;
applet=app;
//下面把所有要用的图片调入
img_center_close=applet.getImage(applet.getCodeBase(),"center_close.gif");
img_center_open=applet.getImage(applet.getCodeBase(),"center_open.gif");
img_up=applet.getImage(applet.getCodeBase(),"up.gif");
img_down=applet.getImage(applet.getCodeBase(),"down.gif");
img_left=applet.getImage(applet.getCodeBase(),"left.gif");
img_right=applet.getImage(applet.getCodeBase(),"right.gif");
img_up_left=applet.getImage(applet.getCodeBase(),"up_left.gif");
img_up_right=applet.getImage(applet.getCodeBase(),"up_right.gif");
img_down_left=applet.getImage(applet.getCodeBase(),"down_left.gif");
img_down_right=applet.getImage(applet.getCodeBase(),"down_right.gif");
//设置当前图片
img_now=img_center_open;
//创建后台缓冲区,并取其图形设备环境
off_screen_buffer=applet.createImage(400,350);
off_screen=off_screen_buffer.getGraphics();
};
//这是主运行函数.
public void run()
{;
while(true)//此函数一直运行
{;
set_position();//计算格格的坐标
select_image();//选择当前图片
draw_image();//画格格

try//标准的暂停方式
{;
sleep(sleep_time);
};
catch(InterruptedException e)
{;
};
};
};

//计算格格的坐标
[] public void set_position()
{;
//首先保留当前位置坐标值
pos_x=position_x;
pos_y=position_y;
if(up==true && position_y>1)//假如向上的键被按下并且小方块的纵坐标大于1
position_y--;//小方块向上移动
if(down==true && position_y<330)//假如向下的键被按下并且小方块的纵坐标小于330
position_y++;//小方块向下移动
if(left==true && position_x>1)//假如向左的键被按下并且小方块的横坐标大于1
position_x--;//小方块向左移动
if(right==true && position_x<380)//假如向右的键被按下并且小方块的横坐标小于380
position_x++;//小方块向右移动
};
//画屏幕
public void draw_image()
[] {;
my_color=new Color(179,179,179);
off_screen.setColor(my_color);
off_screen.fillRect(0,0,400,350);//在后台画背景
off_screen.drawImage(img_now,position_x,position_y,applet);//在后台画格格
g.drawImage(off_screen_buffer,0,0,applet);//送到前景显示
[] };

//选择图片
[] public void select_image()
{;
//假如格格没有动
if(position_x==pos_x && position_y==pos_y)
{;
img_now_switch_count++;//切换计数加1
if (img_now_switch_count==img_now_switch_count_top)//计数到了切换值
{;
img_now_switch=!img_now_switch;//切换标志取反
[] img_now_switch_count=0;//切换计数清零
};
//切换标志为true,选择img_center_open去显示;为false,选择img_center_close去显示
img_now=(img_now_switch)?img_center_open:img_center_close;
};
if(position_x==pos_x && position_y img_now=img_up;//选择img_up去显示
if(position_x>pos_x && position_y img_now=img_up_right;//选择img_up_right去显示
if(position_x>pos_x && position_y==pos_y)//格格现在的位置在刚才位置的右方
img_now=img_right;//选择img_right去显示
if(position_x>pos_x && position_y>pos_y)//格格现在的位置在刚才位置的右下方
img_now=img_down_right;//选择img_down_right去显示
if(position_x==pos_x && position_y>pos_y)//格格现在的位置在刚才位置的下方
[] img_now=img_down;//选择img_down去显示
if(position_xpos_y)//格格现在的位置在刚才位置的左下方
img_now=img_down_left;//选择img_down_left去显示
if(position_x img_now=img_left;//选择img_left显示
[] if(position_x img_now=img_up_left;//选择img_up_left去显示
};

//表示格格移动方向的布尔变量的置位方法
public void set_direction(int direction_)
{;
switch(direction_)
{;
case(0)://向上键被按下则向上的布尔变量置true
up=true;
break;
case(1)://向下键被按下则向下的布尔变量true
down=true;
break;
case(2)://向左键被按下则向左的布尔变量true
left=true;
break;
case(3)://向右键被按下则向右的布尔变量置true
right=true;
[] break;
default:
[] break;
};
};
//表示格格移动方向的布尔变量的清零方法
public void clear_direction(int direction_)
[] {;
switch(direction_)
{;
[] case(0)://向上键被松开则向上的布尔变量置false
up=false;
[] break;
case(1)://向下键被松开则向下的布尔变量置false
down=false;
break;
case(2)://向左键被松开则向左的布尔变量置false
left=false;
break;
case(3)://向右键被松开则向右的布尔变量置false
[] right=false;
break;
default:
break;
};
};
};

四 格格会开枪了
格格跑来跑去可以做点事情了.让我们把她武装起来.现在她有一把枪,可以向运动方向设击.用户每松开一次空格键(不是按下!不过要是读者愿意,可以改成按下:开枪速度会快很多,机关枪!),格格开一枪.
处理子弹有点麻烦.首先程序事先不知道会有几颗子弹要处理,其次,可能先发射的子弹还在屏幕上,但后发射的就已经越出屏幕边界或击中目标不要处理了.
用链表算法处理子弹倒是很方便.开一枪,加入一个节点,有一个子弹越出屏幕边界,就删除相应节点.但链表编程算法难度大,为使初学者易于理解,笔者没有用.其实还有比链表更好的方法,假如设计一个子弹类,每个子弹是一个实例,实例终止的条件是子弹击中目标或越出屏幕边界,这样更好.但笔者的目的是在本文中尽量提供更多的算法,因此象下面这样处理:
程序中当用户松开空格键后,要求开枪的布尔变量置位.随后如果格格在移动,就向纪录子弹状态的的数组加入一个元素(格格静止时,程序不知道向哪个方向射击,故不准开枪),记下这颗子弹的初始位置和方向,同时子弹计数加一.
子弹越出屏幕边界后,删除纪录这颗子弹位置的元素,同时后面的元素向前移动,填补空缺,因此纪录子弹位置的数组总是"密集"的.随后,子弹计数减一.
比如,数组中有0,1,2,3,4号元素,说明有5颗子弹.第二颗(1号)子弹越出屏幕边界后,2,3,4号元素会向前移动,因此,数组变为拥有0,1,2,3号元素.其中0号元素和原来一样,1号元素的内容是原来2号元素的内容,2号元素的内容是原来3号元素的内容,依此类推.程序会依次处理每一颗子弹,每发现某颗子弹越出屏幕边界或击中目标,就去掉它,同时将它后面的子弹数据前移来填补这个空缺.
下面是子弹的图像和新的程序码.子弹图像的幅面是10 X 10点.同时引入了声音.要注意的是,声音必须是.au格式的,同时,持续时间以不超过1秒为好.背景音乐可以长一些,自己选.
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
子弹向上图片 Alpha通道 子弹右上图片 Alpha通道 子弹向右图片 Alpha通道 子弹右下图片 Alpha通道
bullet_up.gif bullet_up_right.gif bullet_right.gif bullet_down_right.gif

[]|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
|||||||| ||||||| ||||||| ||||||| ||||||| ||||||| ||||||| |||||||
子弹向下图片 Alpha通道 子弹左下图片 Alpha通道 子弹向左图片 Alpha通道 子弹左上图片 Alpha通道
[]bullet_down.gif bullet_down_left.gif bullet_left.gif bullet_up_left.gif
import java.awt.*;
[]import java.applet.*;
public class wumin1 extends Applet
{;
carton carton_1=null;//声明一个carton类的实例.
AudioClip back_ground_music;//声明一个声音实例.这是背景音乐
public void init()
{;
back_ground_music=getAudioClip(getCodeBase(),"spacemusic.au");
[] back_ground_music.loop();//背景音乐循环播放
};
public void start()
{;
if (carton_1==null)//假如未初始化
{;
carton_1=new carton(getGraphics(),this);//初始化
carton_1.start();//启动
};
};
public void stop()
{;
carton_1.stop();//停止
carton_1=null;//释放资源
back_ground_music.stop();//背景音乐停止
};
//键被按下事件的处理.
public boolean keyDown(Event e,int key)
{;
if (key==Event.UP)//假如是向上键被按下
carton_1.set_direction(0);//向上的布尔变量置true
if (key==Event.DOWN)//假如是向下键被按下
carton_1.set_direction(1);//向下的布尔变量置true
if (key==Event.LEFT)//假如是向左键被按下
carton_1.set_direction(2);//向左的布尔变量置true
if (key==Event.RIGHT)//假如是向右键被按下
carton_1.set_direction(3);//向右的布尔变量置true
/*
去掉这两条指令上下的注释标记,格格就会拿机关枪开火
if (key==32)
carton_1.fire_wanna_switch(true);//Blank to fire.
*/
return true;
};
//键被松开事件的处理.
public boolean keyUp(Event e,int key)
[] {;
if (key==Event.UP)//假如是向上键被松开
carton_1.clear_direction(0);//向上的布尔变量置false
if (key==Event.DOWN)//假如是向下键被松开
carton_1.clear_direction(1);//向下的布尔变量清置false
if (key==Event.LEFT)//假如是向左键被松开
carton_1.clear_direction(2);//向左的布尔变量清置false
if (key==Event.RIGHT)//假如是向右键被松开
[] carton_1.clear_direction(3);//向右的布尔变量清置false
if (key==32)//假如是空格键被松开要求开枪
carton_1.fire_wanna_switch(true);//请求开枪.
return true;
};
};
//格格所属类的描述
class carton extends Thread//从Thread类派生
{;
Graphics g,off_screen=null;//g是当前的图形设备环境,off_screen是后台缓冲区图形设备环境
boolean up=false,down=false,left=false,right=false;//四个方向布尔变量
boolean img_now_switch=true;//图片切换开关.
boolean fire_wanna=false,fire_proposal=false;//fire_wanna是要求开枪,用户每次松开空格键就置位,fire_proposal是准许开枪,格格正在移动时置位
[] int position_x=200,position_y=150,pos_x,pos_y;//(position_x,position_y)是格格当前位置,(pos_x,pos_y)是刚才的位址 int img_now_switch_count=0;//格格图片切换计数.到一定值就切换
int img_now_switch_count_top=30;//切换值.图片切换计数到此值,就切换
int i=0,j=0,k=0;//这些是程序中计算时的临时变量
int fire_direction=0;//子弹方向.1=上,2=右上,3=右,4=右下,5=下,6=左下,7=左,8=左上
int bullet_amount=0;//子弹总数量
int bullet_position[][]=new int[31][3];//全部子弹信息纪录.每个子弹占横向三个元素.第一个是横坐标,第二个是纵坐标,第三个是方向
[] Image img_center_close,img_center_open,img_up,img_down,img_left;
Image img_right,img_up_left,img_up_right,img_down_left,img_down_right;//格格全部的图片
[] Image img_now,bullet_now;//现在要显示的格格图片(当前图片).它会改变的
Image bullet_up,bullet_up_left,bullet_up_right,bullet_right;
Image bullet_left,bullet_down,bullet_down_left,bullet_down_right;//子弹的全部图片
Image off_screen_buffer=null;//后台图形缓冲
AudioClip fire_sound;//开枪的声音
Applet applet;//运行环境
int sleep_time=5;//格格休眠时间
Color my_color;//临时颜色
//初始化时要将各种环境准备好
public carton(Graphics a,Applet app)
{;
g=a;//获得当前图形设备环境
[] applet=app;//获得当前运行环境
//下面把所有要用的图片调入
img_center_close=applet.getImage(applet.getCodeBase(),"center_close.gif");
img_center_open=applet.getImage(applet.getCodeBase(),"center_open.gif");
img_up=applet.getImage(applet.getCodeBase(),"up.gif");
img_down=applet.getImage(applet.getCodeBase(),"down.gif");
img_left=applet.getImage(applet.getCodeBase(),"left.gif");
img_right=applet.getImage(applet.getCodeBase(),"right.gif");
img_up_left=applet.getImage(applet.getCodeBase(),"up_left.gif");
img_up_right=applet.getImage(applet.getCodeBase(),"up_right.gif");
img_down_left=applet.getImage(applet.getCodeBase(),"down_left.gif");
img_down_right=applet.getImage(applet.getCodeBase(),"down_right.gif");
bullet_up=applet.getImage(applet.getCodeBase(),"bullet_up.gif");
bullet_down=applet.getImage(applet.getCodeBase(),"bullet_down.gif");
bullet_left=applet.getImage(applet.getCodeBase(),"bullet_left.gif");
bullet_right=applet.getImage(applet.getCodeBase(),"bullet_right.gif");
bullet_up_left=applet.getImage(applet.getCodeBase(),"bullet_up_left.gif");
bullet_up_right=applet.getImage(applet.getCodeBase(),"bullet_up_right.gif");
bullet_down_left=applet.getImage(applet.getCodeBase(),"bullet_down_left.gif");
bullet_down_right=applet.getImage(applet.getCodeBase(),"bullet_down_right.gif");
fire_sound=applet.getAudioClip(applet.getCodeBase(),"monkey.au");//把开枪的声音调入

//设置当前图片
img_now=img_center_open;
//创建后台缓冲区,并取其图形设备环境
off_screen_buffer=applet.createImage(400,350);
off_screen=off_screen_buffer.getGraphics();
};
//这是主运行函数.
public void run()
{;
while(true)//此函数一直运行
{;
set_position();//计算格格的坐标
select_image();//选择当前图片同时设定子弹的飞行方向
bullet_processing();//处理子弹
draw_image();//画图
[]
try//标准的暂停方式
{;
sleep(sleep_time);
};
catch(InterruptedException e)
{;
};
};
};
[] //计算格格的坐标 public void set_position()
{;
//首先保留当前位置坐标值
pos_x=position_x;
pos_y=position_y;
if(up==true && position_y>1)//假如向上的键被按下并且小方块的纵坐标大于1
position_y--;//小方块向上移
if(down==true && position_y<330)//假如向下的键被按下并且小方块的纵坐标小于330
position_y++;//小方块向下移
if(left==true && position_x>1)//假如向左的键被按下并且小方块的横坐标大于1
[] position_x--;//小方块向左移
if(right==true && position_x<380)//假如向右的键被按下并且小方块的横坐标小于380
position_x++;//小方块向右移?
[] };
//画屏幕
public void draw_image()
{;
my_color=new Color(179,179,179);
off_screen.setColor(my_color);
off_screen.fillRect(0,0,400,350);//在后台画背景
off_screen.drawImage(img_now,position_x,position_y,applet);//在后台画格格的图像
draw_bullet();//画子弹
g.drawImage(off_screen_buffer,0,0,applet);//送到前景显示
};
//根据格格移动方向选择要显示的图片并决定子弹飞行方向的方法
public void select_image()
{;
fire_proposal=true;//默认状态是准许开枪
[] if(position_x==pos_x && position_y==pos_y)//假如格格没有动
{;
[] fire_proposal=false;//不准开枪
fire_direction=0;//方向为0是无效值
img_now_switch_count++;//格格图像切换计数加1
if (img_now_switch_count==img_now_switch_count_top)//切换计数到了切换值
{;
img_now_switch=!img_now_switch;//切换标志取反
img_now_switch_count=0;//切换计数清零
? };
//切换标志为true,选择img_center_open去显示;为false,选择img_center_close去显示
img_now=(img_now_switch)?img_center_open:img_center_close;
};
if(position_x==pos_x && position_y {;
fire_direction=1;//现在格格是在向上移动,如果开枪,子弹方向向上
img_now=img_up;//选择img_up去显示
};
if(position_x>pos_x && position_y {;
fire_direction=2;//现在格格是在向右上移动,如果开枪,子弹方向向右上
img_now=img_up_right;//选择img_up_right去显示
};
if(position_x>pos_x && position_y==pos_y)//格格现在的位置在刚才位置的右方
{;
fire_direction=3;//现在格格是在向右移动,如果开枪,子弹方向向右
img_now=img_right;//选择img_right去显示
};
if(position_x>pos_x && position_y>pos_y)//格格现在的位置在刚才位置的右下方
{;
fire_direction=4;//现在格格是在向右下移动,如果开枪,子弹方向向右下
img_now=img_down_right;//选择img_down_right去显示
};
if(position_x==pos_x && position_y>pos_y)//格格现在的位置在刚才位置的下方
{;
fire_direction=5;//现在格格是在向下移动,如果开枪,子弹方向向下
img_now=img_down;//选择img_down去显示
};
if(position_xpos_y)//格格现在的位置在刚才位置的左下方
{;
fire_direction=6;//现在格格是在向左下移动,如果开枪,子弹方向向左下
img_now=img_down_left;//选择img_down_left去显示
};
if(position_x {;
fire_direction=7;//现在格格是在向左移动,如果开枪,子弹方向向左
img_now=img_left;//选择img_left显示
};
if(position_x {;
fire_direction=8;//现在格格是在向左上移动,如果开枪,子弹方向向左上
img_now=img_up_left;//选择img_up_left去显示
};
};
//在后台画子弹的方法
[] public void draw_bullet()
{;
for (i=1;i<=bullet_amount;i++)//一个个子弹去画
{;
//先根据子弹飞行的方向决定应该选哪个图片画
switch(bullet_position[i][2])//第三个元素(下标2)是方向
{;
case 1://向上
bullet_now=bullet_up;//选向上的图片
break;
case 2://向右上
bullet_now=bullet_up_right;//选向右上的图片
break;
case 3://向右
bullet_now=bullet_right;//选向右的图片
break;
case 4://向右下
[] bullet_now=bullet_down_right;//选向右下的图片
break;
case 5://向下
bullet_now=bullet_down;//选向下的图片
break;
case 6://向左下
[] bullet_now=bullet_down_left;//选向左下的图片
break;
case 7://向左
bullet_now=bullet_left;//选向左的图片
break;
[] case 8://向左上
bullet_now=bullet_up_left;//选向左上的图片
break;
default://无效方向不画
[] bullet_now=null;
break;
};
//在后台缓冲区上画一个子弹
off_screen.drawImage(bullet_now,bullet_position[i][0],bullet_position[i][1],applet);
};
};
//申请开枪的方法
[] public void fire_wanna_switch(boolean a)
{;
fire_wanna=a;
};
//处理子弹的方法
public void bullet_processing()
{;
//增加一颗子弹
if (fire_wanna && fire_proposal && bullet_amount<30)//假如用户要求开枪,并且格格现在在移动可以开枪,并且现行子弹总数小于30颗
{;
bullet_amount++;//子弹总数加1
[] bullet_position[bullet_amount][2]=fire_direction;//保存子弹飞行方向.fire_direction是在select_image()方法中算出的
fire_wanna=false;//开枪后将开枪要求置为false
fire_sound.play();//发声
//下面根据格格的位置设置子弹的初始坐标.有加减的情况是因为子弹要从格格图片的中心飞出,但格格的坐标是格格图片左上角的坐标,因此要加以调整.根据子弹飞行方向的不同,调整的值不同
switch (fire_direction)
{;
case 1:
bullet_position[bullet_amount][0]=position_x+5;
bullet_position[bullet_amount][1]=position_y;
break;
case 2:
bullet_position[bullet_amount][0]=position_x+10;
bullet_position[bullet_amount][1]=position_y;
break;
case 3:
bullet_position[bullet_amount][0]=position_x+10;
bullet_position[bullet_amount][1]=position_y+5;
break;
case 4:
bullet_position[bullet_amount][0]=position_x+10;
bullet_position[bullet_amount][1]=position_y+10;
break;
case 5:
bullet_position[bullet_amount][0]=position_x+5;
bullet_position[bullet_amount][1]=position_y+10;
break;
[] case 6:
bullet_position[bullet_amount][0]=position_x;
bullet_position[bullet_amount][1]=position_y+10;
[] break;
case 7:
bullet_position[bullet_amount][0]=position_x;
bullet_position[bullet_amount][1]=position_y+5;
break;
case 8:
bullet_position[bullet_amount][0]=position_x;
bullet_position[bullet_amount][1]=position_y;
break;
};
};
//下面计算子弹的位置,一颗一颗处理
for (i=1;i<=bullet_amount;i++)
{;
switch(bullet_position[i][2])//根据方向判断坐标怎样变化
{;
case 1://比如向上
bullet_position[i][0]=bullet_position[i][0];//横坐标不变
bullet_position[i][1]=bullet_position[i][1]-6;//纵坐标减 6
break;
case 2:
[] bullet_position[i][0]=bullet_position[i][0]+6;
bullet_position[i][1]=bullet_position[i][1]-6;
break;
case 3:
[] bullet_position[i][0]=bullet_position[i][0]+6;
bullet_position[i][1]=bullet_position[i][1];
break;
case 4:
bullet_position[i][0]=bullet_position[i][0]+6;
bullet_position[i][1]=bullet_position[i][1]+6;
[] break;
case 5:
bullet_position[i][0]=bullet_position[i][0];
bullet_position[i][1]=bullet_position[i][1]+6;
break;
case 6:
bullet_position[i][0]=bullet_position[i][0]-6;
bullet_position[i][1]=bullet_position[i][1]+6;
[] break;
[] case 7:
bullet_position[i][0]=bullet_position[i][0]-6;
[] bullet_position[i][1]=bullet_position[i][1];
break;
case 8:
[] bullet_position[i][0]=bullet_position[i][0]-6;
bullet_position[i][1]=bullet_position[i][1]-6;
break;
default:
break;
};
};
//下面判断是否有某颗子弹飞出了屏幕边界,有的话,去掉它,并将它后面得数组元素前移
k=0;// k 用来纪录有几颗子弹飞出了屏幕边界
for (i=1;i<=bullet_amount;i++)//一颗一颗子弹去处理
{;
//假如子弹飞出了屏幕边界
if (bullet_position[i][0]<-10 || bullet_position[i][0]>400 || bullet_position[i][1]<-10 || bullet_position[i][1]>350)
{;
for (j=i+1;j<=bullet_amount;j++)//它后面所有的元素向前移占据它在数组中的位置
{;
[] bullet_position[j-1][0]=bullet_position[j][0];
bullet_position[j-1][1]=bullet_position[j][1];
bullet_position[j-1][2]=bullet_position[j][2];
};
[] k++;//飞出屏幕边界的子弹数量加1
};
};
bullet_amount=bullet_amount-k;//现在子弹的总数量是刚才的数量减去飞出屏幕边界的子弹的数量
};

//表示格格移动方向的布尔变量的置位方法
public void set_direction(int direction_)
{;
switch(direction_)
{;
case(0)://向上键被按下则向上的布尔变量置true
up=true;
break;
case(1)://向下键被按下则向下的布尔变量置true
[] down=true;
break;
case(2)://向左键被按下则向左的布尔变量置true
[] left=true;
break;
case(3)://向右键被按下则向右的布尔变量置true
right=true;
break;
default:
break;
};
[] };
//表示格格移动方向的布尔变量的清零方法
public void clear_direction(int direction_)
{;
switch(direction_)
[] {;
case(0)://向上键被松开则向上的布尔变量置false
[] up=false;
break;
case(1)://向下键被松开则向下的布尔变量置false
down=false;
break;
case(2)://向左键被松开则向左的布尔变量置false
left=false;
break;
case(3)://向右键被松开则向右的布尔变量置false
right=false;
break;
default:
break;
};
[] };
};

http:///tech/article794.html
</td></tr></table></td> </tr> <tr> <td background="/pic/split.gif" height=1></td> </tr> <tr> <td class="tdMargin1">
↑返回目录
前一篇: Java活动图像程序和游戏编写(3)
后一篇: Java活动图像程序和游戏编写(1)