使用多个.js文件处理多个阶段

时间:2016-12-28 21:21:06

标签: javascript phaser-framework

所以基本上,我想创建一个平台游戏或迷宫游戏(是的,非常基本的,因为我还在学习,反正不会有很多东西)。

我想要多个.js文件,每个文件处理不同的任务,例如:

  • main.js - 游戏菜单
  • level1.js - 游戏的第1级
  • level2.js - 游戏的第2级
  • winlose.js - 与游戏菜单类似,只显示您是赢还是输(可能重启 - >交换回main.js)

到目前为止我得到的是基本游戏(目前仍在main.js中)



var mainState = {
  preload: function() {
    game.load.image("player", "assets/player.png");
    game.load.image("wall", "assets/wall.png");
    game.load.image("coin", "assets/coin.png");
    game.load.image("enemy", "assets/lava.png");
  },

  create: function() {
    game.stage.backgroundColor = "#3598db";
    game.physics.startSystem(Phaser.Physics.ARCADE);
    game.world.enableBody = true;

    this.player = game.add.sprite(150, 50, "player");

    this.walls = game.add.group();
    this.coins = game.add.group();
    this.enemies = game.add.group();

    var level = [
      "xxxxxxxxxxxxxxxx",
      "x   x  x x     x",
      "x xxx xx   xxx x",
      "x xx     xxx x x",
      "x  x  xx     x x",
      "xx x x  x xxx  x",
      "x      x  x!  xx",
      "xxxxxxxxxxxxxxxx",
    ]

    for(var i = 0; i < level.length; i++) {
      for(var j = 0; j < level[i].length; j++) {
        if(level[i][j] == "x") {
          var wall = game.add.sprite(50*j, 50*i, "wall");
          this.walls.add(wall);
          wall.body.immovable = true;
        }
        else if(level[i][j] == "o") {
          var coin = game.add.sprite(50*j, 50*i, "coin");
          this.coins.add(coin);
        }
        else if(level[i][j] == "!") {
          var enemy = game.add.sprite(50*j, 50*i, "enemy");
          this.enemies.add(enemy);
        }
      }
    }

    cursors = game.input.keyboard.createCursorKeys();
  },

  update: function() {
    this.player.body.velocity.y = 0;
    this.player.body.velocity.x = 0;

    if (cursors.left.isDown) {
      this.player.body.velocity.x = -200;
    }
    if (cursors.right.isDown) {
      this.player.body.velocity.x = +200;
    }
    if (cursors.up.isDown) {
      this.player.body.velocity.y = -200;
    }
    if (cursors.down.isDown) {
      this.player.body.velocity.y = 200;
    }

    game.physics.arcade.collide(this.player, this.walls);
    game.physics.arcade.overlap(this.player, this.coins, this.takeCoins, null, this);
    game.physics.arcade.overlap(this.player, this.enemies, this.changeStage, null, this);
  },

  changeStage: function() {
    game.state.start("main"); //Swap to Level 2
    console.log("u win!");
  },
};

var game = new Phaser.Game(800, 400);
game.state.add("main", mainState);
game.state.start("main");
&#13;
&#13;
&#13;

目前编码为&#34;迷宫&#34;风格游戏,在它是平台游戏之前,这就是为什么可能是一些未使用的代码。 现在,问题是,我不知道如何使用多个.js文件并在Phaser中更改阶段。 我希望我写的所有内容都是可以理解的,如果没有,请随意提出,我会尽力解释! :)

提前谢谢。

2 个答案:

答案 0 :(得分:0)

首先,您需要为每个http创建js个文件。这些文件将遵循与states相同的模式,即每个文件都有自己的mainStatepreloadcreate方法。

然后在update结束时,您将所有这些mainState添加到游戏中(考虑到您的游戏状态文件的名称为stateslevel1.js,{ {1}})

level2.js

但在您的游戏可以访问这些文件之前,您必须将它们包含在winLose.js文件中。只需在var game = new Phaser.Game(800, 400); game.state.add("main", mainState); game.state.add("level1", level1); game.state.add("level2", level2); game.state.add("winlose", winLose); game.state.start("main"); 文件

之前添加所需的状态文件即可
index.html

请记住,您的状态必须在mainState之前添加,以便Phaser可以加载它们。

要更改状态,您只需使用

即可
mainState.js

答案 1 :(得分:0)

对于基于关卡的游戏,我不建议为每个级别使用单独的.js文件。如果你的游戏中的每个状态基本相同,除了关卡布局,并且大部分是相同的复制和粘贴代码,那么这不是一个好兆头。

更好的方法是,您可以在单独的.js或.json文件中声明每个级别的级别布局和其他变量,如下所示:

iptables -C

然后您可以拥有一个var MyLevelData = [ { title: "First level", timelimit: 100, layout: [ "xxxxxxxxxxxxxxxx", "x x x x x", "x xxx xx xxx x", "x xx xxx x x", "x x xx x x", "xx x x x xxx x", "x x x! xx", "xxxxxxxxxxxxxxxx" ] }, { title: "The second challenge", timelimit: 80, layout: [ "etc.", "etc." ] } ] 状态,并为级别nr添加变量。这种状态基本上是主要的游戏循环。

levelstate.js

你可以添加一个按钮进入下一个级别,调用类似这个功能

var LevelState = {
  levelindex: 0, // <- which level currently playing

  create: function() {
    var level = MyLevelData[this.levelindex].layout;
    //etc.

有关详细信息,请参阅this post on the Phaser forums