首先说明,小编做这个是为了巩固面向对象的基础知识,并无其他意义
一、创建窗口、创建游戏区域
package cn.tankwar;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameFrame extends JFrame {
//游戏面板
GamePanel gamepanel;
//创建窗口
public GameFrame() {
this.setLocation(500, 200);
this.setSize(720, 600);
this.setTitle("TankWar");
this.setDefaultCloseOperation(GameFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setLayout(null);
gamepanel = new GamePanel(); //创建游戏面板
this.add(gamepanel); //将面板添加进GameGrame中
gamepanel.requestFocus(); //游戏面板获取焦点
}
class GamePanel extends JPanel {
public GamePanel() {
this.setBounds(100, 0, 500, 550); //设置面板区域
}
//重写paint方法,所有的绘图动作都在这里做
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.black);
g.fill3DRect(0, 0, 500, 550, true);
}
}
}
如图,此时我们完成了这样一个窗口,就可以在GamePanel中开始我们游戏编程了
二、创建坦克类作为我方和敌方坦克的基类,可定为抽象类
我们先将一些能够想到的函数写这,不具体实现,到时候一步一步完善
package cn.tankwar;
import java.awt.Graphics;
public abstract class Tank {
//坦克横坐标
protected int x;
//坦克纵坐标
protected int y;
//坦克速度
protected final int SPEED = 4;
//坦克方向
char direction;
//坦克的绘制方法
protected abstract void draw(Graphics g);
//开火
protected void fire() {
}
//移动
protected void move() {
}
}
好了,现在我们可以完成我们主角坦克类的绘制了,创建一个MyTank类继承Tank类,并重写draw()方法
package cn.tankwar;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class MyTank extends Tank {
/*
* 坦克四张图片,分别对应不同方向坦克形状
* */
Image img_top = Toolkit.getDefaultToolkit().createImage("./res/leader/leader_top.gif");
Image img_right = Toolkit.getDefaultToolkit().createImage("./res/leader/leader_right.gif");
Image img_left = Toolkit.getDefaultToolkit().createImage("./res/leader/leader_left.gif");
Image img_down = Toolkit.getDefaultToolkit().createImage("./res/leader/leader_down.gif");
//初始化坦克时应该确定x,y以及坦克的方向
public MyTank(int x,int y) {
this.x = x;
this.y = y;
this.direction = 't';
}
//绘制坦克
protected void draw(Graphics g) {
switch(this.direction) {
case 't':
g.drawImage(img_top, x, y, null);
break;
case 'r':
g.drawImage(img_right, x, y, null);
break;
case 'd':
g.drawImage(img_down, x, y, null);
break;
case 'l':
g.drawImage(img_left, x, y, null);
break;
}
}
然后在GamePanel构造方法中定义一个MyTank对象,并在GamePanel的paint()方法下调用mytank的draw方法
此时就能看到我们的坦克了
三、让我们的坦克动起来
思路分析:要用键盘让我们坦克动起来,就需要添加键盘监听事件,当我们敲击键盘时,去改变坦克的x或者y坐标,然后让窗口重绘,就能产生动态效果,为了后继我们能够不断得到动态效果,应该在GameFrame构造方法中用一个循环不断调用repaint()方法
以下是GamePanel构造方法中实现键盘监听
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
if(e.getKeyCode() == KeyEvent.VK_W) {
mytank.direction = 't';
mytank.move();
}else if(e.getKeyCode() == KeyEvent.VK_A) {
mytank.direction = 'l';
mytank.move();
}else if(e.getKeyCode() == KeyEvent.VK_S) {
mytank.direction = 'd';
mytank.move();
}else if(e.getKeyCode() == KeyEvent.VK_D) {
mytank.direction = 'r';
mytank.move();
}
}
});
在GameFrame中不断重绘
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.repaint();
}
现在我们的坦克就能动了
四、后继步骤分析
能够做到这里,相信后面的步骤也很简单了,基本都是一些重复操作,我构思一下,大概还有以下几步,当然只是完成基本功能,若要真正做到很完美,这些还远远不够:
a.创建敌方坦克类继承Tank基类,重写draw()方法,在GamePanel中开辟线程随机改变敌方坦克方向
b.子弹类的创建以及动态绘制
c.子弹与坦克之间的碰撞检测(GameOver场景和Pass场景)
后面笔者觉得没必要也没时间做了,所以也没有完善,源码放在这,本人正在系统学习java中,有想给予指导或一起交流的可加本人q1096250907
源码下载地址:
链接: https://pan.baidu.com/s/1WjimUvv6WwqjJUvuI27t0g 密码: uwgr
更多章节及Java原创内容,可在微信小程序查看