Java面向对象---原谅帽游戏
作品展示
第一天:类(游戏端)继承Frame;
首先要创建一个方法去让游戏开始和结束
使用text执行这个游戏的方法(需要有游戏标题和游戏的界面)
创建一个背景图片变量(创建静态值static,只出现一遍)
定义一个值让他等于背景图片的路径
把这个值赋值给我们创建的这个背景图片变量,让他拥有路径
创建类CommonUtils(路径方法)
第二天:给各个类对象里创建游戏窗体属性,创建无参合有参的方法,和get,set方法和画笔方法,游戏端(类)里创建画笔方法各个实现
在需要做移动的时候例小丑移动在小丑移动里创建移动方法
第三天:在此基础要知道游戏是无法结束的,添加一个游戏结束的方法
在游戏端start方法中添加一个监听键盘系统(就是让你输出键盘方向可以反映到你控制的人物身上),在小丑这个类里创建一个移动的属性以及赋予get和set方法,将小丑移动方向方法点调进这个键盘系统里,创建一个thread方法,定义一个重新绘制画面的线程,再招一个工人去车间干活,创建游戏窗体并听过构造方法调用,创建润方法设置50毫秒执行一次绘制图像,在游戏系段开启重新绘制线程,创建车间工人,工人听取调度。
第四天:基于第三天成果,小丑人物可以动了,但是属于闪屏模式,首先创建一个解决闪屏的方法。其次我们将昨天的监听键盘系统进行优化,给小丑类里创建四个方向没有按下,将昨天的键位选项粘贴到小丑buffoon键盘按下确定人物移动方向和键盘松开方法里。方法里要有boolean判断。此时小丑可以八个方向动了,在小丑里创建子弹数组(扔帽子)和getset方法,创建让子弹(帽子)扔出去方法,在游戏端里用paint方法画出子弹;
第五天;基于前四天成功,小丑可以发出子弹了,今天我们需要让子弹(帽子)移动,并且需要给小丑设置出现的范围。并对之前的代码进行优化。
1.思路分析
1.发现类(对象)
人物-小丑(友方,敌方):buffoon
子弹-帽子:missile
墙体:wall
爆炸物:explode
2.发现属性
小丑:宽,高,位置(x,y),移动速度
帽子:宽,高,位置(x,y),移动速度
墙体:宽,高,位置(x,y)
爆炸物:宽,高,位置(x,y)
3.发现方法
小丑:
移动
攻击(发子弹)
人物撞边界
子弹:
移动
子弹撞墙子弹撞边界
墙体:
爆炸物:消失
2.难点在哪里
1.如何将图片加载到窗体里
背景图片加载 已完成
人物–小丑加载(已完成)
发射物–帽子加载(已完成)
墙体加载(已完成)
爆炸物加载(已完成)
2. 窗体如何创建
3.子弹如何放射??按键盘 键盘如何触发事件???
3.作品展示
1.创建游戏端方法
public void start(){
System.out.println("即将开始游戏,请玩家做好准备");
this.setTitle("原谅帽"); //设置标题
this.setBounds(0,0,1100,600);//设置窗口
this.setVisible(true);//让窗口显示出
System.out.println("GameOver!!!");
}
2.text实现游戏端方法
public static void main(String[] args) { //text测试运行游戏端开始和结束
GameClient gameClient=new GameClient();
gameClient.start();
}
3.创建背景图片并且对背景图片增加路径
public static final String BG_PATH="images/bg.png";//定义一个量设置图片路径
private static Image image;//定义图片背景
static {
image= CommonUtils.getImage(BG_PATH);
} //静态块只需要加载一次
4.创建类CommonUtils
public class CommonUtils {
/**
* 读取图片资源, 转变为Java对象 Image
* @param imgPath 图片路径
* @return Image对象
*/
public static Image getImage(String imgPath) {
ImageIcon imageIcon = new ImageIcon(imgPath);
return imageIcon.getImage();
}
}
5.各个(类)里创建游戏窗体属性
//游戏窗体属性 因为小丑要在窗体中画画
protected GameClient gameClient;
6.各个(类)里创建有参无参方法
//无参构造
public Buffoon(){}
//带参构造
public Buffoon(int x,int y,GameClient gameClinet){
this.x=x;
this.y=y;
this.width=50;
this.height=50;
this.speed=5;
this.gameClient=gameClinet;
}
7.各个(类)里创建paint画笔方法
/**
* 小丑里有自己的画画方法
*/
public void paint(Graphics g){
g.drawImage(buffoon_Image,this.x,this.y,this.width,this.height,this.gameClient);
}
8.各个(类)里创建get set方法
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
9.游戏端创建各个类的对象
private Buffoon buffoon=new Buffoon(570,300,this);
private Missile missile=new Missile(550,300,this);
private Wall wall=new Wall(300,80,this);
private Wall wall1=new Wall(800,50,this);
private Wall wall2=new Wall(300,350,this);
private Wall wall3=new Wall(800,350,this);
private Wall1 wall4=new Wall1(500,260,this);
private Explode explode=new Explode(200,300,this);
10.游戏端创建paint方法实现
public void paint(Graphics g) {
//画背景图
g.drawImage(image,0,0,1100,600,this);
//画人物-小丑图
buffoon.paint(g);
//画发射物-帽子
missile.paint(g);
//画墙-横墙
wall.paint(g);
wall1.paint(g);
wall2.paint(g);
wall3.paint(g);
//花墙-画竖墙
wall4.paint(g);
//画-爆炸物
explode.paint(g);
}
11.Buffoon类中创建个移动方法
/**
* 人物移动
*/
public void move(String dir){
//上北
if("U".equals(dir)){
this.y=this.y-this.speed;
}
//下南
if("R".equals(dir)){
this.y=this.y+this.speed;
}
//右东
if("D".equals(dir)){
this.x=this.x+this.speed;
}
//左西
if("L".equals(dir)){
this.x=this.x-this.speed;
}
//东北
if("UR".equals(dir)){
this.x=this.x+this.speed;
this.y=this.y-this.speed;
}
//东南
if("DR".equals(dir)){
this.x=this.x+this.speed;
this.y=this.y+this.speed;
}
//西南
if("LD".equals(dir)){
this.x=this.x-this.speed;
this.y=this.y+this.speed;
}
//西北
if("LU".equals(dir)){
this.x=this.x-this.speed;
this.y=this.y-this.speed;
}
12.创建游戏结束方法
//关闭游戏 退出游戏
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//退出游戏
System.out.println("Game Over!!!");
System.exit(0);
}
});
13.GameClient中start方法中创建监听键盘系统
//监听键盘系统
this.addKeyListener(new KeyAdapter() {
//键盘按下触发
@Override
public void keyPressed(KeyEvent e) {
//获取被按下键对应的数值 如a:67 b:68
int keyCode=e.getKeyCode();
switch(keyCode){
case KeyEvent.VK_UP:
System.out.println("向上走!!!");
//向上箭头,给人物的方向设置为向上
buffoon.setDir("UP");
break;
case KeyEvent.VK_DOWN:
System.out.println("向下走!!!");
buffoon.setDir("DOWN");// //向下箭头,给人物的方向设置为向下
break;
case KeyEvent.VK_LEFT:
System.out.println("向左走!!!");
buffoon.setDir("LEFT");//向左箭头,给人物的方向设置为向左
break;
case KeyEvent.VK_RIGHT:
System.out.println("向右走!!!");
buffoon.setDir("RIGHT");//向右箭头,给人物的方向设置为向右
break;
}
buffoon.move(buffoon.getDir());//人物移动
}
//键盘释放松开
@Override
public void keyReleased(KeyEvent e) {
buffoon.setDir("STOP");
}
});
14.小丑(类)里创建移动方向的属性
//人物方向
private String dir;
15.小丑(类)里把移动方向放在参数方法里赋值
this.dir="STOP";//表示人物刚创建的时候是静止的
16.移动方向创建get和set方法
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
17在小丑(类)移动方向方法点调GameClient键盘系统里
buffoon.move(buffoon.getDir());//人物移动
18创建一个thread类,接口Runnable方法,创建游戏端属性以及构造参数
public class RepaintThread implements Runnable {
//游戏窗体
private GameClient gameClient;
//通过构造
public RepaintThread(GameClient gameClient) {
this.gameClient = gameClient;
}
19.thread类中创建run方法,重新绘制图像,控制秒数
while (true){
try {
Thread.sleep(50);
//重新绘制图像
gameClient.repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
20.GameClient(类)start方法里里开启重新绘制线程,创建车间工人
//开启重新绘制线程
RepaintThread repaintThread=new RepaintThread(this);
//创建车间工人
Thread thread=new Thread(repaintThread);
//工人听取调度
thread.start();
21防抖动,防闪屏
/**
* 防抖动,防闪屏
*/
@Override
public void update(Graphics g) {
// 创建图形缓冲区
Image imageBg = createImage(1100,700);
// 获取图形缓冲区的上下文
Graphics newGraphics = imageBg.getGraphics();
// 用paint方法对图形缓冲区绘图
paint(newGraphics);
// 释放图形上下文资源
newGraphics.dispose();
// 将图形缓冲区绘制到屏幕上
g.drawImage(imageBg, 0, 0 , 1100,700, this);
22.小丑类里创建属性四个方向都没有按下
//默认四个方向,都没有被按下
boolean up=false;
boolean right=false;
boolean left=false;
boolean down=false;
23.小丑类里创建监听键盘系统(按下确定人物方向)
/**
* 键盘按下确定人物移动方向
*/
public void okDirPressed(int keyCode){
//TODO 确定方向
switch(keyCode){
case KeyEvent.VK_UP:
System.out.println("向上走!!!");
//向上箭头,给人物的方向设置为向上
this.setDir("UP");
up=true;
break;
case KeyEvent.VK_DOWN:
System.out.println("向下走!!!");
this.setDir("DOWN");// //向下箭头,给人物的方向设置为向下
down=true;
break;
case KeyEvent.VK_LEFT:
System.out.println("向左走!!!");
this.setDir("LEFT");//向左箭头,给人物的方向设置为向左
left=true;
break;
case KeyEvent.VK_RIGHT:
System.out.println("向右走!!!");
right=true;
this.setDir("RIGHT");//向右箭头,给人物的方向设置为向右
break;
24.小丑类里创建监听键盘系统(按下确定人物方向)
/**
* 按键松开时,确定人物方向
* @param keyCode
*/
public void okDirReleased(int keyCode){
switch(keyCode){
case KeyEvent.VK_UP:
up=false;
break;
case KeyEvent.VK_DOWN:
down=false;
break;
case KeyEvent.VK_LEFT:
left=false;
break;
case KeyEvent.VK_RIGHT:
right=false;
break;
}
}
25.游戏段里引用小丑类里的监听键盘系统
//监听键盘系统
this.addKeyListener(new KeyAdapter() {
//键盘按下触发
@Override
public void keyPressed(KeyEvent e) {
//获取被按下键对应的数值 如a:67 b:68
int keyCode=e.getKeyCode();
//调动人物的 确定方向 方法
buffoon.okDirPressed(keyCode);
buffoon.move(buffoon.getDir());//人物移动
}
//键盘释放松开
@Override
public void keyReleased(KeyEvent e) {
//获取键盘松开的值
int keyCode=e.getKeyCode();
buffoon.okDirReleased(keyCode);
}
26.小丑类里创建监听键盘系统(按下确定人物方向)判断用户到底按了哪个键位
//判断用户到底按了哪个键位
if(up&&right){
this.setDir("UR");
}
if(up&&left){
this.setDir("UL");
}
if(down&&right){
this.setDir("DR");
}
if(down&&left){
this.setDir("DL");
}
this.move((this.getDir()));
27.创建子弹(绿帽子)数组
//子弹数组
private List<Missile> missileList=new ArrayList<Missile>();
28.创建子弹的(绿帽子)get和set方法
public List<Missile> getMissileList() {
return missileList;
}
public void setMissileList(List<Missile> missileList) {
this.missileList = missileList;
}
29.创建子弹的(绿帽子)扔出去方法
/**
* 开火 发射子弹
*/
public Missile fire(){
return new Missile(this.x,this.y,this.gameClient);
}
30 在键盘控制系统里将扔子弹(帽子)方法放进去
case KeyEvent.VK_CONTROL:
//打桩
System.out.println("发子弹");
Missile missile=this.fire();
//将子弹扔到容器中
this.missileList.add(missile);
//看一看容器中有多少子弹了
System.out.println("this.missileList()="+this.missileList.size());
break;
}
31在游戏端方法里paint方法里画下子弹
//画子弹
int size=buffoon.getMissileList().size();
for(int i=0;i<size;i++){
//将容器中子弹拿出来
Missile missile=buffoon.getMissileList().get(i);
//画到屏幕上
missile.paint(g);
}
32.在子弹类里设置子弹发射方向方法
/**
* 子弹移动
* @param
*/
public void move(){
switch (this.dir){
case"UP":
this.y=this.y-this.speed;
break;
case"DOWN":
this.y=this.y+this.speed;
break;
case"LEFT":
this.x=this.x-this.speed;
break;
case"RIGHT":
this.x=this.x+this.speed;
break;
case"UR":
this.x=this.x+this.speed;
this.y=this.y-this.speed;
break;
case"DL":
this.x=this.x-this.speed;
this.y=this.y+this.speed;
break;
case"UL":
this.x=this.x-this.speed;
this.y=this.y-this.speed;
break;
case"DR":
this.x=this.x+this.speed;
this.y=this.y+this.speed;
break;
}
}
33.给小丑类里设置边界范围
/**
* 边界判断
*/
public void checkArea(){
if(x<190){
x=190;
}
if (y<25){
y=25;
}
if (x>851){
x=851;
}
if (y>420){
y=420;
}
}
34.设置的边界让其在人物移动时候执行(在人物移动下点方法)
checkArea();
35.优化属性
/**
* 窗体宽度
*/
public static final int CLIENT_WIDTH=1100;
/**
* 窗体高度
*/
public static final int CLIENT_HEIGHT=700;
/**
* 人物尺寸
*/
public static final int Buffoon_SIZE=50;
/**
* 人物移动速度
*/
public static final int Buffoon_SPEED=5;
/**
* 人物的x轴
*/
public static final int Buffoon_X=500;
/**
* 人物的y轴
*/
public static final int Buffoon_Y=300;
/**
* 子弹尺寸
*/
public static final int Missile_Size=25;
/**
* 子弹移动速度
*/
public static final int Missile_Speed=5;
/**
* 0墙的X轴
*/
public static final int Wall_X=300;
/**
* 墙的y轴
*/
public static final int Wall_Y=80;
/**
* 1墙的X轴
*/
public static final int Wall1_X=800;
/**
* 墙的y轴
*/
public static final int Wall1_Y=50;
/**
* 2墙的X轴
*/
public static final int Wall2_X=300;
/**
* 墙的y轴
*/
public static final int Wall2_Y=350;
/**
* 3墙的X轴
*/
public static final int Wall3_X=800;
/**
* 墙的y轴
*/
public static final int Wall3_Y=350;
/**
* 4墙的X轴
*/
public static final int Wall4_X=500;
/**
* 墙的y轴
*/
public static final int Wall4_Y=260;
/**
* 墙宽度
*/
public static final int Wall_WIDTH=80;
/**
* 墙高度
*/
public static final int Wall_HEIGHT=20;
/**
* 墙1宽度
*/
public static final int Wall1_WIDTH=80;
/**
* 墙1高度
*/
public static final int Wall1_HEIGHT=80;
/**
* 爆炸物宽度
*/
public static final int Explode_Width=80;
/**
* 爆炸物高度
*/
public static final int Explode_HEIGHT=30;
/**
* 爆炸物的x轴
*/
public static final int Explode_X=200;
/**
* 爆炸物的y轴
*/
public static final int Explode_Y=300;
本文地址:https://blog.csdn.net/cb9165/article/details/109626241
上一篇: 基础--最简单明了的拆箱装箱解释,带实例
下一篇: Spring 的 AOP 简介