一.游戏流程
1.关卡一
2.关卡二
3.关卡三
成功摘下旗帜,游戏胜利。
若碰撞到怪物,游戏失败。
以上就是游戏的全部流程
二.人员分工
人员 | 负责部分 |
林广堉 | 素材读取,游戏窗口的设置,关卡背景的绘制。 |
林广堉 | 人物的动作,碰撞的检测 |
三.部分功能的实现
关卡背景与人物的绘制
@Override
public void paint(Graphics e){
if(offScreenImage == null){
offScreenImage = createImage(800,600);//与窗口大小一致
}
Graphics graphics = offScreenImage.getGraphics();
graphics.fillRect(0,0,800,600);//填充图像
graphics.drawImage(nowBg.getNowImage(),0,0,this);//绘制背景
//绘制敌人
for (Enemy enemy : nowBg.getEnemyList()) {
graphics.drawImage(enemy.getShowImage(), enemy.getX(), enemy.getY(), this);
}
for(Brick b:nowBg.getBrickList()){
graphics.drawImage(b.getShowbrick(),b.getX(),b.getY(),this);
}//绘制障碍物
//绘制旗杆和门,由于只在第三关出现,因此不额外创建类
graphics.drawImage(nowBg.getFlagPole(),500, 220, this);
graphics.drawImage(nowBg.getRainbowGate(),620, 320, this);
//绘制马里奥
graphics.drawImage(mario.getShowImage(), mario.getX(), mario.getY(), this);
//添加积分
Color c = graphics.getColor();
graphics.setColor(Color.BLACK);
graphics.setFont(new Font("黑体",Font.BOLD,25));
graphics.drawString("当前的分数为"+mario.getScore(),300,100);
graphics.setColor(c);//还原画笔色
e.drawImage(offScreenImage,0,0,this);//将图像放到窗口中
}
使用了graphics绘制图片,来完成地图,人物的构建。
Graphics.drawImage(Image img, int x,int y, int width, int height, Image Observer observer)绘制指定图像中已缩放到适合指定矩形内部的图像。参数:
img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何动作。
x - x 坐标。
y - y 坐标。
width - 矩形的宽度。
height - 矩形的高度。
observer - 当转换了更多图像时要通知的对象。
碰撞检测功能的实现
for(int i = 0;i<backGround.getBrickList().size();i++){
Brick brick = backGround.getBrickList().get(i);
//判断马里奥是否位于障碍物上
//判断条件 brick.Y == this.y + 25;this.x-30<brick.x<this.x+25
if(brick.getY() == this.y+25 && brick.getX()>this.x-30 &&brick.getX()<this.x+25){
onBrick = true;
}
//判断跳起来是否顶到方块
if ((brick.getY() >= this.y - 30 && brick.getY() <= this.y - 20) && (brick.getX() >this.x - 30 && brick.getX() < this.x +25)) {
if (brick.getType() == 5||brick.getType() == 6||brick.getType() == 12) {
backGround.getBrickList().remove(brick);
score += 1;
}
uptime = 0;
}
//向右是否碰到方块
if (brick.getX() == this.x + 25 && (brick.getY() > this.y - 30 && brick.getY() < this.y + 25)) {
canR = false;
}
//向左是否碰到方块
if (brick.getX() == this.x - 30 && (brick.getY() > this.y - 30 && brick.getY() < this.y + 25)) {
canL = false;
}
}
//马里奥碰撞死亡与杀死敌人
for (int i = 0; i < backGround.getEnemyList().size(); i++){//对敌人遍历
Enemy enemy = backGround.getEnemyList().get(i);
if (enemy.getY() == this.y + 20 && (enemy.getX() - 25 <= this.x && enemy.getX() + 35 >= this.x)){
if (enemy.getType() == 1){
enemy.death();
uptime = 3;
ySpeed = -10;
score+=2;
}else if(enemy.getType() == 2){
death();
}
}
if ((enemy.getX() + 35 > this.x && enemy.getX() - 25 < this.x) && (enemy.getY() + 35 > this.y && enemy.getY() - 20 < this.y)) {
death();
}
}
1. 障碍物碰撞检测:
- 通过遍历背景中的障碍物列表,检查马里奥角色与每个障碍物的位置关系。
- 如果马里奥角色位于障碍物上方,并且横向位置与障碍物相交,则认为马里奥角色在障碍物上。
- 如果马里奥角色的头部与障碍物底部相交,并且横向位置与障碍物相交,并且障碍物类型为5、6或12,则移除该障碍物并增加分数。
- 如果马里奥角色的右侧或左侧与障碍物相交,则限制马里奥角色向右或向左移动。
2. 敌人碰撞检测:
- 通过遍历背景中的敌人列表,检查马里奥角色与每个敌人的位置关系。
- 如果敌人位于马里奥角色的上方,并且横向位置与敌人相交,且敌人类型为1,则敌人死亡,马里奥角色向上跳跃并增加分数;如果敌人类型为2,则马里奥角色死亡。
- 如果敌人与马里奥角色的位置相交,则马里奥角色死亡。