欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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(); }...

最终效果

Java 小游戏 原谅帽大作战

来吧 展示!

需求分析

发现对象

 人物-小丑( 友方 跟 敌方 )
 子弹-帽子    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.人物设计

  • 人物移动

设计人物移动的方向

Java 小游戏 原谅帽大作战

/**
    *  键盘按下 确定人物移动方向
    */

   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

相关标签: 游戏