当前位置: 首页 > news >正文

JAVA小游戏简易版王者荣耀

第一步是创建项目 项目名自拟

第二部创建个包名 来规范class

  

然后是创建类 GameFrame   运行类

package com.sxt;
 
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class GameFrame extends JFrame {
    // 窗口尺寸
    private int windowWidth = 1400;
    private int windowHeight = 700;
    // 双缓冲图片
    private Image offScreenImage = null;
    // 攻击图片
    private Image attack = Toolkit.getDefaultToolkit().getImage("img/attack.jpg");
    // 游戏背景
    Background background = new Background(this);
    // 游戏玩家
    Champion player = new ChampionHouyi(this);
    // 双方小兵
    MinionBlue mb = new MinionBlue(this);
    MinionRed mr = new MinionRed(this);
    // 防御塔
    Turret turret = new Turret(this);
    // 攻击按钮
    JButton attackButton;
    // 游戏元素列表
    ArrayList<GameObject> objList = new ArrayList<GameObject>();
    ArrayList<GameObject> redList = new ArrayList<GameObject>();// 红色方
    ArrayList<GameObject> blueList = new ArrayList<GameObject>();// 蓝色方
    ArrayList<GameObject> removeList = new ArrayList<GameObject>();// 存放将要删除的元素
 
    public void launch() {
        // 设置尺寸
        setSize(windowWidth, windowHeight);
        // 窗口居中
        setLocationRelativeTo(null);
        // 关闭事件
        setDefaultCloseOperation(3);
        // 用户不能调整窗口大小
        setResizable(false);
        // 标题
        setTitle("尚学堂王者荣耀");
        // 窗口可见
        setVisible(true);
        // 添加键盘监视器
        this.addKeyListener(new GameFrame.KeyMonitor());
        // 添加游戏元素
        objList.add(background);
        objList.add(player);
        objList.addAll(turret.turretList);
        blueList.add(turret.turretList.get(0));
        redList.add(turret.turretList.get(4));
 
        /**
         * 攻击按钮
         */
        attackButton = new JButton();
        attackButton.setSize(130, 132);
        attackButton.setLocation(1150, 430);
        attackButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 按钮事件
                player.attack(redList);
            }
        });
        this.add(attackButton);
        player.addButton();
 
        while (true) {
            mb.createMinion(this, blueList);
            mr.createMinion(this, redList);
            turret.addTurret(this);
            repaint();
            try {
                Thread.sleep(25);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    public void paint(Graphics g) {
        // System.out.println(player.getX()+" "+player.getY());
        if (offScreenImage == null) {
            offScreenImage = this.createImage(5984, 4452);
        }
        Graphics gImage = offScreenImage.getGraphics();
        for (int i = 0; i < objList.size(); i++) {
            objList.get(i).paintSelf(gImage);
        }
        // 绘制攻击图片
        gImage.drawImage(attack, player.getX() + 500, player.getY() + 100, null);
        objList.removeAll(removeList);
 
        g.drawImage(offScreenImage, -player.getX() + 700, -player.getY() + 350, null);
        /**
         * 添加按钮后不能调用键盘事件 因为程序的焦点变成了按钮 this.requestFocus() 把焦点重新改变到游戏界面上
         */
        this.requestFocus();
    }
 
    // main方法
    public static void main(String[] args) {
        GameFrame gameFrame = new GameFrame();
        gameFrame.launch();
    }
 
    // 键盘事件
    private class KeyMonitor extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();
            player.keyPressed(e);
        }
 
        @Override
        public void keyReleased(KeyEvent e) {
            int key = e.getKeyCode();
            player.keyReleased(e);
        }
    }
}

运行结果如下:

相关文章:

  • 【PyTorch】(二)加载数据集
  • 如何使用内网穿透实现无公网ip环境访问VScode远程开发
  • pip安装、更新、卸载
  • CTA-GAN:基于生成对抗性网络的主动脉和颈动脉非集中CT血管造影 CT到增强CT的合成技术
  • Java中xml映射文件是干什么的
  • 开闭原则:提高扩展性的小技巧
  • 计算机视觉面试题-03
  • LeetCode算法题解(动态规划,背包问题)|LeetCode416. 分割等和子集
  • 【Spring之AOP底层源码解析】
  • vue 表格虚拟滚动
  • Web3之L2 ZK-Rollup 方案-StarkNet
  • 【Lustre相关】功能实践-01-Lustre集群部署配置
  • 鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Extend扩展组件样式与stateStyles多态样式(十一)
  • FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「内网穿透」
  • 数据结构学习笔记——二叉树的遍历和链式存储代码实现二叉树
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CSS盒模型深入
  • Cumulo 的 ClojureScript 模块已经成型
  • fetch 从初识到应用
  • Service Worker
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 阿里研究院入选中国企业智库系统影响力榜
  • 分类模型——Logistics Regression
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 那些被忽略的 JavaScript 数组方法细节
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 推荐一个React的管理后台框架
  • ​configparser --- 配置文件解析器​
  • ​linux启动进程的方式
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #预处理和函数的对比以及条件编译
  • (52)只出现一次的数字III
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (算法)Travel Information Center
  • (译)2019年前端性能优化清单 — 下篇
  • .cn根服务器被攻击之后
  • .describe() python_Python-Win32com-Excel
  • .NET Core引入性能分析引导优化
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET Project Open Day(2011.11.13)
  • .NET Standard 的管理策略
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 获取url的方法
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @html.ActionLink的几种参数格式
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节