zoukankan      html  css  js  c++  java
  • Phaser小游戏

    本来今天打算阅读AngularJs源代码的,但是上头下来了任务,做个小霸王上面的那种接金蛋的游戏,想象最近系统的学习了一下gulp和之前熟悉了一遍的Phaser,于是就打算用这两个东西一起来做个demo了。

    虽然对白鹭比较熟悉,但是据说白鹭不支持键盘事件,所以就没有去考虑白鹭了。

    以下是文件目录:

      • dist:项目的输出路径,node服务器的静态文件服务目录,结构与src基本相同
      • node_module:node第三方包的安装路径
      • src: 
      • - assets:资源路径
      • - js:编写脚本的路径
      • - libs:第三方库路径
      • app.js:node 启动入口,主要作用是静态文件服务器,静态文件服务器的根目录是dist
      • gulpfile.js:gulp文件
      • package.json:nodejs包文件
      • rawsource.fla:用Flahs处理资源源文件

    demo花了半天时间的样子。

    主要的几个文件如下:

    var express = require("express");
    var morgan = require("morgan");
    var cors = require('cors');
    var path = require('path');
    var app = express();
    
    app.use(morgan('dev'));
    app.use(cors());
    app.use(express.static(path.join(__dirname,'/dist')));
    var PORT = 8080;
    app.listen(PORT, function(){
        console.log("app is listening on : "+PORT)
    })
    app.js
    {
      "name": "Coins",
      "version": "1.0.0",
      "description": "",
      "main": "gulpfile.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "cors": "^2.8.1",
        "express": "^4.14.0",
        "gulp": "^3.9.1",
        "gulp-develop-server": "^0.5.2",
        "gulp-imagemin": "^3.1.1",
        "gulp-minify": "0.0.14",
        "gulp-uglify": "^2.0.0",
        "mocha": "^3.1.2",
        "morgan": "^1.7.0"
      }
    }
    package.json
    var game;
    var speed = 6;
    var greenJellyfish;
    var jellyFishFrame = 0;
    
    var life = 5;
    var lifeLable, coinsLabel;
    var coins = 0;
    
    var itemTypes = ['item_blood','item_bomb','item_coin','item_dollar'];
    var items = [];
    var w;
    var h;
    function init() {
        game = new Phaser.Game(800,600, Phaser.AUTO,"Coins Game",{
            preload : preload,
            create : create,
            update : update
        });
    }
    
    function preload(){
        game.load.atlas('seacreatures','assets/seacreatures_json.png','assets/seacreatures_json.json');
        game.load.image('undersea','assets/undersea.jpg');
        game.load.image('item_blood','assets/item_blood.png');
        game.load.image('item_bomb','assets/item_bomb.png');
        game.load.image('item_coin','assets/item_coin.png');
        game.load.image('item_dollar','assets/item_dollar.png');
        game.load.image('icon_lives','assets/icon_lives.png');
        game.load.image('icon_money','assets/icon_money.png');
    }
    
    
    function create(){
        game.add.image(0, 0, 'undersea');
        greenJellyfish = game.add.sprite(game.world.centerX, 400, 'seacreatures', 'greenJellyfish0000');
           greenJellyfish.anchor.set(0.5,0.5);
           w = game.world.width;
           h = game.world.height;
           lastTime = Date.now();
           lifeLable = game.add.text(10,10,"Lives:5");
           coinsLabel = game.add.text(10,50,"Coins:0");
       // game.input.onDown.add(changeFrame, this);
    }
    var lastTime = 0;
    var spf = 1000/40;
    /**
    function changeFrame(){
        
    }
    */
    function update(){
        if( Date.now() - lastTime < spf){
            return;
        }
        lastTime = Date.now();
    
        jellyFishFrame++;
        if(jellyFishFrame >= 39){
            jellyFishFrame = 0;
        }
        greenJellyfish.frameName = 'greenJellyfish00'+ (jellyFishFrame >= 10 ? jellyFishFrame : "0"+jellyFishFrame);
    
        if (game.input.keyboard.isDown(Phaser.Keyboard.LEFT))
        {
            if(greenJellyfish.x > 50){
                greenJellyfish.x -= speed;
            }
           
            greenJellyfish.angle = -15;
        }
        else if (game.input.keyboard.isDown(Phaser.Keyboard.RIGHT))
        {
            if(greenJellyfish.x < game.world.width - 50){
                greenJellyfish.x += speed;
            }
            greenJellyfish.angle = 15;
        }
        else
        {
            greenJellyfish.rotation = 0;
        }
    
        var len = items.length;
        var item;
        for(var i = len-1; i >= 0; i--){
            item = items[i];
            if(distance(item, greenJellyfish)<=40){
                gainItem(item);
                game.world.remove(item);
                items.splice(i,1);
            }else{
                item.gravity++;
                item.y += item.gravity;
                if( item.y>h){
                    game.world.remove(item);
                    items.splice(i,1);
                }
            }
        }
    
        if(items.length < 2){
            genItem();
        }
    }
    
    function genItem(){
        var type = Math.floor(Math.random()*4);
        var itemType = itemTypes[type];
        var item = game.add.sprite(w*Math.random(), -80,itemType);
        item.anchor.set(0.5,0.5);
        item.speed = Math.random()*2;
        item.gravity = Math.random();
        if( type == 0){
            item.type = 0;
            item.value = 1;
        }else if(type == 1){
            item.type = 0;
            item.value = -1;
        }else if(type == 2 || type == 3){
            item.type = 1;
            item.value = type == 2 ? 5 : 10;
        }
        items.push(item);
    }
    
    function gainItem(item){
        var type = item.type;
        var value = item.value;
        if( type == 0 ){
            life += value;
            lifeLable.text = "Lives:"+life;
        }else{
            coins += value;
            coinsLabel.text = "Coins:"+coins;
        }
    }
    
    function distance(a,b){
        var dx = a.x - b.x;
        var dy = a.y - b.y;
        return Math.sqrt(dx*dx+dy*dy);
    }
    src/js/game.js

    游戏的主体逻辑编写的地方。

    由于Phaser没有设置帧率的方法,所以用了个小手段来控制帧率:

    var lastTime = 0;
    var spf = 1000/30;//millseconds per frame
    function update(){
        if( Date.now() - lastTime < spf){
            return;
        }
        lastTime = Date.now();
    }
    var gulp = require("gulp")
    var minify = require("gulp-minify");
    var uglify = require("gulp-uglify");
    var imagemin = require("gulp-imagemin");
    var server = require("gulp-develop-server");
    
    gulp.task("script", function(){
        gulp.src('./src/js/*.js')
        .pipe(minify())
        .pipe(uglify())
        .pipe(gulp.dest('./dist/js/'));
    });
    
    gulp.task("auto", function(){
        gulp.watch('./src/js/**/*.js',["script"]);
        gulp.watch('./src/assets/**/*.png',["image"]);
    });
    
    gulp.task("move", function(){
        gulp.src('./src/assets/*.*')
        .pipe(gulp.dest('./dist/assets'));
    
        gulp.src('./src/libs/*.*')
        .pipe(gulp.dest('./dist/libs'));
    });
    
    gulp.task("image", function(){
        gulp.src('./src/assets/*.png')
        .pipe(imagemin())
        .pipe(gulp.dest('./dist/assets/'));
    });
    
    gulp.task("server:start", function(){
        server.listen({path:'./app.js'});
    });
    
    gulp.task("server:restart", function(){
        gulp.watch(['./app.js'],server.restart);
    });
    
    gulp.task('default', ['script','image','move','server:start','auto']);
    gulpfile.js

    gulp用到了minify,uglify来处理js文件以及通过gulp-develop-server来启动node服务。

    这种架构对于正式的项目来讲应该也是适用的。

    效果图如下:

    服务端也基本可以看到前端的js错误,静态文件的传输记录等等:

    完整项目包:Coins.7z

    以上,算是对近期的一些学习的知识的一点总结。

  • 相关阅读:
    Oracle列转行函数使用
    JavaScript笔记整理
    23种设计模式之桥梁模式
    23种设计模式之状态模式
    23种设计模式之解释器模式
    23种设计模式之备忘录模式
    23种设计模式之访问者模式
    23种设计模式之观察者模式
    23种设计模式之组合模式
    23种设计模式之适配器模式
  • 原文地址:https://www.cnblogs.com/adoontheway/p/6026640.html
Copyright © 2011-2022 走看看