Java 小游戏 原谅帽大作战
程序员文章站
2022-03-26 17:40:59
Java 小游戏详解1.设置窗口大小2.设置背景图3.游戏实现1.人物设计2.子弹设计3.障碍物设计4.胜负判断4.源代码要想做一个简单的小游戏,我们首先会考虑到如何让用户看到我们的游戏,如何去操作。1.设置窗口大小public static void main(String[] args) { GameClient1 gameClient1 = new GameClient1(); // 开始游戏 gameClient1.start(); }...
最终效果
来吧 展示!
需求分析
发现对象
人物-小丑( 友方 跟 敌方 )
子弹-帽子 Missile
墙体 Wall
爆炸物 Explode
发现属性
小丑:宽 高 , 位置( x , y ), 移动速度
帽子:宽 高 , 位置( x , y ), 移动速度
墙体:宽 高 , 位置( x , y )
爆炸物:宽 高 , 位置( x , y )
发现行为
小丑:
移动
攻击
人物撞边界
子弹:
移动
子弹撞墙
子弹撞边界
爆炸物:
爆炸物消失
难点
- 窗体如何创建
- 背景图片加载
- 如何将图片加载到窗体里
- 人物-小丑加载
- 发射物-帽子加载
- 爆炸物加载
- 子弹如何发射?? 按键盘/键盘
设置窗口大小
public static void main(String[] args) {
GameClient1 gameClient1 = new GameClient1();
// 开始游戏
gameClient1.start();
}
public void start(){
System.out.println("游戏开始了!");
// TODO 游戏业务
// 设置窗体
// 标题
this.setTitle("原谅帽");
// 大小
this.setBounds(0,0,1000,700);
//显示窗体
this.setVisible(true);
}
设置窗口为宽1000,高700。
图片加载
public class GameClient1 extends Frame {
// 设置常量 背景图片路径
public static final String BG_PATH1 = "images/bg.png";
// 定义一个图片类型的静态变量
private static Image image;
// static修饰过的所有资源都执行一次
static{
image= CommonUtils1.getImage(BG_PATH1);
}
@Override
public void paint(Graphics g) {
//画背景
g.drawImage(image,0,0,1000,700,this);
}
}
通过重写paint方法来实现画出背景图。
游戏实现
1.人物设计
- 人物移动
设计人物移动的方向
/**
* 键盘按下 确定人物移动方向
*/
public void okDirPressed(int keyCode){
// TODO 确定方向
switch (keyCode){
case KeyEvent.VK_UP:
System.out.println("向上走!!");
// 向上箭头,给人物的方向设置为 向上
this.setDir("U");
up = true;
break;
case KeyEvent.VK_DOWN:
System.out.println("向下走!!");
// 向下箭头,给人物的方向设置为 向下
this.setDir("D");
down = true;
break;
case KeyEvent.VK_LEFT:
System.out.println("向左走!!");
// 向左箭头,给人物的方向设置为 向左
this.setDir("L");
left = true;
break;
case KeyEvent.VK_RIGHT:
System.out.println("向右走!!");
// 向右箭头,给人物的方向设置为 向右
this.setDir("R");
right = true;
break;
case KeyEvent.VK_CONTROL:
// 打桩
System.out.println("发子弹!!");
Missile fire = this.fire();
// 将子弹放到子弹容器中
this.missileList.add(fire);
// 看看容器里有多少子弹了
System.out.println("this.missileList.size() = " + this.missileList.size());
break;
}
//判断用户到底用了哪些键
// 右上
if(up && right){
this.setDir("RU");
}
// 右下
if(right && down){
this.setDir("RD");
}
// 左上
if(left && up){
this.setDir("LU");
}
// 左下
if(left && down){
this.setDir("LD");
}
// 人物移动
this.move(this.getDir());
}
// 监听事件
this.addKeyListener(new KeyAdapter() {
// 键盘按下 触发事件
@Override
public void keyPressed(KeyEvent e) {
// 获取被按下的键的对应的数值 如:a:67, b:68
int keyCode = e.getKeyCode();
// 调用人物的 确定方向 方法
buffoon.okDirPressed(keyCode);
}
// 键盘松开 触发事件
@Override
public void keyReleased (KeyEvent e){
buffoon.setDir("STOP");
int keyCode = e.getKeyCode();
buffoon.okDirReleased(keyCode);
}
});
监听事件:获取被按下的键的对应的数值 如:a:67, b:68
/**
* 防抖动,防闪屏
*/
@Override
public void update(Graphics g) {
// 创建图形缓冲区
Image imageBg = createImage(1100, 750);
// 获取图形缓冲区的上下文
Graphics newGraphics = imageBg.getGraphics();
// 用paint方法对图形缓冲区绘图
paint(newGraphics);
// 释放图形上下文资源
newGraphics.dispose();
// 将图形缓冲区绘制到屏幕上
g.drawImage(imageBg, 0, 0 , 1100, 750, this);
}
人物移动更平滑
// 退出游戏
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("Game Over!!!");
//退出游戏
System.exit(0);
}
});
调用 addWindowListener 用来点击退出程序
2.子弹设计
先设置储存子弹的容器
// 子弹数组 List 集合容器
private List<Missile> missileList = new ArrayList<Missile>();
用for循环把容器里子弹拿并画出来
// 画子弹
int size = buffoon.getMissileList().size();
for (int i = 0; i < size; i++) {
// 将容器中的子弹 拿出来
Missile missile = buffoon.getMissileList().get(i);
// 画到屏幕上
missile.paint(g);
}
3.障碍物设计
4.胜负判断
本文地址:https://blog.csdn.net/qq_45297003/article/details/109598799
下一篇: 装饰者模式,代码实现类图