超级玛丽游戏开发(角色与敌人的互动)
目录
1.与敌人的撞击,生命减少
2.马里奥踩踏敌人,敌人死亡
角色移动时遇到障碍物无法穿过,需要进行跳跃,角色撞击砖块的时候你,砖块被消除;角色遇到敌人的时候生命值-1,角色踩到敌人的时候敌人被消灭掉。
/*
* 内部类检测撞击
* */
private class Collide implements Runnable{
private Thread collideThread;
private long t1,t2;
public Collide(){
collideThread = new Thread(this);
collideThread.start();
t1 = t2 = 0;
}
@Override
public void run() {
while(true){
List enemies = bg.getEnemies();
for(int i=0; i 500){
mario.decreaseLife();
if(mario.life==0){
endGame();//结束界面
return;
}
t1 = t2;
}
}
}
}
}
/*
* 检测是否与enemy撞击
* 撞击返回true,没有撞击返回false
* */
public boolean collide( Enemy enemy){
if(mario.posx>=enemy.getX()&&mario.posx<=enemy.getX()+enemy.getWidth()
&&mario.posy+60>=enemy.getY()&&mario.posy+60<=enemy.getY()+enemy.getHeight()){
return true;
}
return false;
}
}
endGame:
/*
* 结束游戏
* */
public void endGame(){
marioDead = true;
this.removeKeyListener(this);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.getContentPane().removeAll();//清除原来的组件
buffg.fillRect(0, 0, this.getWidth(), this.getHeight());
buffg.drawImage(new ImageIcon(StaticValue.endImg).getImage(), 0, 0, this.getWidth(),this.getHeight(), null);
g.drawImage(buffimg,0,0,null,null);
}
matio和界面、Colide线程的控制:
①Mario:
减少生命的方法
/*
* 生命值减少
* */
public void decreaseLife(){
life --;
if(life == 0){
dead = true;//标记线程终止循环
}
}
run方法:用volatile的boolean变量dead标记
/*
* 在线程里面移动角色
* */
public void run(){
while(!dead){
posx += dx;
if(posx<0)
posx=0;
if(posx>screenWidth-50)
posx = screenWidth-50;
switchN--;
if(switchN==0){
index = (index+1)%4;
switchN = 5;
}
try {
Thread.sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
②Collide的run方法:当检测到life==0直接结束run方法
@Override
public void run() {
while(true){
List enemies = bg.getEnemies();
for(int i=0; i 500){
mario.decreaseLife();
System.out.println("decrease life, life now:"+mario.life);
if(mario.life==0){
System.out.println("quit thread in collide");
endGame();//结束界面
return;
}
t1 = t2;
}
}
}
}
}
③MFrame里面: 用volatile的boolean变量marioDead标记
/*
* 在线程里面绘制图片
* */
@Override
public void run() {
// TODO Auto-generated method stub
List enemies = bg.getEnemies();
List
Collide的run内:
@Override
public void run() {
while(true){
List enemies = bg.getEnemies();
for(int i=0; i 500){
if(mario.dy > 0&&enemy.getdy() == 0){//踩踏敌人,排除食人花(上下移动)
enemy.dead();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
enemies.remove(i);//将敌人从背景中删除
}
else{//撞到敌人
mario.decreaseLife();
if(mario.life==0){
endGame();//结束界面
return;
}
t1 = t2;
}
}
}
}
}
}
/*
* 敌人死亡终止线程
* */
public void dead(){
dead = true;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
enemies.remove(i);//将敌人从背景中删除