本来今天打算阅读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. VBS调用系统API

    如Beep的API声明为 Public Declare Function Beep Lib “kernel32″ Alias “Beep” (ByVal dwFreq As Long, ByVal d ...

  2. Linux Shell 小脚本经典收藏

    原文:http://www.cnblogs.com/Javame/p/3867686.html 1.在两个文件中找出相同的号码 diff -y xx.txt oo.txt | egrep -v &qu ...

  3. 深入理解HTTP协议(转) 浏览器和服务器如何通信(HTTP协议)

    http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  4. JRE与JDK

    Java源代码是以*.java的纯文本文件,可以使用任何文本编辑器编写,但不可以执行. JDK是Java语言的开发包,可以将*.java文件编译成可执行Java文件. 可执行Java程序需要JVM才可 ...

  5. python zookeeper 在 uwsgi中 watcher不生效

    def code_watcher(handle,type, state, path):     print "zk code watcher,path is: ",path #da ...

  6. LeetCode OJ 99. Recover Binary Search Tree

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  7. 数据库NULL和 ‘’ 区别

    NULL判断时 : IS NOT NULL ''判断时: !=''

  8. mongodb导出数据

    导出 -d  数据库名 -u 用户名 -p 密码 -c  要导出的表名 -o 要到出的文件地址及类型 C:\Users\Administrator>mongoexport -d fh -u we ...

  9. HDU1492/The number of divisors(约数) about Humble Numbers

    题目连接 The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory L ...

  10. 快学Scala-第四章 映射和元组

    知识点: 1.构造映射,映射是对偶的集合 val scores1 = Map("Alice" -> 10, "Bob" -> 7, "Ci ...