一、个人负责模块
控制马里奥的状态及其运动,检测马里奥的碰撞,并绘制场景中所需要的障碍物,如砖块、水管等,定义障碍物类的重置方法。
二、个人任务简述
1.控制马里奥的状态及其运动,检测马里奥的碰撞
1.1 构造Mario的有参构造器
传入马里奥的坐标位置,并初始化其图片、分数以及生命值,开始线程。
public Mario(int x,int y){
this.x = x;
this.y = y;
//初始化马里奥图片
this.showImage = StaticValue.allMarioImage.get(0);
this.score = 0;
this.life = 3;
this.t = new Thread(this);
t.start();
this.status = "right-standing";
}
1.2 控制马里奥的运动
这段代码主要描述了马里奥的速度和运动状态:左右移动、跳跃、下落、停止以及死亡。死亡时,如果生命值大于1,该场景重置;否则,马里奥彻底死亡,游戏结束。
public void leftMove(){
//移动速度
xmove = -5;
//改变状态
//如果当前已经是跳跃,应该保持原有状态,不能再改变
if(this.status.indexOf("jumping") != -1){
this.status = "left-jumping";
}else{
this.status = "left-moving";
}
}
public void rightMove(){
xmove = 5;
if(this.status.indexOf("jumping") != -1){
this.status = "right-jumping";
}else{
this.status = "right-moving";
}
}
public void leftStop(){
this.xmove = 0;
if(this.status.indexOf("jumping") != -1){
this.status = "left-jumping";
}else{
this.status = "left-standing";
}
}
public void rightStop(){
this.xmove = 0;
if(this.status.indexOf("jumping") != -1){
this.status = "right-jumping";
}else{
this.status = "right-standing";
}
}
public void jump(){
if(this.status.indexOf("jumping") == -1){
if(this.status.indexOf("left") != -1){
this.status = "left-jumping";
}
else{
this.status = "right-jumping";
}
ymove = -10;
upTime = 18;
}
}
//下落方法
public void down(){
if(this.status.indexOf("left") != -1){
this.status = "left-jumping";
}else{
this.status = "right-jumping";
}
ymove = 10;
}
//死亡方法
public void dead(){
this.life--;
if(this.life == 0){
this.isDead = true;
}
else{
this.bg.reset();
this.x = 0;
this.y = 480;
}
}
1.3 检测是否为最后一个场景
该段代码判断马里奥是否到达最后一关末,并判断旗子是否下落,如果是,则自动控制走到城堡,完整全部游戏,反之,马里奥待在旗帜下,处于向右静止状态。
if(this.bg.isFlag() && this.x >= 520){
this.bg.setOver(true);
if(this.bg.isDown()){
//降旗后马里奥开始移
this.status = "right-moving";
if(this.x < 580){
//向右
this.x += 5;
}
else{
if(this.y < 480){
//向下
this.y += 5;
}
this.x += 5;
if(this.x >= 780){
//游戏结束
this.setClear(true);
}
}
}
else{
//如果为最后一个场景,同时Mario的x坐标到了550,游戏结束
//自动控制马里奥
if(this.y < 420){
this.y += 5;
}
if(this.y >= 420){
this.y = 420;
this.status = "right-standing";
}
}
}
1.4 检测马里奥的碰撞与死亡
该段代码通过障碍物和马里奥两者坐标的之间的关系的判断,来决定马里奥是否与障碍物发生了碰撞,并且通过判断的结果来对马里奥和障碍物的状态进行相应的变化。当撞到障碍物的时候,根据障碍物的类型进行接下来的判断。
else{
boolean canLeft = true;
boolean canRight = true;
//能否跳跃标记
boolean onLand = false;
for(int i=0;i<this.bg.getAllObstruction().size();i++){
Obstruction ob = this.bg.getAllObstruction().get(i);
//不能向右移动
if(ob.getX()==this.x+60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){
if(ob.getType() != 3){
canRight = false;
}
}
//不能向左移动
if(ob.getX()==this.x-60 && (ob.getY()+50>this.y && ob.getY()-50<this.y)){
if(ob.getType() != 3){
canLeft = false;
}
}
//判断能否跳跃
if(ob.getY()==this.y+60 && (ob.getX()+60>this.x && ob.getX()-60<this.x)){
if(ob.getType() != 3){
onLand = true;
}
}
//判断马里奥跳跃时是否撞到障碍物
if(ob.getY()==this.y-60 && (ob.getX()+50>this.x && ob.getX()-50<this.x)){
//如果是砖块
if(ob.getType()==0){
//移除砖块
this.bg.getAllObstruction().remove(ob);
//保存到移除的障碍物中
this.bg.getRemoveObstruction().add(ob);
}
//如果是问号||隐藏的砖块
if((ob.getType()==4 || ob.getType()==3) && upTime > 0){
//增加分数
score += 10;
ob.setType(2);
ob.setImage();
}
upTime = 0;
}
}
//对敌人的判断
for(int i=0;i<this.bg.getAllEnemy().size();i++){
Enemy e = this.bg.getAllEnemy().get(i);
if((e.getX()+50>this.x && e.getX()-50<this.x) && (e.getY()+60>this.y && e.getY()-60<this.y)){
//马里奥死亡
this.dead();
}
if(e.getY()==this.y+60 && (e.getX()+60>this.x && e.getX()-60<this.x)){
if(e.getType() == 1){
e.dead();
this.upTime = 5;
this.ymove = -10;
//敌人死亡,增加分数
score += 10;
}
else if(e.getType() == 2){
this.dead();
}
}
}
if(onLand && upTime == 0){
if(this.status.indexOf("left") != -1){
if(xmove != 0){
this.status = "left-moving";
}else{
this.status = "left-standing";
}
}
else{
if(xmove != 0){
this.status = "right-moving";
}
else{
this.status = "right-standing";
}
}
}
else{
//上升状态
if(upTime != 0){
upTime--;
}
else{
this.down();
}
y += ymove;
}
if(this.y>600){
this.dead();
}
if(canLeft && xmove<0 || canRight && xmove>0){
x += xmove;
if(x<0){
x = 0;
}
}
}
//默认向右
int temp = 0;
//向左状态
if(this.status.indexOf("left") != -1){
temp += 5;
}
//判断是否移动
if(this.status.indexOf("moving") != -1){
temp += this.moving;
moving++;
if(moving==4){
this.moving = 0;
}
}
if(this.status.indexOf("jumping") != -1){
temp += 4;
}
//改变显示图片
this.showImage = StaticValue.allMarioImage.get(temp);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.绘制场景中所需要的障碍物,定义障碍物类的重置方法。
2.1 定义私有成员变量并构造Obstruction方法
//坐标
private int x;
private int y;
//控制旗子
private Thread t = new Thread(this);
//类型
private int type;
//初始类型
private int starttype;
//显示图片
private BufferedImage showImage = null;
//取得场景
private BackGround bg;
//构造方法
public Obstruction(int x,int y,int type,BackGround bg){
this.x = x;
this.y = y;
this.type = type;
this.starttype = type;
this.bg = bg;
setImage();
if(this.type == 11){
t.start();
}
}
该代码通绘制场景中所需要的障碍物,例如地面、砖块、水管等等,包括了障碍物的坐标,障碍物所需要显示的图片等。并且定义了障碍物类的重置方法,当马里奥死亡时,调用该方法。
2.2 定义障碍物类的重置方法和图片的改变
马里奥死亡时,调用reset方法,重置场景,根据状态,显示不同障碍物的图片。
//重置方法
public void reset(){
this.type = starttype;
this.setImage();
}
//根据状态改变显示图片
public void setImage(){
showImage = StaticValue.allObstructionImage.get(type);
}
2.3 重写线程run方法
当马里奥达到旗帜时,如果马里奥y坐标大于420,调用setDown方法,降下旗帜,反之,马里奥自动向下降落。
public void run() {
// TODO Auto-generated method stub
while(true){
if(this.bg.isOver()){
if(this.y < 420){
this.y += 5;
}
else{
this.bg.setDown(true);
}
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
课程设计感想
通过开发超级马里奥闯关小游戏,我深入学习了Java的图形界面和事件处理机制,更深刻了解了Java的面向对象编程思想,锻炼逻辑思维和编程能力的同时,也提高了解决问题的能力。在未来的学习中,我将继续学习Java编程,进一步完善该游戏的功能和细节,并继续开发更多的游戏,将所学知识应用到实际项目中。