5

超级玛丽之其他元素的填充_周杰伦本人的技术博客_51CTO博客

 1 year ago
source link: https://blog.51cto.com/u_15460453/5682302
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

超级玛丽之其他元素的填充

这篇文章我们接着实现超级玛丽这款游戏,上篇文章对超级玛丽游戏的背景界面和人物玛丽奥这个人物类做了编写,今天我们看看超级玛丽剩余的其他功能的实现

首先我们知道,马里奥任务艰巨,它不仅要打砖块,还要打怪,我们看看怎么定义敌人类

其实敌人和马里奥一样,都是人物类,本质都是控制一个图片的移动

public class Enemy {
    private int x;
    private int y;
    private int type;
    private boolean faceTo = true;
    private BufferedImage show;
}

x y 同样是相对位置,type表示敌人类,其中有食人花和小乌龟,BufferedImage是敌人的图片

那么怎么把敌人放入我们的画面中呢,首先定义个集合,创建敌人类,放入集合中

List<Enemy> enemyList = new ArrayList<>();
enemyList.add(new Enemy(400,322,true,1,this));

通过敌人类的构造方法,添加到集合中,然后同样是使用主类中的graphics对象加载出来

for (Enemy e : nowBg.getEnemyList()) {
            graphics.drawImage(e.getShow(),e.getX(),e.getY(),this);
        }

当然敌人也是可以移动的,移动和马里奥人物的移动逻辑是一样的,都是通过线程不断调用方法判断人物状态来做调节

我们看一下马里奥和敌人相遇的时候的逻辑,这时候我们需要遍历敌人集合,然后依次判断,当马里奥的高度比敌人高度高一点,并且x的值差不多相同的时候,就可以认定,马里奥踩在了敌人上边,这是判断敌人类型,如果是小乌龟,我们就认定把它踩死了,如果是食人花,自己死了

for (int i = 0;i < backGround.getEnemyList().size();i++) {
    Enemy e = backGround.getEnemyList().get(i);
    if (e.getY() == this.y + 30 && (e.getX() - 20 <= this.x && e.getX() + 30 >= this.x)) {
        if (e.getType() == 1) {
            e.death();
        }else if (e.getType() == 2) {
            death();
        }
    }

如果马里奥死了,显然游戏就结束了

if (mario.isDeath()) {
    JOptionPane.showMessageDialog(this,"游戏结束!");
    System.exit(0);
}

弹窗结束游戏

对于分数的定义,实现也比较简单,使用graphics设置就可以了,分数的累加是在踩死敌人的时候改变值

Color c = graphics.getColor();
graphics.setColor(Color.RED);
graphics.setFont(new Font("楷体",Font.BOLD,20));
graphics.drawString("当前的分数为: " + mario.getScore(),200,200);
graphics.setColor(c);

定义了Music了,然后主类启动的时候创建这个对象就可以了

public class Music {
    public Music() throws FileNotFoundException, JavaLayerException {
        Player player;
        String str = System.getProperty("/src/Music/music.wav");
        BufferedInputStream name = new BufferedInputStream(new FileInputStream(str));
        player = new Player(name);
        player.play();
    }
}

读取音频文件,创建Player对象,然后播放就可以了,实现比较简单

这篇文章说了敌人的创建、马里奥踩死敌人、分数的生成、音乐的加载等功能,通过对这个小游戏的开发,大多数是逻辑的实现,但是也有很多技术点,总体来说游戏开发可能会涉及到坐标、动作、运动轨迹等元素,这些东西和我们的数学知识也必不可分,我认为学好数学知识和具有空间想象能力有助于游戏的开发。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK