axmol/samples/MoonWarriors/Resources/js/GameLayer.js

316 lines
11 KiB
JavaScript
Raw Normal View History

//
// MoonWarriors
//
// Handles the Game Logic
//
STATE_PLAYING = 0;
STATE_GAMEOVER = 1;
var GameLayer = cc.Layer.extend({
_time:null,
_ship:null,
_backSky:null,
_backSkyHeight:0,
_backSkyRe:null,
_backTileMap:null,
_backTileMapHeight:0,
_backTileMapRe:null,
_levelManager:null,
_tmpScore:0,
_isBackSkyReload:false,
_isBackTileReload:false,
lbScore:null,
screenRect:null,
explosionAnimation:[],
_beginPos:cc.p(0, 0),
_state:STATE_PLAYING,
ctor:function () {
cc.associateWithNative( this, cc.Layer );
},
init:function () {
var bRet = false;
if (this._super()) {
// reset global values
MW.CONTAINER.ENEMIES = [];
MW.CONTAINER.ENEMY_BULLETS = [];
MW.CONTAINER.PLAYER_BULLETS = [];
MW.SCORE = 0;
MW.LIFE = 4;
this._state = STATE_PLAYING;
Explosion.sharedExplosion();
Enemy.sharedEnemy();
winSize = cc.Director.getInstance().getWinSize();
this._levelManager = new LevelManager(this);
this.initBackground();
this.screenRect = cc.rect(0, 0, winSize.width, winSize.height + 10);
// score
this.lbScore = cc.LabelBMFont.create("Score: 0", s_arial14_fnt);
this.lbScore.setAnchorPoint( cc.p(1,0) );
this.lbScore.setAlignment( cc.TEXT_ALIGNMENT_RIGHT );
this.addChild(this.lbScore, 1000);
this.lbScore.setPosition(cc.p(winSize.width - 5 , winSize.height - 30));
// ship life
var shipTexture = cc.TextureCache.getInstance().addImage(s_ship01);
var life = cc.Sprite.createWithTexture(shipTexture, cc.rect(0, 0, 60, 38));
life.setScale(0.6);
life.setPosition(cc.p(30, 460));
this.addChild(life, 1, 5);
// ship Life count
this._lbLife = cc.LabelTTF.create("0", "Arial", 20);
this._lbLife.setPosition(cc.p(60, 463));
this._lbLife.setColor(cc.RED);
this.addChild(this._lbLife, 1000);
// ship
this._ship = new Ship();
this.addChild(this._ship, this._ship.zOrder, MW.UNIT_TAG.PLAYER);
// accept touch now!
var t = cc.config.deviceType;
if( t == 'browser' ) {
this.setTouchEnabled(true);
this.setKeyboardEnabled(true);
} else if( t == 'desktop' ) {
this.setMouseEnabled(true);
} else if( t == 'mobile' ) {
this.setTouchEnabled(true);
}
// schedule
this.scheduleUpdate();
this.schedule(this.scoreCounter, 1);
if (MW.SOUND) {
cc.AudioEngine.getInstance().playBackgroundMusic(s_bgMusic, true);
}
bRet = true;
}
return bRet;
},
scoreCounter:function () {
if( this._state == STATE_PLAYING ) {
this._time++;
var minute = 0 | (this._time / 60);
var second = this._time % 60;
minute = minute > 9 ? minute : "0" + minute;
second = second > 9 ? second : "0" + second;
var curTime = minute + ":" + second;
this._levelManager.loadLevelResource(this._time);
}
},
onTouchesMoved:function (touches, event) {
this.processEvent( touches[0] );
},
onMouseDragged:function( event ) {
this.processEvent( event );
},
processEvent:function( event ) {
if( this._state == STATE_PLAYING ) {
var delta = event.getDelta();
var curPos = this._ship.getPosition();
curPos= cc.pAdd( curPos, delta );
curPos = cc.pClamp(curPos, cc.POINT_ZERO, cc.p(winSize.width, winSize.height) );
this._ship.setPosition( curPos );
}
},
onKeyDown:function (e) {
MW.KEYS[e] = true;
},
onKeyUp:function (e) {
MW.KEYS[e] = false;
},
update:function (dt) {
if( this._state == STATE_PLAYING ) {
this.checkIsCollide();
this.removeInactiveUnit(dt);
this.checkIsReborn();
this.updateUI();
}
if( cc.config.deviceType == 'browser' )
cc.$("#cou").innerHTML = "Ship:" + 1 + ", Enemy: " + MW.CONTAINER.ENEMIES.length + ", Bullet:" + MW.CONTAINER.ENEMY_BULLETS.length + "," + MW.CONTAINER.PLAYER_BULLETS.length + " all:" + this.getChildren().length;
},
checkIsCollide:function () {
var selChild, bulletChild;
//check collide
var i =0;
for (i = 0; i < MW.CONTAINER.ENEMIES.length; i++) {
selChild = MW.CONTAINER.ENEMIES[i];
for (var j = 0; j < MW.CONTAINER.PLAYER_BULLETS.length; j++) {
bulletChild = MW.CONTAINER.PLAYER_BULLETS[j];
if (this.collide(selChild, bulletChild)) {
bulletChild.hurt();
selChild.hurt();
}
if (!cc.rectIntersectsRect(this.screenRect, bulletChild.getBoundingBox() )) {
bulletChild.destroy();
}
}
if (this.collide(selChild, this._ship)) {
if (this._ship.active) {
selChild.hurt();
this._ship.hurt();
}
}
if (!cc.rectIntersectsRect(this.screenRect, selChild.getBoundingBox() )) {
selChild.destroy();
}
}
for (i = 0; i < MW.CONTAINER.ENEMY_BULLETS.length; i++) {
selChild = MW.CONTAINER.ENEMY_BULLETS[i];
if (this.collide(selChild, this._ship)) {
if (this._ship.active) {
selChild.hurt();
this._ship.hurt();
}
}
if (!cc.rectIntersectsRect(this.screenRect, selChild.getBoundingBox() )) {
selChild.destroy();
}
}
},
removeInactiveUnit:function (dt) {
var selChild, layerChildren = this.getChildren();
for (var i in layerChildren) {
selChild = layerChildren[i];
if (selChild) {
if( typeof selChild.update == 'function' ) {
selChild.update(dt);
var tag = selChild.getTag();
if ((tag == MW.UNIT_TAG.PLAYER) || (tag == MW.UNIT_TAG.PLAYER_BULLET) ||
(tag == MW.UNIT_TAG.ENEMY) || (tag == MW.UNIT_TAG.ENMEY_BULLET)) {
if (selChild && !selChild.active) {
selChild.destroy();
}
}
}
}
}
},
checkIsReborn:function () {
if (MW.LIFE > 0 && !this._ship.active) {
// ship
this._ship = new Ship();
this.addChild(this._ship, this._ship.zOrder, MW.UNIT_TAG.PLAYER);
}
else if (MW.LIFE <= 0 && !this._ship.active) {
this._state = STATE_GAMEOVER;
// XXX: needed for JS bindings.
this._ship = null;
this.runAction(cc.Sequence.create(
cc.DelayTime.create(0.2),
cc.CallFunc.create(this, this.onGameOver)));
}
},
updateUI:function () {
if (this._tmpScore < MW.SCORE) {
this._tmpScore += 5;
}
this._lbLife.setString(MW.LIFE);
this.lbScore.setString("Score: " + this._tmpScore);
},
collide:function (a, b) {
var aRect = a.collideRect();
var bRect = b.collideRect();
if (cc.rectIntersectsRect(aRect, bRect)) {
return true;
}
},
initBackground:function () {
// bg
this._backSky = cc.Sprite.create(s_bg01);
this._backSky.setAnchorPoint(cc.p(0, 0));
this._backSkyHeight = this._backSky.getContentSize().height;
this.addChild(this._backSky, -10);
//tilemap
this._backTileMap = cc.TMXTiledMap.create(s_level01);
this.addChild(this._backTileMap, -9);
this._backTileMapHeight = this._backTileMap.getMapSize().height * this._backTileMap.getTileSize().height;
this._backSkyHeight -= 48;
this._backTileMapHeight -= 200;
this._backSky.runAction(cc.MoveBy.create(3, cc.p(0, -48)));
this._backTileMap.runAction(cc.MoveBy.create(3, cc.p(0, -200)));
this.schedule(this.movingBackground, 3);
},
movingBackground:function () {
this._backSky.runAction(cc.MoveBy.create(3, cc.p(0, -48)));
this._backTileMap.runAction(cc.MoveBy.create(3, cc.p(0, -200)));
this._backSkyHeight -= 48;
this._backTileMapHeight -= 200;
if (this._backSkyHeight <= winSize.height) {
if (!this._isBackSkyReload) {
this._backSkyRe = cc.Sprite.create(s_bg01);
this._backSkyRe.setAnchorPoint(cc.p(0, 0));
this.addChild(this._backSkyRe, -10);
this._backSkyRe.setPosition(cc.p(0, winSize.height));
this._isBackSkyReload = true;
}
this._backSkyRe.runAction(cc.MoveBy.create(3, cc.p(0, -48)));
}
if (this._backSkyHeight <= 0) {
this._backSkyHeight = this._backSky.getContentSize().height;
this.removeChild(this._backSky, true);
this._backSky = this._backSkyRe;
this._backSkyRe = null;
this._isBackSkyReload = false;
}
if (this._backTileMapHeight <= winSize.height) {
if (!this._isBackTileReload) {
this._backTileMapRe = cc.TMXTiledMap.create(s_level01);
this.addChild(this._backTileMapRe, -9);
this._backTileMapRe.setPosition(cc.p(0, winSize.height));
this._isBackTileReload = true;
}
this._backTileMapRe.runAction(cc.MoveBy.create(3, cc.p(0, -200)));
}
if (this._backTileMapHeight <= 0) {
this._backTileMapHeight = this._backTileMapRe.getMapSize().height * this._backTileMapRe.getTileSize().height;
this.removeChild(this._backTileMap, true);
this._backTileMap = this._backTileMapRe;
this._backTileMapRe = null;
this._isBackTileReload = false;
}
},
onGameOver:function () {
var scene = cc.Scene.create();
scene.addChild(GameOver.create());
cc.Director.getInstance().replaceScene(cc.TransitionFade.create(1.2, scene));
}
});
GameLayer.create = function () {
var sg = new GameLayer();
if (sg && sg.init()) {
return sg;
}
return null;
};
GameLayer.scene = function () {
var scene = cc.Scene.create();
var layer = GameLayer.create();
scene.addChild(layer, 1);
return scene;
};