使用java写一个马里奥小游戏

一.游戏流程

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,则马里奥角色死亡。

- 如果敌人与马里奥角色的位置相交,则马里奥角色死亡。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的马里奥小游戏Java 代码,实现了基本的移动和跳跃功能: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MarioGame extends JFrame implements ActionListener { private static final int WIDTH = 800; private static final int HEIGHT = 600; private static final int GROUND_Y = 500; private static final int MARIO_WIDTH = 50; private static final int MARIO_HEIGHT = 50; private static final int MARIO_JUMP_HEIGHT = 100; private static final int MARIO_JUMP_SPEED = 10; private Timer timer; private boolean isJumping; private int jumpCount; private int marioX; private int marioY; private int marioSpeedX; private int marioSpeedY; public MarioGame() { setTitle("Mario Game"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); isJumping = false; jumpCount = 0; marioX = 0; marioY = GROUND_Y - MARIO_HEIGHT; marioSpeedX = 0; marioSpeedY = 0; timer = new Timer(20, this); timer.start(); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_LEFT) { marioSpeedX = -5; } else if (keyCode == KeyEvent.VK_RIGHT) { marioSpeedX = 5; } else if (keyCode == KeyEvent.VK_SPACE && !isJumping) { isJumping = true; jumpCount = 0; marioSpeedY = -MARIO_JUMP_SPEED; } } public void keyReleased(KeyEvent e) { int keyCode = e.getKeyCode(); if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) { marioSpeedX = 0; } } }); setFocusable(true); setVisible(true); } public void actionPerformed(ActionEvent e) { updateMarioPosition(); repaint(); } private void updateMarioPosition() { marioX += marioSpeedX; if (isJumping) { marioY += marioSpeedY; jumpCount++; if (jumpCount == MARIO_JUMP_HEIGHT / MARIO_JUMP_SPEED) { marioSpeedY = MARIO_JUMP_SPEED; } if (marioY >= GROUND_Y - MARIO_HEIGHT) { marioY = GROUND_Y - MARIO_HEIGHT; isJumping = false; } } } public void paint(Graphics g) { super.paint(g); g.setColor(Color.GREEN); g.fillRect(0, GROUND_Y, WIDTH, HEIGHT - GROUND_Y); g.setColor(Color.RED); g.fillRect(marioX, marioY, MARIO_WIDTH, MARIO_HEIGHT); } public static void main(String[] args) { new MarioGame(); } } ``` 这个马里奥小游戏实现了基本的移动和跳跃功能。玩家可以用左右箭头键控制马里奥的移动,用空格键控制马里奥的跳跃。游戏中有一个绿色的地面和一个红色的马里奥。玩家可以在地面上移动和跳跃,如果跳得太高会落回地面。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值