现在添加字段对象,子弹,敌机,玩家,都是属于modle包中的对象,所以我们新建一个类Bullet
1/定义子弹需要的一些常量,子弹图片的长宽,子弹的坐标。
然后使用Tooklit.getDefaultToolkit().getImage(“文件路径”);
获得子弹图片,新建一个Imageindex变量做为图片的下标,和之前一样,我们要让子弹有动画看起来是旋转的。
package modle;
import java.awt.Image;
import java.awt.Toolkit;
import view.MyPanel;
public class Bullet {
public MyPanel myPanel;
//子弹的坐标x和y
public int x,y;
//子弹图片的长和宽
public int height, width;
public Bullet(MyPanel myPanel)
{
this.myPanel = myPanel;
}
public int imageindex = 0;
public Image[] images = new Image[] {
Toolkit.getDefaultToolkit().getImage("images/bullet01.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet02.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet03.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet04.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet05.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet06.png"),
};
}
然后添加画子弹的方法
public void drawSelf(Graphics g)
{
g.drawImage(images[imageindex], x, y, width, height, null);
}
public void drawSelf(Graphics g)
{
g.drawImage(images[imageindex], x, y, width, height, null);
if(this.myPanel.time % 4 ==0)
{
//每四毫米图片变化一次
imageindex ++;
if(imageindex == images.length)
{
imageindex = 0;
}
//子弹移动
y --;
//超出屏幕移除子弹
}
}
接下来去MyPanel类中添加子弹
子弹有很多的,而且我们不知道数量,所以我们使用一个ArrayList来存储子弹
在MyPanel类中
public ArrayList<Bullet> bullets = new ArrayList<Bullet>();
然后在我们的子弹中添加移除子弹的方法,生成一个子弹,系统占用一部分内存,不删除最后导致程序异常。
package modle;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import view.MyPanel;
public class Bullet {
public MyPanel myPanel;
//子弹的坐标x和y
public int x,y;
//子弹图片的长和宽
public int height, width;
public Bullet(MyPanel myPanel)
{
this.myPanel = myPanel;
}
public int imageindex = 0;
public Image[] images = new Image[] {
Toolkit.getDefaultToolkit().getImage("images/bullet01.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet02.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet03.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet04.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet05.png"),
Toolkit.getDefaultToolkit().getImage("images/bullet06.png"),
};
//绘制子弹
public void drawSelf(Graphics g)
{
g.drawImage(images[imageindex], x, y, width, height, null);
if(this.myPanel.time % 4 ==0)
{
//每四毫米图片变化一次
imageindex ++;
if(imageindex == images.length)
{
imageindex = 0;
}
//子弹移动
y --;
//超出屏幕移除子弹
if(y < 0)
{
this.myPanel.bullets.remove(this);
}
}
}
}
现在子弹有了,我们要去MyPanel中绘制我们的子弹
重构成一个单独的方法
public void paintBullets(Graphics g)
{
//创建子弹
Bullet bullet = new Bullet(this);
//把子弹的坐标绑定在玩家上
bullet.x = this.player.x;
bullet.y = this.player.y;
this.bullets.add(bullet);
//便利数组,绘制子弹
for(int i =0; i<bullets.size();i++)
{
this.bullets.get(i).drawSelf(g);
}
}
}
这样就结束了吗? 不,我们运行会发现子弹是一条连续的细线,因为为绘制子弹一的方法一直会被调用,所以我们要使用time 来限制子弹的发射速度。
//绘制子弹
public void paintBullets(Graphics g)
{
if(time % 100 == 0)
{
//创建子弹
Bullet bullet = new Bullet(this);
//把子弹的坐标绑定在玩家上
bullet.x = this.player.x+this.player.width/2-4;
bullet.y = this.player.y;
this.bullets.add(bullet);
}
//便利数组,绘制子弹
for(int i =0; i<bullets.size();i++)
{
this.bullets.get(i).drawSelf(g);
}
}