发现很多人玩h5小游戏,感觉比较有意思,加上目前在项目中没什么很忙的事情,然后就想研究一下h5小游戏。在网上搜索了一下,有人推荐使用白鹭引擎(Egret),但是我下载下来之后一直打不开,不知道什么情况。后来在网上发现了一个js框架phaser,然后就尝试了一下。本次是记录一下使用phaserjs开发h5小游戏的过程。内容很简单,暂时没有复杂的东西


HTML5互动小游戏代码 h5互动小游戏开发_phaserjs开发

一、开发前

首先要在Phaser官网下载使用的js文件(正常开发下载压缩版phaser.min.js即可)。

二、开发中

html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="phaser.min.js"></script>
</head>
<body>
<div id="game"></div>
</body>
</html>

在html中那一行div是用来渲染页面使用的。(后来发现好像没有也可以,目前还未发现问题)

js代码

在引入js文件,我们可以编写js代码:

var game = new Phaser.Game(800, 400, Phaser.CANVAS, 'game', {preload: load, create: create, update: update});

首先了解Phaser.Game()内参数分别是什么意思,(好像后面还有几个参数,但是不常用所以也就不说了)

Phaser.Game(width, height, renderer, parent, state)

宽(px)、高(px)、渲染方式(还有Phaser.WEBGL,Phaser.AUTO)[虽然不太很了解]、放置canvas元素的父元素(即html中div的id)、我自己理解的场景的生命周期。(这个宽高是不带引号的,当时我不小心加了引号一直黑屏,好像不报错,我也忘了,找了半天)
关于那个我理解的生命周期(preload、create。update):

  1. preload: 用来加载资源(什么图片、背景之类的),最先执行。
  2. create: 初始化场景,preload加载完之后执行。
  3. update: 最后执行,时时刻刻都在走这个方法(我认为就是你游戏中比如移动能看出来,因为这个方法一直在走)。

然后我们开始写这些生命周期内的具体实现:
preload内

function load() {
    game.load.image('star', 'assets/star.png');
    game.load.image('sky', 'assets/sky.png');
    game.load.image('ground', 'assets/platform.png');
    game.load.spritesheet('dude', 'assets/dude.png', 32, 48);
}

这是加载游戏内的图片资源,星星,天空(背景),地面(还有图中的两块板),小人。
第一个参数是一个名字,后面在create里添加到游戏中使用这个名字,第二个参数是图片的路径。
为什么小人和其他图片的写法不一样呢?因为小人不是一张普通的图(哈哈),而是一张精灵序列图(好像不太明白,类似于这种图,自行百度吧)。使用这个东西可以拆分该图得到多个帧(好吧 我理解是这样)。最后两个参数为图片的宽和高。这个图片是288 * 48的,水平宽有9个小人,这样32* 48就得到一个小人了(注意 也没有引号)。

create内:

function create() {
        game.physics.startSystem(Phaser.Physics.ARCADE);
        game.add.sprite(0, 0, 'sky');
        platform = game.add.group();//创建一个组,将地和板都加入组内
        platform.enableBody = true;//给这个组打开物理引擎
        var ledeg = platform.create(450, 230, 'ground');
        ledeg.body.immovable = true;
        ledeg = platform.create(-130, 150, 'ground');
        ledeg.body.immovable = true;
        var ground = platform.create(0, game.world.height-30, 'ground');
        ground.body.immovable = true;
        ground.scale.setTo(2, 1);
        player = game.add.sprite(150, game.world.height-100, 'dude');
        game.physics.arcade.enable(player);
        player.body.gravity.y = 100;
        player.body.collideWorldBounds = true;
        player.animations.add('left', [0, 1, 2, 3], 10, true);
        player.animations.add('right', [5, 6, 7, 8], 10, true);

        cursors = game.input.keyboard.createCursorKeys();//键盘方向键

        stars = game.add.group();
        stars.enableBody = true;
        for(var i = 0;i<12;i++){
            var star = stars.create(i * 60, 0, 'star');
            star.body.gravity.y = 250;
            star.body.bounce.y = 0.7 + Math.random() * 0.2;
        }

        scoreText = game.add.text(10, 20, 'score:0', {fontSize: '32px', fill: '#000'});
    }

解释一下部分代码什么意思。
第一行是开启游戏内的物理引擎,意思是开启后游戏内对象可以设置符合物理定律。(我注释掉这一行,到最后也没发现有什么问题,其他该走走,有大佬知道的指点一下)
game.add.sprite(0, 0, ‘sky’);这个是在游戏内添加上图片,上面preload加载了,这是初始化就可以看到了,但是这里有个坑,要注意的是先后顺序,后面添加的会把前面添加的盖住,有可能你觉得没有问题,为什么看不到你加上的图片,原因很可能是后面的图片把前面的挡住了。
代码中包含enable的意思都是要开启物理引擎,否则没法使用body属性,immovable是控制地面和板不可移动,因为不设置的话,小人碰到会移动。还有剩下的就不解释了,太多了,在我源码里也都做了解释。

update内:

function update() {
    game.physics.arcade.collide(player, platform);
    game.physics.arcade.collide(stars, platform);
    game.physics.arcade.overlap(player, stars, collectStar, null, this);
    if(cursors.left.isDown){
        player.body.velocity.x = -100;//向左的时候 添加一个速度水平,向左为负
        player.animations.play('left');
    }else if(cursors.right.isDown){
        player.body.velocity.x = 100;
        player.animations.play('right');
    }else {
        player.body.velocity.x = 0;
        player.frame = 4;//图片停在第四帧(frame属性)
    }
    if(cursors.up.isDown && player.body.touching.down){
        player.body.velocity.y = -200;
    }
    function collectStar(player, star) {
        star.kill();//杀死星星,碰撞后销毁(收集)
        score += 10;
        scoreText.text = 'score:' + score;
    }
}

以上代码完全可以实现小游戏了,基本无需源码。当然我还是要吗源码上传一下。。

开发后

上面就是我学习的一个简单游戏的制作过程,内部很多方法基本都遵循物理定律,如果你觉得它有可能违背了,那么你可能代码写的有问题了 哈哈。