java阶段项目一_坦克大战游戏

首先说明,小编做这个是为了巩固面向对象的基础知识,并无其他意义

一、创建窗口、创建游戏区域

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原创内容,可在微信小程序查看

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值