📄 bullets.java
字号:
package fly;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.util.Random;
public class Bullets extends GameObject {//子弹类Bullets继承自GameObject
private int [][] bullets;//子弹状态数组
private int bulletstotal;//子弹总数,即数组的长度
private Random rnd;//随机数
public static final int BULLET_TYPE_LEFT=0;//子弹初始化的位置类型
public static final int BULLET_TYPE_RIGHT=1;//0表示左,1表示右
public static final int BULLET_TYPE_TOP=2;//2表示上,3表示下
public static final int BULLET_TYPE_BOTTOM=3;
private int width,height;//屏幕的宽和高,用于随机子弹位置
public Bullets(Image img,int picwidth,int picheight,int bulletstotal,int width,int height){
//子弹构造函数,用于初始化子弹
super(img,picwidth,picheight);
this.bulletstotal=bulletstotal;
bullets=new int[bulletstotal][6];
rnd=new Random();
this.width=width;
this.height=height;
}//Bullets
public void initBullets(){//初始化子弹状态数组
for(int i=0;i<bullets.length;i++){
initBullet(i);
}//for
}//initBullets
private void initBullet(int i){//初始化第i号子弹
bullets[i][0] = (rnd.nextInt() & 0x7fffffff)%4;//子弹的类型,有上、下、左、右四种,
//分别表示子弹飞入屏幕前的四种位置
bullets[i][5] = 1;//alive 1表示存活,0表示死去,即子弹的存活状态
switch (bullets[i][0]) {
case BULLET_TYPE_LEFT://左
bullets[i][1]=-5;//子弹的x坐标
bullets[i][2]=(rnd.nextInt() & 0x7fffffff)%height;//子弹的y坐标
bullets[i][3]=(rnd.nextInt() & 0x7fffffff)%3 + 2;//x方向速度
bullets[i][4]=(rnd.nextInt())%3;//y方向速度
break;
case BULLET_TYPE_RIGHT://右
bullets[i][1]=width + 5;
bullets[i][2]=(rnd.nextInt() & 0x7fffffff)%height;
bullets[i][3]=((rnd.nextInt() & 0x7fffffff)%3 + 1)*-2;//x方向速度
bullets[i][4]=(rnd.nextInt())%3;//y方向速度
break;
case BULLET_TYPE_TOP://上
bullets[i][1]=(rnd.nextInt() & 0x7fffffff)%width;
bullets[i][2]=-5;
bullets[i][3]=(rnd.nextInt())%3;
bullets[i][4]=(rnd.nextInt() & 0x7fffffff)%3 + 2;
break;
case BULLET_TYPE_BOTTOM://下
bullets[i][1]=(rnd.nextInt() & 0x7fffffff)%width;
bullets[i][2]=height + 5;
bullets[i][3]=(rnd.nextInt())%3;
bullets[i][4]=((rnd.nextInt() & 0x7fffffff)%3 + 1)*-2;
break;
}//switch
}//initBullet
public void updata(int i){//根据速度更新i子弹下一桢的位置,碰壁反弹
bullets[i][1]+=bullets[i][3];
bullets[i][2]+=bullets[i][4];
if(bullets[i][1]<-5 || bullets[i][1]>width+5){
bullets[i][3]*=-1;
}//if
if(bullets[i][2]<-5 || bullets[i][2]>height+5){
bullets[i][4]*=-1;
}//if
}//updata
private void paint(Graphics g,int i){//绘画出第i个子弹
updataspritepos(i);//更新位置
sprite.paint(g);//绘画Sprite
}//paint
public void paint(Graphics g){//绘画整个子弹数组
for(int i=0;i<bullets.length;i++){
if(bullets[i][5]==0){//死去的子弹不绘画
continue;
}//if
sprite.setPosition(bullets[i][1],bullets[i][2]);//更新位置
sprite.paint(g);
}//for
}//paint
public void refreshBullets(Sprite planesprite,boolean needcollision){
//刷新子弹数组的状态,并作碰撞处理
for(int i=0;i<bullets.length;i++){
if(bullets[i][5]==0){//死去的子弹不更新
continue;
}//if
if(needcollision){//如果需要碰撞检测
if(isCollision(planesprite,i,9)){//如果碰撞,进行处理
Navigate.mc.gameover = true;
Navigate.mc.explosion.sprite.setPosition(bullets[i][1]-16,bullets[i][2]-16);
bullets[i][5]=0;//杀死碰撞的子弹
continue;
}//if
}//if
updata(i);//更新状态
}//for
}//refreshBullets
private boolean isCollision(Sprite sprite,int i,int range){//判断是否碰撞
boolean result=false;
int planeXCenter=sprite.getX()+12;
int planeYCenter=sprite.getY()+12;
int bulletXCenter=bullets[i][1]+3;
int bulletYCenter=bullets[i][2]+3;
if(Math.abs(planeXCenter-bulletXCenter)<range){
//判断飞机x坐标与子弹x坐标的距离是否小于特定的值
if(Math.abs(planeYCenter-bulletYCenter)<range){
//判断飞机y坐标与子弹y坐标的距离是否小于特定的值
result=true;
}//if
}//if
return result;
}//isCollision
private void updataspritepos(int i){//将sprite更新到i子弹的位置
sprite.setPosition(bullets[i][1],bullets[i][2]);
}//updataspritepos
public void killbullets(Sprite planesprite,int range){//杀死一定区域内的子弹
for(int i=0;i<bullets.length;i++){
if(bullets[i][5]!=0){
if(isCollision(planesprite,i,range)){
bullets[i][5]=0;
initBullet(i);
}//if
}//if
}//for
}//killbullets
}//Bullets
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -