1、当发射一颗子d后,就相当于启动一个线程
2、Hero有子d的对象,当按下J时、我么就启动一个发射行为(线程),让子d不停的移动喊闭,形成一个射击的效果
3、我们的MyPanel需要不停的重绘 子d,才能实现子d移卖隐动的效果
4、当子d移动到面板边界时、就应该销毁中渗厅(把启动的线程销毁)
1、新建子d实体类
2、在自己的坦克对象中加入子d
3、在面板中增加监听(J键)
import java.awt.*import javax.swing.*
public class Tank extends JFrame {
mypane mp=null
Obj[] objs=new Obj[0]
public Tank() {
setTitle("坦克大战")
setSize(800,600)
pro()
add(new mypane(objs))
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
setLocationRelativeTo(null)
//在这埋滚里添加键盘事件、鼠标事件、让坦克移动,修改objs数组对象让他们移动
setVisible(true)
}
private void pro(){
Obj[] tmp=new Obj[objs.length+1]
System.arraycopy(objs,0,tmp,0,objs.length)
tmp[tmp.length-1]=new Obj(1,1,0,1)
objs=tmp
int num=(int)(Math.random()*5)+1
for(int i=0i<numi++){
int x=(int)(Math.random()*getWidth())+1
int y=(int)(Math.random()*getHeight())+1
int dir=(int)(Math.random()*4)
Obj[] dst=new Obj[objs.length+1]
System.arraycopy(objs,0,dst,0,objs.length)
dst[dst.length-1]=new Obj(x,y,1,dir)
objs=dst
}
}
public static void main(String[] args) {
new Tank()
}
}
class Obj{
int x,y//坦克坐标
int type
int dir
public Obj(int x,int y,int type,int dir){
this.x=x
this.y=y
this.type=type
this.dir=dir
}
}
class mypane extends JPanel{
Obj[] objs
public mypane(Obj[] objs){
this.objs=objs
}
public void paint(Graphics g) {
super.paint(g)
for(int i=0i<objs.lengthi++){
Obj obj=objs[i]
drawtank(obj.x,obj.y, g, obj.type, obj.dir)
}
g.dispose()
}
public void drawtank(int x,int y,Graphics g, int type,int direct) {
/*type 为坦克类型,敌方,我方*/
switch(type) {
case 0://我方坦克,设置为红色
g.setColor(Color.red)
break
case 1://敌方坦克,设置为蓝色
g.setColor(Color.blue)
break
}
switch(direct) {
case 0://坦克方向朝上
g.drawRect(0+x, 0+y, 5, 30)
g.drawRect(5+x, 5+y, 10,20)
g.drawRect(15+x,0+y, 5,30)
g.drawLine(10+x, 15+y, 10+10+x, 15+y)
break
case 1://坦克方向朝右
g.drawRect(0+x, 0+y, 30, 5)
g.drawRect(5+x, 春液茄5+y, 20, 10)
g.drawRect(0+x, 15+y, 30, 5)
g.drawLine(15+x, 10+y, 30+15+x, 10+10+y)
break
case 2://方向向下
g.drawRect(0+x, 0+y, 5, 30)
g.drawRect(5+x, 5+y, 10,20)
g.drawRect(15+x,0+y, 5,30)
g.drawLine(10+x, 15+y, 10+10+x, 30+15+y)
break
case 扒察3://方向向左
g.drawRect(0+x, 0+y, 30, 5)
g.drawRect(5+x, 5+y, 20, 10)
g.drawRect(0+x, 15+y, 30, 5)
g.drawLine(15+x, 10+y, 15+x, 10+10+y)
break
}
}
}
设置兄历窗口是否可见,true为可见,因为默认是false,如果不设置,会什么都看不到。一般会先初始化控件,等窗口的初始化羡键搜亮轮都完成了,最后setVisible(true),这样可以防止窗口显示的时候还是不全的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)