post]
AppStore和Android市场情况
莫名其妙爆红的游戏
真的莫名其妙,笔者下这个游戏两次,第一次在豌豆荚排行榜看到这款游戏,名字怪怪的,下载下来尝试一下,没觉得有什么新颖的,还在思虑这是不是刷榜刷上去的,果断卸载了;周末的时候逛逛app store,突然看到排行榜首位是Dont Tap The White Tile(后更名panio tiles ),翻译一下不就是别踩到白块儿,笔者震惊了,太莫名其妙了,这东西是真的火,不是刷榜刷出来的!游戏玩家们心理真的难以捉摸,又捧红了一款游戏;
近期爆红的游戏
从flappy bird 到2048 再到 Dont Tap The White Tile,都是短平快的游戏,都是独立开发者做的,看来个人开发者还是有机会在游戏红海中获得一杯羹滴;同时笔者的博文系列也经历这三个游戏;
flappy bird游戏源代码揭秘和下载后续
2048游戏源代码解密和下载
Don’t Tap The White Tile游戏源代码解密和下载
跟风的笔者
笔者也是随波逐流,什么游戏火,就开源什么游戏代码,当然这不是一件坏事!于己于人都是受益的,各位童鞋多多支持呀。本系列总共三篇,代码未全部完成,这一篇完成了游戏的经典模式;
游戏源代码下载
运行demo需要配置好http://blog.csdn.net/touchsnow/article/details/19070665,暂不支持其他工具。demo是跨平台的,可移植运行android,ios,html5网页等,代码是基于javascript语言,cocos2d-x游戏引擎,CocosEditor手游开发工具完成的。(近期网络整顿 网盘都不给放 如果github进不去 请到群文件下载)
github下载:https://github.com/makeapp/cocoseditor-piano
不同平台下的效果图:
windows平台
html5平台
android平台
代码分析:(只挑选核心主代码分析,更多细节自行研究源码)
/**
* @GameName :
* Don't Tap The White Tile
*
* @DevelopTool:
* Cocos2d-x Editor (CocosEditor)
*
* @time
* 2014-04-27 pm
*
* @Licensed:
* This showcase is licensed under GPL.
*
* @Authors:
* Programmer: touchSnow
*
* @Links:
* http://www.cocos2d-x.com/ (cocos官方)
* https://github.com/makeapp (github)
* http://blog.csdn.net/touchsnow (csdn博客)
* http://blog.makeapp.co/ (官方博客)
* http://www.cocoseditor.com/ (建设中官网)
*
* @Contact
* 邮箱:zuowen@makeapp.co
* qq群:232361142
*
*/
START = 0;
OVER = 1;
var MainLayer = function () {
this.blockNode = this.blockNode || {};
this.gameStatus = START;
this.currentTime = 0;
this.lastScoreTime = 0;
};
MainLayer.prototype.onDidLoadFromCCB = function () {
if (sys.platform == 'browser') {
this.onEnter();
}
else {
this.rootNode.onEnter = function () {
this.controller.onEnter();
};
}
this.rootNode.schedule(function (dt) {
this.controller.onUpdate(dt);
});
this.rootNode.onTouchesBegan = function (touches, event) {
this.controller.onTouchesBegan(touches, event);
return true;
};
this.rootNode.setTouchEnabled(true);
};
MainLayer.prototype.onEnter = function () {
cc.log("game mode==" + GAME_MODE);
// return;
var winSize = cc.Director.getInstance().getWinSize();
this.blockWidth = winSize.width / 4;
this.blockHeight = winSize.height / 4;
this.scaleX = (this.blockWidth - 2) / 300;
this.scaleY = (this.blockHeight - 2) / 500;
this.moveNum = 0;
//piano music length
this.pianoListIndex = CITY_OF_SKY;
this.pianoLengthIndex = this.pianoListIndex.length;
this.pianoLength = 5; //init length 5
cc.log("length==" + this.pianoLength);
//tables
this.tables = new Array(this.pianoLengthIndex);
for (var j = 0; j < this.pianoLength; j++) {
var sprites = new Array(4);
var random = getRandom(4);
for (var i = 0; i < 4; i++) {
sprites* = this.newBlock(i, j, random);
}
this.tables = sprites;
}
*//score font
this.scoreLabel = cc.LabelTTF.create("0.00", "Arial", 70);
this.rootNode.addChild(this.scoreLabel);
this.scoreLabel.setPosition(cc.p(360, 1230));
this.scoreLabel.setAnchorPoint(cc.p(0.5, 0.5));
this.scoreLabel.setColor(cc.c3b(255, 20, 147));
this.scoreLabel.setZOrder(200);
};
MainLayer.prototype.newBlock = function (i, j, colorType) {
//simple block
var block = cc.Sprite.create("res/whiteBlock.png");
block.setPosition(cc.p(this.blockWidth / 2 + this.blockWidth * i, this.blockHeight / 2 + this.blockHeight * j));
block.setScaleX(this.scaleX);
block.setScaleY(this.scaleY);
block.setZOrder(100);
block.setAnchorPoint(cc.p(0.5, 0.5));
var color = "white";
if (j == 0) {
block.setColor(cc.c3b(0, 255, 0));
} else {
if (i == colorType) {
block.setColor(cc.c3b(30, 30, 30));
color = "black";
}
}
block.blockData = {col: i, row: j, color: color};
this.blockNode.addChild(block);
return block;
};
MainLayer.prototype.createTopOverNode = function () {
//top score node
this.scoreNode = cc.Node.create();
this.scoreNode.setPosition(cc.p(0, this.blockHeight * this.pianoLength));
this.scoreNode.setAnchorPoint(cc.p(0, 0));
this.scoreNode.setZOrder(130);
this.blockNode.addChild(this.scoreNode);
//color bg
var bgColor = cc.Sprite.create("res/whiteBlock.png");
bgColor.setPosition(cc.p(0, 0));
bgColor.setScaleX(720 / 300);
bgColor.setScaleY(1280 / 500);
bgColor.setAnchorPoint(cc.p(0, 0));
bgColor.setColor(cc.c3b(0, 255, 0));
this.scoreNode.addChild(bgColor);
this.scoreNode.bgColor = bgColor;
//mode
var wordsMode = "经典", "街机", "禅"];
var modeLabel = cc.LabelTTF.create(wordsMode + "模式", "Arial", 70);
this.scoreNode.addChild(modeLabel);
modeLabel.setPosition(cc.p(350, 1000));
modeLabel.setColor(cc.c3b(0, 0, 0));
modeLabel.setAnchorPoint(cc.p(0.5, 0.5));
//result
var resultLabel = cc.LabelTTF.create("成功了", "Arial", 110);
this.scoreNode.addChild(resultLabel);
resultLabel.setPosition(cc.p(360, 750));
resultLabel.setAnchorPoint(cc.p(0.5, 0.5));
resultLabel.setColor(cc.c3b(139, 58, 58));
this.scoreNode.result = resultLabel;
//back
var backLabel = cc.LabelTTF.create("返回", "Arial", 50);
this.scoreNode.addChild(backLabel);
backLabel.setPosition(cc.p(200, 400));
backLabel.setAnchorPoint(cc.p(0.5, 0.5));
backLabel.setColor(cc.c3b(0, 0, 0));
this.scoreNode.back = backLabel;
//return
var returnLabel = cc.LabelTTF.create("重来", "Arial", 50);
this.scoreNode.addChild(returnLabel);
returnLabel.setPosition(cc.p(500, 400));
returnLabel.setAnchorPoint(cc.p(0.5, 0.5));
returnLabel.setColor(cc.c3b(0, 0, 0));
this.scoreNode.return = returnLabel;
};
MainLayer.prototype.onUpdate = function (dt) {
if (this.gameStatus == OVER) {
return;
}
this.currentTime += dt;
if (this.currentTime - this.lastScoreTime > 0.09) {
this.scoreLabel.setString(getD(this.currentTime, 2) + "''");
this.lastScoreTime = this.currentTime;
}
};
MainLayer.prototype.moveAddNewSprites = function () {
cc.log("moveAddNewSprites");
var sprites = new Array(4);
var random = getRandom(4);
for (var k = 0; k < 4; k++) {
sprites = this.newBlock(k, this.pianoLength, random);
}
this.tables = sprites;
this.pianoLength += 1;
};
MainLayer.prototype.onTouchesBegan = function (touches, event) {
this.pBegan = touches.getLocation();
cc.log("this.pianoLength==" + this.pianoLength);
if (this.gameStatus == START) { //game start
var newTouchPos = cc.p(this.pBegan.x, (this.pBegan.y + this.moveNum * this.blockHeight));
for (var j = 0; j < this.pianoLength; j++) {
for (var i = 0; i < 4; i++) {
var block = this.tables;
if (block) {
var blockRect = cc.rectCreate(block.getPosition(), );
if (cc.rectContainsPoint(blockRect, newTouchPos)) {
if (j == 0) {
return;
}
//touch black
if (block.blockData.color == "black") {
if (block.blockData.row == (this.moveNum + 1)) {
//create new sprite
if (this.pianoLength < this.pianoLengthIndex) { //not reach top
this.moveAddNewSprites();
}
if (this.pianoLength == this.pianoLengthIndex) { //when reach top
this.createTopOverNode();
}
//move down
cc.AudioEngine.getInstance().playEffect(PIANO_SIMPLE], false);
block.setColor(cc.c3b(100, 100, 100));
var heightNum = 1;
if (block.blockData.row == (this.pianoLengthIndex - 1)) { //when last row ,game success end, move two height
heightNum = 2;
cc.log("end");
this.gameStatus = OVER;
cc.AudioEngine.getInstance().playEffect(SOUNDS.win, false);
}
this.blockNode.runAction(cc.MoveTo.create(0.2, cc.p(0, (this.blockNode.getPositionY() - this.blockHeight * heightNum))));
this.moveNum += 1;
block.runAction(cc.Sequence.create(
cc.ScaleTo.create(0, this.scaleX * 4 / 5, this.scaleY),
cc.ScaleTo.create(0.2, this.scaleX, this.scaleY)
));
}
}
//touch white ,game over
else {
this.createTopOverNode(); //create score node and move
this.gameStatus = OVER;
cc.AudioEngine.getInstance().playEffect(SOUNDS.error, false);
block.setColor(cc.c3b(255, 0, 0));
block.runAction(cc.Sequence.create(
cc.ScaleTo.create(0, this.scaleX * 4 / 5, this.scaleY * 4 / 5),
cc.ScaleTo.create(0.2, this.scaleX, this.scaleY)
));
this.scoreNode.bgColor.setColor(cc.c3b(255, 0, 0));
this.scoreNode.result.setString("失败了");
this.scoreNode.runAction(cc.MoveTo.create(0.2, cc.p(0, this.blockHeight * this.moveNum)));
}
}
}
}
}
}
else if (this.gameStatus == OVER) { //game over
//back
var backRect = cc.rectCreate(this.scoreNode.back.getPosition(), );
if (cc.rectContainsPoint(backRect, this.pBegan)) {
this.scoreNode.back.runAction(cc.Sequence.create(cc.ScaleTo.create(0.1, 1.1),
cc.CallFunc.create(function () {
cc.AudioEngine.getInstance().stopAllEffects();
cc.BuilderReader.runScene("", "StartLayer");
})
));
}
//return
var returnRect = cc.rectCreate(this.scoreNode.return.getPosition(), );
if (cc.rectContainsPoint(returnRect, this.pBegan)) {
this.scoreNode.return.runAction(cc.Sequence.create(cc.ScaleTo.create(0.1, 1.1),
cc.CallFunc.create(function () {
cc.AudioEngine.getInstance().stopAllEffects();
cc.BuilderReader.runScene("", "MainLayer");
})
));
}
}
};
```
这是经典模式的核心代码,这一篇就到这里;
CocosEditor开发工具:
CocosEditor,它是开发跨平台的手机游戏工具,运行window/mac系统上,javascript脚本语言,基于cocos2d-x跨平台游戏引擎, 集合代码编辑,场景设计,动画制作,字体设计,还有粒子,物理系统,地图等等的,而且调试方便,和实时模拟;
CocosEditor 下载,介绍和教程:http://blog.csdn.net/touchsnow/article/details/19070665;
CocosEditor官方博客:http://blog.makeapp.co/;****
****
