网站形式的设计,惠州关键词排名推广,短视频seo优化,俄语 俄文 俄罗斯语外贸网站建设一、游戏开发思路#xff1a;
1.Frame---BackGround---Obstacle----BufferedImage#xff0c;人物等 2.BackGround的构造函数#xff1a;
只要记住窗口里边的每一个场景#xff0c;只要游戏一开始就已经出现在屏幕里边的#xff0c;都是在构造函数里边
3.绘…一、游戏开发思路
1.Frame---BackGround---Obstacle----BufferedImage人物等 2.BackGround的构造函数
只要记住窗口里边的每一个场景只要游戏一开始就已经出现在屏幕里边的都是在构造函数里边
3.绘制上地面
上地面要铺满整个第一关背景图片由于BackGround的宽度为800一个上地面的图片的宽度为30所以要进行27次循环才能把BackGround的宽度铺满
4.Obstacle类
要有坐标以及当前是什么障碍物类型图片的显示以及当前的场景对象用于关联每一关的不同的障碍物对象 //用于表示当前的坐标private int x;private int y;//用于记录障碍物类型private int type; //type1 是上地面 type2是下地面//用于显示图像 !!!!private BufferedImage show null;//定义当前的场景对象 !!!private BackGround bg null;
5.把Obstacle类加载到BackGround里边由于每一关都有不一样的障碍物所以BackGround是和Obstacle相关联的在BackGround类里边设置一个存放障碍物的集合把我们原先已经定义好的Obstacle对象放到这个集合中去
6.马里奥类
用来获取障碍物的信息那个很重要 //用于表示横纵坐标private int x;private int y;//用于表示当前的状态private String status;//用于显示当前状态对应的图像private BufferedImage shownull;//定义一个BackGround对象用来获取障碍物的信息!!!private BackGround backgroundnew BackGround();//用于实现马里奥的动作private Thread threadnull;
二、游戏场景设计示例图
第一个场景: 分析图片
我们以结果为导向以项目要求为导向分析出整个项目的要求来进行游戏制作
以左上角为00起点
1.上地面
1位置
距离天空最上面的是420cm只有一排上地面
2.下地面
1位置
使用双重for循环来控制位置外层循环控制第几列内层循环控制生成一排的地面
一共有五层下地面---泥土每一排循环完之后还要再循环生成四排
3.水管
1位置 最上边的3和4是特殊的两个水管图片所以在for循环里边应该用if条件判断来单独画这两个的水管图片的位置-----怎么单独控制找他俩的共同点纵坐标都是360
4.砖块
1位置 说明这里的砖块的纵坐标有一点问题应该是
G的纵坐标是 240
A这一排的纵坐标是300
2是否可被破坏
其中
B、D、F是可被破坏的 ------ 对应type是0
不可被破坏的砖块 ------ 对应type是7
第二个场景 第三个场景 其他两关的设置是类似的这里先不再赘述了以后有时间再讲后两关的设计
三、马里奥人物设计
1.创建马里奥的类对象
1.关于马里奥自身的一些属性
1) 位置坐标
马里奥的XY坐标
2状态
表示马里奥当前是站立还是跳跃还是死亡
3状态图片
用于以后在MyFrame里边画出来画的图像就是马里奥类里边定义的这个图象
2.涉及到马里奥日后行为可能会涉及到的
4一个BackGround对象用于获取障碍物的信息
由于马里奥以后会撞碎可以撞碎的砖块也可以踩死怪物或者被怪物杀死或者被食人花杀死所以要定义一个障碍物的对象
5一个线程用于实现马里奥的动作
以后在这个游戏中会有同时怪物在动马里奥在移动食人花在不停的进出这些都属于是线程也就是说一个游戏里边同时有这几个移动的东西这些都需要用程序来控制他们
2.把马里奥画在窗口里边
只需要在窗口里边用graphics调用drawImage方法即可 但是由于我们把mario里边的坐标等变量属性设置成了private所以由于访问修饰符的限制private修饰的变量只允许在这个类里边访问那么我们怎么获取它的属性值呢
可以在类里边实现xy show的getter和setter方法
而为什么要把变量设置为private这就涉及到我们上次讲的javabean封装确保数据的安全性不会随便被别人修改
四、支撑知识点
1.自加运算符
比如a1
就相当于aa1
2.增强for循环
1用途用来遍历集合、数组
2分类 遍历集合 for(集合元素的类型 局部变量 : 集合对象) 内部代码仍然调用迭代器 for(Object obj : coll){ System.out.println(obj); } 遍历数组 for(数组元素的类型 局部变量 : 数组对象) for (int i : arr){ System.out.println(i); } 3.多线程重点和难点
但这里只简单学一下毕竟将给新生听的等到时候我出一个面经背诵和学习专栏就可能要研究深入一点了
深入学习多线程可参考多线程(看这一篇就够了,超详细,满满的干货)_线程csdn-CSDN博客
简单来讲就是一个程序同时做多件事情
五、代码展示
1.目前的MyFrame类代码
package com.View;import com.Constants.StaticValue;
import com.game.Mario;
import com.game.Obstacle;import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;public class MyFrame extends JFrame implements KeyListener {//为什么要存储场景 TODO惹//BackGround类的list里边全部是background类不是buffered图片要区别开来//用于存储 所有的背景private ListBackGround allBg new ArrayList();//用于存储 当前的背景private BackGround nowBg new BackGround();//用于双缓存//定义一个变量用于双缓存 TODO????????private Image offScreenImage null;//马里奥对象private Mario mario new Mario();//无参构造public MyFrame() {//设置窗口的大小为800*600this.setSize(800,600);//设置窗口的居中显示this.setLocationRelativeTo(null);//设置窗口的可见性this.setVisible(true);//设置点击窗口上的关闭键结束程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口大小不可变this.setResizable(false);//向窗口对象添加键盘监听器this.addKeyListener(this);//设置窗口名称this.setTitle(超级玛丽);//初始化图片StaticValue.init();//初始化马里奥mario new Mario(10,395);//创建全部的场景for(int i1;i3;i){allBg.add(new BackGround(i, i3? true:false));}//将第一个场景设置为当前的场景nowBg allBg.get(0);//绘制图像 进行图像的绘制repaint();}Overridepublic void paint(Graphics g) {if(offScreenImage null){offScreenImage createImage(800,600);}Graphics graphics offScreenImage.getGraphics();graphics.fillRect(0,0,800,600);//fillRect 用于在指定的矩形内绘制一个填充的矩形//绘制背景 将图像绘制到了缓冲区上graphics.drawImage(nowBg.getBgImage(), 0,0,this);//绘制障碍物for(Obstacle ob : nowBg.getObstacleList()){graphics.drawImage(ob.getShow(),ob.getX(),ob.getY(),this);}//绘制马里奥graphics.drawImage(mario.getShow(),mario.getX(),mario.getY(),this); //注意马里奥绘制要在g.drawImage之前//将缓冲区的图片绘制到窗口中g.drawImage(offScreenImage,0,0,this);}Overridepublic void keyTyped(KeyEvent e) {}Overridepublic void keyPressed(KeyEvent e) {}Overridepublic void keyReleased(KeyEvent e) {}public static void main(String[] args) {new MyFrame();}
}2.BackGround类
package com.View;import com.Constants.StaticValue;
import com.game.Obstacle;import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;//加载图片常量之后方便日后的使用
public class BackGround {//当前场景要显示的图片private BufferedImage bgImage null;//记录当前是第几个场景 玩到了第几关private int sort;//判断是否是最后一个场景private boolean flag;//空参构造//用于存放我们所有的障碍物private ListObstacle obstacleList new ArrayList();public BackGround() {}public BufferedImage getBgImage() {return bgImage;}public int getSort() {return sort;}public boolean isFlag() {return flag;}public BackGround(int sort, boolean flag) {this.sort sort;this.flag flag;if(flag) { //表示此时为最后一个场景bgImage StaticValue.bg2;}else{bgImage StaticValue.bg;}//只要记住窗口里边的每一个场景只要游戏一开始就已经出现在屏幕里边的都是在构造函数里边//判断是否是第一关if(sort1){//绘制第一关的地面上地面type1下地面type2for (int i 0; i 26; i) {obstacleList.add(new Obstacle(420,i*30,1,this));}for (int i 1; i 5; i) {for(int j 0; j 26; j){obstacleList.add(new Obstacle(420i*30,j*30,2,this));}}//绘制砖块Afor (int i 120; i 150; i30) {obstacleList.add(new Obstacle(300,i,7,this));}//绘制砖块B-Ffor (int i 300; i 570; i30) { //0是普通砖块 7是不能被破坏的砖块if(i360||i390||i480||i510||i540){obstacleList.add(new Obstacle(300,i,7,this));}else{obstacleList.add(new Obstacle(300,i,0,this));}}//绘制砖块Gfor (int i 420; i 450 ; i30) {obstacleList.add(new Obstacle(240,i,7,this));}//绘制水管for (int i 360; i 600 ; i25) {if(i360){ //纵坐标为360.最高的两个水管图片obstacleList.add(new Obstacle(i,620,3,this));obstacleList.add(new Obstacle(i,645,4,this));}else{obstacleList.add(new Obstacle(i,620,5,this));obstacleList.add(new Obstacle(i,645,6,this));}}}}public ListObstacle getObstacleList() {return obstacleList;}
}3.马里奥类
package com.game;import com.Constants.StaticValue;
import com.View.BackGround;import java.awt.image.BufferedImage;public class Mario implements Runnable{//用于表示横纵坐标private int x;private int y;//用于表示当前的状态private String status;//用于显示当前状态对应的图像private BufferedImage shownull;//定义一个BackGround对象用来获取障碍物的信息!!!private BackGround backgroundnew BackGround();//用于实现马里奥的动作private Thread threadnull;//马里奥的移动速度//马里奥的跳跃速度public Mario() {}public Mario(int x, int y) {this.x x;this.y y;show StaticValue.stand_R; //初始动作是向右站立this.statusstand-right;threadnew Thread(this); //创建线程thread.start();//启动线程}//马里奥向左移动//马里奥向右移动//马里奥向左停止//马里奥向右停止Overridepublic void run() {}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 BufferedImage getShow() {return show;}public void setShow(BufferedImage show) {this.show show;}
}4.障碍物类
package com.game;import com.Constants.StaticValue;
import com.View.BackGround;import java.awt.image.BufferedImage;public class Obstacle {//用于表示当前的坐标private int x;private int y;//用于记录障碍物类型private int type; //type1 是上地面 type2是下地面//用于显示图像 !!!!private BufferedImage show null;//定义当前的场景对象 !!!private BackGround bg null;public Obstacle(int y, int x, int type, BackGround bg) {this.y y;this.x x;this.type type;this.bg bg;show StaticValue.obstacle.get(type); //得到当前的障碍物类型在StaticValue第三十行左右}public int getX() {return x;}public int getY() {return y;}public int getType() {return type;}public BufferedImage getShow() {return show;}
}