本来今天打算阅读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

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

Phaser小游戏的更多相关文章

  1. phaser小游戏框架学习(一)

    这两天由于项目的需要,所以简单学了一下phaser框架. 官网:http://phaser.io/ 还有一个phaser小站,是中文的网站,但是内容不如英文文档全,大家也可以去看这个网站,需要查阅AP ...

  2. phaser小游戏框架学习中的屏幕适配

    这篇博客主要讲一下上一篇博客的右侧和底部出现的问题.就是页面会有偏移量.说一下这个产生的原因吧. 一开始在构建html页面的时候,习惯性的在页面中加了 <meta name="view ...

  3. phaser小游戏框架学习(二)

    今天继续学习phaser.js.上周写的学习教程主要内容是创建游戏场景,游戏中的显示对象,按钮对象的使用以及如何在不同屏幕大小中完美适配.这篇博客以介绍游戏榜单的渲染更新为主. 代码地址:https: ...

  4. phaser3 微信小游戏入门

    phaser与eget, laya, pixi.js本质上没什么区别. 都是渲染引擎.  其它的都是配角.  phaser的特点是.代码容易理解 功能比较全面. 个人比较喜欢phaser的地方 twe ...

  5. phaser3 微信小游戏若干问题

    纯属个人兴趣, 如有兴趣可共同参与维护. git: https://gitee.com/redw1234567/phaser3_wx image的地方需要修改,代码贴上 var ImageFile = ...

  6. phaser2 微信小游戏入手

    phaser2小游戏基本没什么什么问题,可以下常开发游戏.如果遇到什么问题, 可以提出来共同讨论. 下面来个例子 import './lib/weapp-adapter'; import Phaser ...

  7. 重拾H5小游戏之入门篇(二)

    上一篇,水了近千字,很酸爽,同时表达了"重拾"一项旧本领并不容易,还有点题之效果.其实压缩起来就一句话:经过了一番记忆搜索,以及try..catch的尝试后,终于选定了Phaser ...

  8. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  9. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

随机推荐

  1. 你需要简单了解JVM中的内存长什么样子

    下面有关JVM内存,说法错误的是? 1.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的 2.Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接 ...

  2. 一起来用css画画

    hello,大白来了... <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> ...

  3. hdu_5791_Two(DP)

    题目链接:hdu_5791_Two 题意: 给你两串数列,问你相同的子序列有多少个,要注意,可以重复,比如1 和1 1 1 ,相同的子序列为3个 题解: 就和求最长公共子序列差不多,只不过要全部加起来 ...

  4. Concepts and Tricks In CNN

    转自:http://blog.cvmarcher.com/posts/2015/05/17/cnn-trick/ 这篇文章主要讲一下Convolutional Neural Network(CNN)里 ...

  5. doclint in jdk8

    http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html Turning off doclint in JDK 8 ...

  6. zabbix metrics

    http://blog.csdn.net/hengyunabc/article/details/44072285

  7. 转 Oracle DBCA高级玩法:从模板选择、脚本调用到多租户

    但凡是学过Oracle的同学,对DBCA(Database Configuration Assistant, DBCA)都不会陌生,有了这个工具,使得创建数据库成为可能.而DBCA本身有图形和静默两种 ...

  8. 1.2 eclipse使用 :working set

    working set可以是相当于文件夹~~有多个project时, 分别存放在不同的 workingset下,可以方便管理 新建或编辑 working set时,需要记住选择project *可参照 ...

  9. C++ 学习之函数重载、基于const的重载

    函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载.注意函数重载不能基于不同的返回值类型进行重载. 注意函数重载中的"形参表"不 ...

  10. 格式化格林威治时间(Wed Aug 01 00:00:00 CST 2012)

    1.如果格林威治时间时间是date类型.(这种格式最简单)       SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd") ...