phaser游戏开发笔记

作者: Cuckoos定投笔记 | 来源:发表于2018-08-04 09:35 被阅读2次

    这段时间突然来了点兴趣,不如做做一些简单的小游戏开发。也算练练手
    预览地址

    0 前提

    对nodejs,git有一点点了解。

    1 游戏引擎的选择

    目标是一个html5小游戏,在这方面可以利用很多成熟的游戏引擎,比如国内大名鼎鼎的egret,还有一直大名鼎鼎的Cocos2d,当然还有在国外大行其道的phaser。我自己算是都体验过这三大引擎吧,个人非常喜欢egret,因为它基本上提供了游戏开发的全套工具。这次呢,我选择了phaser游戏引擎,因为这个游戏引擎真的很简单,可以说什么都不用安装就可以开始开发啦。再加上本身就是自己的一次小小的折腾,那就这怎么快,怎么方便怎么来了。

    2 偷了一下懒,用下别人的高起点

    按照官方的教程,下载好phaser库文件以后,还需要去安装什么xampp,Apache服务器之类的东西,要不然看不到游戏的开发效果。当然这很重要。不过确实很懒,为了快速上手,就直接去git clone了人家的一个项目,搞定一切٩( •̀㉨•́ )و get!。

    git clone https://github.com/lean/phaser-es6-webpack
    

    这是大神的项目,实现了利用webpack对phaser游戏项目的开发和打包。

    这是项目的文件内容


    git下来的项目

    主要关注assets资源文件夹和src源代码文件夹

    开发时的代码都在src里面


    src文件夹

    这里主要关注main.js这是整个项目的入口文件。还有两个文件夹sprites和states。一个简单的游戏由各种状态组成,包括加载状态,游戏状态,结束状态等等,在这些状态里面通过各种精灵实现了画面的显示和游戏过程。


    简单的几个状态
    如名,boot代表启动时的状态,game是游戏进行时的状态,win表示你赢啦,lose表示你输啦。

    在phaser的每一个状态state里,都有init(), preload(), create(), update()几个函数,分别实现了状态的初始化,资源加载,游戏角色创建,以及更新。
    我的boot就是这么写的

    import Phaser from 'phaser'
    import config from '../config'
    
    export default class extends Phaser.State {
      init () {
        this.stage.backgroundColor = config.colorOrange
      }
    
      preload () {
        this.load.image('logo', './assets/images/an1.png')
        this.load.image('loadbar', 'assets/images/loader-bar.png')
      }
      
      create () {
        let an1 = this.add.sprite(this.game.width / 2, this.game.height / 2, 'logo')
        an1.width = this.game.width
        an1.height = this.game.height
        an1.anchor.set(0.5)
        
        let tx1 = this.add.text(20, 20, 'Go Home', {
          font: '50px',
          fill: config.colorYellow,
          align: 'center'
        })
        let tx2 = this.add.text(50, 70, 'Powered by Phaser Game Engine', {
          font: '10px',
          fill: config.colorYellow,
          align: 'center'
        })
        
        this.asset = this.add.sprite(0, this.game.height, 'loadbar')
        this.asset.width = this.game.width
        this.asset.anchor.setTo(0, 0.5)
        this.load.onLoadComplete.addOnce(this.onLoadComplete, this)
        this.load.setPreloadSprite(this.asset)
        
        this.load.image('mushroom', 'assets/images/mushroom2.png')
        this.load.image('an2', 'assets/images/an2.png')
        this.load.image('an3', 'assets/images/an3.png')
        this.load.image('an4', 'assets/images/an4.png')
        this.load.image('st1', 'assets/images/st1.png')
        this.load.image('st2', 'assets/images/st2.png')
        this.load.image('tr1', 'assets/images/tr1.png')
        this.load.image('tr2', 'assets/images/tr2.png')
        this.load.image('ho1', 'assets/images/ho1.png')
        this.load.image('ho2', 'assets/images/ho2.png')
        this.load.image('gr1', 'assets/images/gr1.jpg')
        // start load
        this.load.start()
      }
      
      onLoadComplete () {
        console.log('加载完成')
        this.state.start('Game')
      }
    }
    

    最后,各种状态都会在main文件中添加到状态管理器里面去,然后通过phaser对象实现对状态的控制。

    import 'pixi'
    import 'p2'
    import Phaser from 'phaser'
    
    import BootState from './states/Boot'
    import GameState from './states/Game'
    import WinState from './states/Win'
    import LoseState from './states/Lose'
    
    import config from './config'
    import eruda from 'eruda'
    eruda.init()
    
    let game
    
    const docElement = document.documentElement
    const width = docElement.clientWidth
    const height = docElement.clientHeight
    
    window.onload = function () {
      game = new Phaser.Game(width, height, Phaser.CANVAS, 'content', null)
      game.state.add('Boot', BootState, false)
      game.state.add('Game', GameState, false)
      game.state.add('Win', WinState, false)
      game.state.add('Lose', LoseState, false)
      
      game.state.start('Boot')
    }
    

    更具体的内容就在我的github里面啦https://github.com/zixusir/goHome

    写的不是特别好,还希望路过的江湖大神多多包涵指点。

    相关文章

      网友评论

        本文标题:phaser游戏开发笔记

        本文链接:https://www.haomeiwen.com/subject/azvpvftx.html