第一步是创建项目?项目名自拟
第二部创建个包名?来规范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);
?? ??? ?}
?? ?}
}