JAVA实现坦克大战小游戏——玩家坦克子d发射

JAVA实现坦克大战小游戏——玩家坦克子d发射,第1张

当用户按下J键,用户坦克就发射一颗子d

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),这样可以防止窗口显示的时候还是不全的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12484587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存