var heroLayer = null; var monsterLayer = null; var explosionLayer = null; var isFirstPlay = true; //是否第一次玩这个游戏 var prepareMonsterArr = [];//即将出现的怪物数组 var monsterArray = [];//已经出现的怪物 var monsterShadowArray = [];//所有已出现的怪物的影子 var delArray = [];//被砍死的怪物,准备删除 var touchLocationX = null;//触摸的X坐标位置 var positionY = null;//怪物和hero的Y坐标 var bgSprite = null; //背景图片 var shadowBatchNode = null; var heroSprite = null; //主角 var heroShadow = null;//主角的影子 var targetX = 0;//怪物要到达的X坐标 var durationLabel = null;//时间标签 var duration = 0;//游戏坚持的时间 var hpMax = 3; var hpLabel = null;//血量标签 var hpProgress = null; var hp = 0;//血量 var hpNode = null; var scoreLabel = null;//分数标签 var score = 0;//分数 var isGameOver = false;//游戏是否结束 var coolDowan = 0;//冷却时间 var skillProgress = null;//技能冷却进度条 var isSkillPeriod = false; //是否在释放技能期间 var attackDir = 0;//hero攻击的方向,0表示不再攻击,1表示向左攻击,2表示向右攻击 var response = null; var responsefailedLabel;//请求网络失败时显示的内容 var isSharelayer = false;//是否是分享界面 var BgLayer = cc.Layer.extend({ ctor:function(){ this._super(); bgSprite = cc.Sprite.create(res.bg1_jpg); bgSprite.setPosition(cc.p(240,400)); bgSprite.setScale(1.6); this.addChild(bgSprite); } }); var PlayLayer = cc.Layer.extend({ ctor:function(){ this._super(); //初始化数值 prepareMonsterArr = []; monsterArray = []; duration = 0; hp = hpMax; score = 0; isGameOver = false; coolDowan = 0; isSkillPeriod = false; attackDir = 0; isSharelayer = false; for(var i = 0;i < g_resources.length; i++){ cc.textureCache.addImage(g_resources[i]); } var winSize = cc.director.getWinSize(); positionY = winSize.height / 2 + 35; //添加背景 /*bgSprite = cc.Sprite.create(res.bg1_jpg); bgSprite.setPosition(cc.p(winSize.width / 2, winSize.height / 2)); bgSprite.setScale(1.6); this.addChild(bgSprite);*/ //添加时间、血量、分数标签 //添加血量数(爱心) hpNode = cc.Node.create(); for(var i = 1; i <= hpMax; i++){ var heart = cc.Sprite.create(res.xin_1_png); heart.setPosition(cc.p((hpMax -i) * 30, 0)); hpNode.addChild(heart, 1, i); } //hpNode.setAnchorPoint(cc.p(1,1)); hpNode.setPosition(cc.p(480 - hpMax * 30,780)); //hpNode.setVisible(false); this.addChild(hpNode); //添加血量进度条 /*var hpbg = cc.Sprite.create(res.hero_hp_bg_png); hpbg.setPosition(cc.p(winSize.width - 50,winSize.height - 60)); hpbg.setVisible(false); this.addChild(hpbg); hpProgress = cc.ProgressTimer.create(cc.Sprite.create(res.hero_hp_png)); hpProgress.setType(cc.ProgressTimer.TYPE_BAR); hpProgress.setMidpoint(cc.p(0, 0)); hpProgress.setBarChangeRate(cc.p(1,0)); hpProgress.setPosition(cc.p(winSize.width - 50,winSize.height - 60)); hpProgress.setVisible(false); this.addChild(hpProgress,1); hpProgress.setPercentage(100);*/ //添加hero精灵 heroSprite = cc.Sprite.create(res.hero1_png); //heroSprite.setScale(0.8); heroSprite.setAnchorPoint(cc.p(0.3,0.5)); heroSprite.setPosition(cc.p(winSize.width / 2, positionY - 10)); //添加sword精灵 /*swordSprite = cc.Sprite.create(res.sword1_png); swordSprite.setScale(1.0); swordSprite.setAnchorPoint(cc.p(0.48,0.5)); swordSprite.setPosition(cc.p(winSize.width / 2, positionY + 10)); swordSprite.setVisible(false);*/ heroLayer.addChild(heroSprite,3); //heroLayer.addChild(swordSprite,3); //添加释放技能菜单选项 var skillItem = cc.MenuItemImage.create( res.skill_png, res.skill_png, function(){ cc.log("释放技能"); if(heroSprite.getActionByTag(1024)==null){ useSkill(heroSprite.getParent());//释放技能调用的函数 } },this); skillItem.setPosition(cc.p(240,280)); var menu = cc.Menu.create(skillItem); menu.setPosition(cc.p(0,0)); //this.addChild(menu,2); //添加技能冷却时间进度条 //否是第一次进入游戏,若第一次则进入引导程序,否则直接开始游戏 if(isFirstPlay){ this.guidePrecess(); isFirstPlay = false; var guideSprite = cc.Sprite.create(res.guide_png); guideSprite.setScale(1.0); guideSprite.setPosition(cc.p(240,200)); this.addChild(guideSprite,1); guideSprite.runAction(cc.Sequence.create(cc.DelayTime.create(1.5), cc.FadeOut.create(1.0),cc.CallFunc.create(function(sender){ sender.removeFromParent(); }))); } else{ this.initMonster(); this.init(); } }, /** * 第一次游戏时的引导过程 */ guidePrecess:function(){ var noticeNode = cc.Node.create(); var noticeSprite = cc.Sprite.create(res.notice_board_png); noticeSprite.setPosition(cc.p(240,840));//提示窗初始化在屏幕上方 noticeNode.addChild(noticeSprite); noticeSprite.runAction(cc.Sequence.create(cc.MoveTo.create(0.3,cc.p(240,400)), cc.MoveTo.create(0.05,cc.p(240,420)), cc.MoveTo.create(0.05,cc.p(240,400))));//提示窗口移动到屏幕中间 //添加一个巫妖精灵 var lichSprite = cc.Sprite.create(res.monster6_1_png); lichSprite.setPosition(cc.p(-lichSprite.getContentSize().width/2,450));//初始位置在屏幕中间左侧外 noticeNode.addChild(lichSprite); this.addChild(noticeNode,3); var lichMoveTo = cc.moveTo(0.2,cc.p(lichSprite.getContentSize().width/2,450)); var lichAnim = cc.Animation.create(); for(var i = 1; i <= 4; i++){ var frame = "res/monster6_" + i + ".png"; lichAnim.addSpriteFrameWithFile(frame); } lichAnim.setDelayPerUnit(0.15); lichSprite.runAction(cc.RepeatForever.create(cc.Animate.create(lichAnim)));//播放帧动画 lichSprite.runAction(cc.Sequence.create(cc.DelayTime.create(0.4),lichMoveTo,cc.CallFunc.create(noticeCallback)));//移动到屏幕左侧内,回调noticeCallback函数 }, init:function(){ var winSize = cc.director.getWinSize(); playIdleAction(); var heroAttackAnim = cc.Animation.create(); for(var i = 6; i<=8; i++){ var heroAttackFrame = "res/hero" + i + ".png"; heroAttackAnim.addSpriteFrameWithFile(heroAttackFrame); } heroAttackAnim.setDelayPerUnit(0.04); var heroAttackAction = cc.Animate.create(heroAttackAnim); var swordAttackAnim = cc.Animation.create(); for(var i = 6; i<=8; i++){ var swordAttackFrame = "res/sword" + i + ".png"; swordAttackAnim.addSpriteFrameWithFile(swordAttackFrame); } swordAttackAnim.setDelayPerUnit(0.04); var swordAttackAction = cc.Animate.create(swordAttackAnim); var attackAction = cc.Sequence.create(heroAttackAction ,cc.CallFunc.create(heroAttackCallback)); //给layer添加监听事件,点击屏幕,hero攻击怪物 var listener = cc.EventListener.create({ event:cc.EventListener.TOUCH_ONE_BY_ONE, swallowTouches: true, onTouchBegan:function(touch,event){ if(isSkillPeriod || isGameOver || touch.getLocationY() > 350 || Math.abs(touch.getLocationX() - 240) < 20 ) { return false; } if(heroSprite.getActionByTag(1024)==null) { touchLocationX = touch.getLocationX(); if(touchLocationX < 240){//向左 if(attackDir == 1) return false; attackDir = 1; heroSprite.setScaleX(-1.0); //swordSprite.setScaleX(-1.0); }else{//向右 if(attackDir == 2) return false; attackDir = 2; heroSprite.setScaleX(1.0); //swordSprite.setScaleX(1.0); } heroSprite.stopAllActions(); heroSprite.runAction(attackAction); //swordSprite.stopAllActions(); //swordSprite.runAction(swordAttackAction); } return true; } }); cc.eventManager.addListener(listener,this); //this.scheduleUpdate(); this.schedule(this.updateDuration,0.5,cc.REPEAT_FOREVER); //monsterCreater.getInstance(this); }, //添加怪物精灵 initMonster:function(){ //for(var i = 0;i<100; i++) { /*var i = 0; prepareMonster(1.0 + i * 30, 6, 1, false); prepareMonster(2.0 + i * 30, 6, 1, false); prepareMonster(2.0 + i * 30, 6, 2, false); prepareMonster(3.0 + i * 30, 6, 1, false);*/ // var i = 0; // var j = 1; // prepareMonster(1.0 * j + i * 30, 1, 2, false); // prepareMonster(3.0 * j + i * 30, 1, 1, false); // prepareMonster(4.0 * j + i * 30, 1, 1, false); // prepareMonster(4.0 * j + i * 30, 1, 2, false); // prepareMonster(5.0 * j + i * 30, 1, 1, false); // prepareMonster(5.0 * j + i * 30, 1, 2, false); // prepareMonster(6.0 * j + i * 30, 1, 0, true); // prepareMonster(6.5 * j + i * 30, 1, 0, true); // prepareMonster(7.0 * j + i * 30, 1, 0, true); // prepareMonster(7.5 * j + i * 30, 1, 0, true); // prepareMonster(8.0 * j + i * 30, 1, 0, true); // prepareMonster(8.5 * j + i * 30, 1, 1, true); // prepareMonster(8.5 * j + i * 30, 1, 2, true); // prepareMonster(9.0 * j + i * 30, 1, 1, true); // prepareMonster(9.0 * j + i * 30, 1, 2, true); // prepareMonster(9.5 * j + i * 30, 1, 1, true); // prepareMonster(9.5 * j + i * 30, 1, 2, true); // prepareMonster(10.0 * j + i * 30, 1, 1, true); // prepareMonster(10.0 * j + i * 30, 1, 2, true); // prepareMonster(11.0 * j + i * 30, 3, 2, false); // prepareMonster(14.0 * j + i * 30, 3, 1, false); // prepareMonster(16.0 * j + i * 30, 3, 1, false); // //prepareMonster(16.0 + i * 30, 3, 2, false); // prepareMonster(17.0 * j + i * 30, 3, 1, false); // prepareMonster(18.0 * j + i * 30, 3, 2, false); // //prepareMonster(19.0 + i * 30, 3, 1, false); // prepareMonster(19.0 * j + i * 30, 3, 2, false); // prepareMonster(20.0 * j + i * 30, 1, 1, false); // prepareMonster(20.0 * j + i * 30, 1, 2, false); // prepareMonster(20.5 * j + i * 30, 1, 1, true); // prepareMonster(20.5 * j + i * 30, 1, 2, true); // prepareMonster(21.0 * j + i * 30, 3, 2, false); // prepareMonster(22.0 * j + i * 30, 1, 0, true); // //prepareMonster(23.0 + i * 30, 3, 1, false); // prepareMonster(23.0 * j + i * 30, 3, 2, false); // prepareMonster(25.0 * j + i * 30, 2, 1, false); // prepareMonster(27.0 * j + i * 30, 2, 2, false); // prepareMonster(27.0 * j + i * 30, 1, 0, true); // prepareMonster(27.5 * j + i * 30, 1, 0, true); // prepareMonster(28.0 * j + i * 30, 1, 1, true); // prepareMonster(28.5 * j + i * 30, 1, 1, true); // prepareMonster(28.5 * j + i * 30, 1, 2, true); // prepareMonster(29.0 * j + i * 30, 2, 1, false); // prepareMonster(29.0 * j + i * 30, 2, 2, false); // prepareMonster(31.0 * j + i * 30, 6, 1, false); // //prepareMonster(32.0 + i * 30, 6, 1, false); // prepareMonster(32.0 * j + i * 30, 6, 2, false); // prepareMonster(33.0 * j + i * 30, 6, 1, false); // prepareMonster(34.0 * j + i * 30, 5, 2, false); // prepareMonster(35.0 * j + i * 30, 5, 1, false); // prepareMonster(35.0 * j + i * 30, 5, 2, false); // prepareMonster(36.0 * j + i * 30, 5, 1, false); // } //第零波 prepareMonster(1.0, 1, 1.0, 0.0); prepareMonster(1.5, 1, 0.0, 0.0); prepareMonster(2.0, 1, 1.0, 0.0); prepareMonster(2.5, 1, 0.0, 0.0); prepareMonster(3.0, 1, 1.0, 0.0); prepareMonster(3.5, 1, 0.0, 0.0); prepareMonster(4.0, 1, 1.0, 0.0); prepareMonster(4.5, 1, 0.0, 0.0); prepareMonster(5.0, 1, 1.0, 0.0); prepareMonster(5.5, 1, 0.0, 0.0); prepareMonster(6.0, 1, 1.0, 0.0); prepareMonster(6.5, 1, 0.0, 0.0); prepareMonster(7.0, 1, 1.0, 0.0); prepareMonster(7.5, 1, 0.0, 0.0); prepareMonster(8.0, 1, 1.0, 0.0); //第一波 var firstWave = 10; prepareMonster(1.0 + firstWave, 1, 1.0, 0.0); prepareMonster(2.0 + firstWave, 1, 0.5, 0.0); prepareMonster(2.2 + firstWave, 1, 0.5, 1.0); prepareMonster(3.4 + firstWave, 1, 1.0, 1.0); prepareMonster(4.2 + firstWave, 1, 0.0, 0.0); prepareMonster(5.0 + firstWave, 1, 0.0, 0.0); prepareMonster(5.2 + firstWave, 1, 0.0, 1.0); prepareMonster(5.5 + firstWave, 1, 0.0, 0.0); prepareMonster(6.4 + firstWave, 1, 0.0, 1.0); prepareMonster(6.6 + firstWave, 1, 1.0, 0.0); prepareMonster(7.2 + firstWave, 1, 0.0, 0.0); prepareMonster(8.0 + firstWave, 1, 1.0, 0.0); prepareMonster(8.7 + firstWave, 1, 0.5, 0.0); prepareMonster(10.0 + firstWave, 1, 0.0, 1.0); //第二波 var secondWave = 20; prepareMonster(3.0 + secondWave, 1, 1.0, 0.0); prepareMonster(3.5 + secondWave, 1, 0.5, 0.0); prepareMonster(4.5 + secondWave, 3, 0.5, 0.0); prepareMonster(4.6 + secondWave, 1, 1.0, 1.0); prepareMonster(4.9 + secondWave, 1, 0.0, 0.0); prepareMonster(4.9 + secondWave, 3, 1.0, 0.0); //prepareMonster(16.4, 1, 1.0, 0.3); prepareMonster(7.1 + secondWave, 1, 0.0, 1.0); prepareMonster(7.1 + secondWave, 3, 1.0, 0.0); prepareMonster(7.9 + secondWave, 3, 0.5, 0.0); prepareMonster(7.9 + secondWave, 1, 0.0, 1.0); //prepareMonster(18.1, 3, 0.0, 0.0); prepareMonster(8.4 + secondWave, 3, 1.0, 0.0); prepareMonster(8.6 + secondWave, 1, 0.5, 0.0); prepareMonster(9.7 + secondWave, 1, 1.0, 1.0); prepareMonster(10.0 + secondWave, 1, 0.5, 0.5); //第三波 var thridWave = 30; prepareMonster(3.0 + thridWave, 1, 0.5, 1.0); prepareMonster(3.2 + thridWave, 1, 0.5, 0.0); prepareMonster(3.3 + thridWave, 3, 0.5, 0.0); prepareMonster(3.9 + thridWave, 2, 1.0, 0.0); prepareMonster(4.2 + thridWave, 3, 1.0, 0.0); prepareMonster(4.5 + thridWave, 1, 0.0, 0.0); prepareMonster(5.3 + thridWave, 1, 0.0, 1.0); prepareMonster(5.6 + thridWave, 2, 0.5, 0.0); prepareMonster(7.0 + thridWave, 1, 0.5, 1.0); prepareMonster(7.0 + thridWave, 3, 0.5, 0.0); prepareMonster(7.4 + thridWave, 3, 0.5, 0.0); prepareMonster(7.8 + thridWave, 2, 0.5, 0.0); prepareMonster(9.4 + thridWave, 2, 1.0, 0.0); prepareMonster(10.0 + thridWave, 2, 1.0, 1.0); //第四波 var fourthWave = 40; prepareMonster(3.0 + fourthWave, 2, 0.5, 1.0); prepareMonster(3.0 + fourthWave, 1, 0.0, 0.0); prepareMonster(4.0 + fourthWave, 3, 1.0, 0.0); prepareMonster(4.5 + fourthWave, 1, 0.0, 0.0); prepareMonster(4.7 + fourthWave, 4, 0.0, 0.0); prepareMonster(4.8 + fourthWave, 3, 0.5, 0.0); prepareMonster(5.5 + fourthWave, 4, 1.0, 0.0); prepareMonster(5.6 + fourthWave, 1, 1.0, 1.0); prepareMonster(6.9 + fourthWave, 1, 0.0, 0.0); prepareMonster(6.9 + fourthWave, 3, 0.0, 0.0); prepareMonster(7.5 + fourthWave, 4, 0.5, 0.0); prepareMonster(7.8 + fourthWave, 3, 1.0, 0.0); prepareMonster(8.6 + fourthWave, 2, 1.0, 0.0); prepareMonster(8.7 + fourthWave, 3, 0.0, 0.0); prepareMonster(9.7 + fourthWave, 1, 1.0, 0.0); prepareMonster(10.0 + fourthWave, 3, 0.5, 0.0); prepareMonster(10.0 + fourthWave, 2, 0.0, 1.0); //第五波 var fifthWave = 50; prepareMonster(3.0 + fifthWave, 3, 0.5, 0.0); prepareMonster(3.3 + fifthWave, 1, 0.5, 1.0); prepareMonster(3.8 + fifthWave, 4, 0.0, 0.0); prepareMonster(4.0 + fifthWave, 3, 0.5, 0.0); prepareMonster(4.3 + fifthWave, 2, 0.0, 0.0); prepareMonster(4.9 + fifthWave, 5, 0.0, 0.0); prepareMonster(5.3 + fifthWave, 3, 1.0, 0.0); prepareMonster(6.1 + fifthWave, 1, 1.0, 1.0); prepareMonster(6.1 + fifthWave, 5, 0.0, 0.0); prepareMonster(6.6 + fifthWave, 2, 0.0, 0.0); prepareMonster(6.6 + fifthWave, 4, 1.0, 0.0); prepareMonster(6.6 + fifthWave, 3, 0.0, 0.0); prepareMonster(7.1 + fifthWave, 1, 1.0, 0.0); prepareMonster(7.4 + fifthWave, 5, 0.5, 0.0); prepareMonster(7.9 + fifthWave, 2, 1.0, 1.0); prepareMonster(7.9 + fifthWave, 3, 0.0, 0.0); prepareMonster(8.5 + fifthWave, 4, 0.5, 0.0); prepareMonster(8.9 + fifthWave, 5, 0.5, 0.0); prepareMonster(9.3 + fifthWave, 5, 0.0, 0.0); prepareMonster(10.0 + fifthWave, 2, 0.5, 1.0); //第六波 var sixWave = 60; prepareMonster(3.0 + sixWave, 4, 1.0, 0.0); prepareMonster(3.4 + sixWave, 4, 0.0, 0.0); prepareMonster(3.9 + sixWave, 2, 0.0, 1.0); prepareMonster(4.0 + sixWave, 4, 1.0, 0.0); prepareMonster(4.2 + sixWave, 3, 0.0, 0.0); prepareMonster(4.5 + sixWave, 2, 1.0, 0.0); prepareMonster(4.8 + sixWave, 3, 1.0, 0.0); prepareMonster(5.5 + sixWave, 5, 0.0, 0.0); prepareMonster(5.9 + sixWave, 4, 1.0, 0.0); prepareMonster(6.0 + sixWave, 3, 0.5, 0.0); prepareMonster(6.4 + sixWave, 2, 1.0, 0.0); prepareMonster(6.7 + sixWave, 6, 0.0, 0.0); prepareMonster(7.1 + sixWave, 3, 1.0, 0.0); prepareMonster(7.4 + sixWave, 5, 1.0, 0.0); prepareMonster(8.1 + sixWave, 4, 0.5, 0.0); prepareMonster(9.0 + sixWave, 2, 0.0, 1.0); prepareMonster(9.2 + sixWave, 6, 0.0, 0.0); prepareMonster(9.5 + sixWave, 3, 1.0, 0.0); prepareMonster(9.8 + sixWave, 5, 1.0, 0.0); prepareMonster(9.9 + sixWave, 3, 0.5, 0.0); prepareMonster(10.0 + sixWave, 2, 0.5, 1.0); //第七波 var sevenWave = 70; prepareMonster(6.0 + sevenWave, 2, 0.5, 1); prepareMonster(6.2 + sevenWave, 2, 0.5, 1); prepareMonster(6.5 + sevenWave, 2, 0.5, 1); prepareMonster(6.6 + sevenWave, 2, 0.5, 1); prepareMonster(6.6 + sevenWave, 4, 0.5, 0); prepareMonster(6.6 + sevenWave, 3, 1.0, 0); prepareMonster(6.8 + sevenWave, 6, 0.0, 0); prepareMonster(6.8 + sevenWave, 2, 0.0, 1); prepareMonster(6.9 + sevenWave, 4, 1.0, 0); prepareMonster(7.0 + sevenWave, 3, 1.0, 0); prepareMonster(7.1 + sevenWave, 6, 0.5, 0); prepareMonster(7.2 + sevenWave, 2, 0.0, 1); prepareMonster(7.4 + sevenWave, 6, 0.0, 0); prepareMonster(7.4 + sevenWave, 3, 1.0, 1); prepareMonster(7.9 + sevenWave, 4, 1.0, 0); prepareMonster(8.0 + sevenWave, 4, 0.0, 0); prepareMonster(10.0 + sevenWave, 2, 0.5, 1); prepareMonster(10.2 + sevenWave, 2, 0.5, 1); prepareMonster(10.6 + sevenWave, 2, 0.5, 1); prepareMonster(10.6 + sevenWave, 5, 1.0, 0); prepareMonster(10.7 + sevenWave, 6, 0.5, 0); prepareMonster(10.7 + sevenWave, 2, 0.5, 1); prepareMonster(10.9 + sevenWave, 4, 0.0, 0); prepareMonster(11.0 + sevenWave, 4, 1.0, 0); prepareMonster(11.5 + sevenWave, 6, 0.5, 0); prepareMonster(14.0 + sevenWave, 2, 0.5, 1); prepareMonster(14.2 + sevenWave, 2, 0.5, 1); prepareMonster(14.4 + sevenWave, 2, 0.5, 1); }, //update函数,每一帧重绘所有怪物影子的位置 update:function(dt){ }, //定时更新函数,更新游戏坚持时间、冷却时间、准备出现的怪物 updateDuration:function(dt){ duration += dt; coolDowan += dt; if(coolDowan <= 30){ //var to = cc.ProgressTo.create(0.01, (30 - coolDowan) / 30 * 100); //skillProgress.runAction(to); }else{ coolDowan = 30; } var tempArr = []; for(var i = 0; i < prepareMonsterArr.length; i++){ if(prepareMonsterArr[i].time <= duration){ tempArr.push(prepareMonsterArr[i]);//即将出现的怪物的属性添加到tempArr数组中 }else{ break; } } for(var i = 0; i < tempArr.length; i++){ this.createMonster(tempArr[i]);//创建即将出现的怪物 } deleteChildFromArray(prepareMonsterArr,tempArr);//从prepareMonsterArr中删除已创建的怪物 if(duration >= 88){ gameOver(); } }, /** * 创建怪物 * @param monsterData 怪物的属性 */ createMonster:function(prepareMonsterData){ var monsterSprite = cc.Sprite.create("res/monster" + prepareMonsterData.type + "_1.png");//根据类型选择对应的图片 monsterSprite.setScale(1.0/0.8); monsterSprite.setAnchorPoint(cc.p(0.5, 0)); var dir = Math.random(); if(Math.random() < prepareMonsterData.direction){ targetX = 180; monsterSprite.setPosition(cc.p(-30,positionY - 55)); }else{ targetX = 300; monsterSprite.setPosition(cc.p(510,positionY - 55)); monsterSprite.setFlippedX(true);//右边出现的怪物镜像显示 } /*if(prepareMonsterData.direction == 0){//如果怪物出现的方向是随机的,则产生一个1或2的随机数,1表示左边,2表示右边 prepareMonsterData.direction = Math.floor(Math.random() * 10 % 2 + 1); } if(prepareMonsterData.direction == 1){//从左边出现的怪物 targetX = 180; monsterSprite.setPosition(cc.p(-30,positionY - 65)); }else if(prepareMonsterData.direction == 2){//从右边出现的怪物 targetX = 300; monsterSprite.setPosition(cc.p(510,positionY - 65)); monsterSprite.setFlippedX(true);//右边出现的怪物镜像显示 }*/ monsterArray.push(monsterSprite);//已出现的怪物添加到monsterArray数组中 monsterLayer.getChildByTag(prepareMonsterData.type).addChild(monsterSprite,1,prepareMonsterData.type);//添加怪物到Layer上,TAG即为怪物的类型 //不同的怪物类型初始化不同的血量 if(prepareMonsterData.type == 1 || prepareMonsterData.type ==3 || prepareMonsterData.type == 4 || prepareMonsterData.type == 5){ monsterSprite.setUserData(monsterUserData(1,1)); }else{ monsterSprite.setUserData(monsterUserData(2,2)); } var walkLine = createMonsterWalkLine(prepareMonsterData.type,prepareMonsterData.rampageProb); //根据怪物类型设置怪物的行走路线和Action if(prepareMonsterData.type ==1 || prepareMonsterData.type == 2 || prepareMonsterData.type == 5 || prepareMonsterData.type == 6){ monsterSprite.runAction(createMonsterWalkAnimate(prepareMonsterData.type)); monsterSprite.runAction(cc.Sequence.create(walkLine, cc.CallFunc.create(monsterAttackCallback))); }else if(prepareMonsterData.type ==3 || prepareMonsterData.type ==4){ monsterSprite.runAction(walkLine); } } /* createMonster:function(dt) { var type = Math.floor(Math.random() * 10 % 3 + 1); cc.log("type:" + type); var monsterSprite = cc.Sprite.create("res/monster" + type + "_1.png"); monsterSprite.setAnchorPoint(cc.p(0.5, 0)); if (Math.random() < 0.5) { targetX = 180; monsterSprite.attr({ x: 0, y: positionY - 65 }); } else { monsterSprite.setFlippedX(true); targetX = 480 - 180; monsterSprite.attr({ x: 480, y: positionY - 60 }); } this.addChild(monsterSprite, 1, type); monsterArray.push(monsterSprite); var monsterAttackCallback = function () { cc.log("monsterAttackCallback"); monsterSprite.stopAllActions(); var monsterAttack = cc.RepeatForever.create(cc.Sequence.create(createMonsterAttackAnimate(type), cc.CallFunc.create(function () { heroBeHurt(); }), cc.DelayTime.create(1.5))); monsterSprite.runAction(monsterAttack); } var walkLine = createMonsterWalkLine(type); if(type ==1 || type == 2){ monsterSprite.runAction(createMonsterWalkAnimate(type)); monsterSprite.runAction(cc.Sequence.create(walkLine, cc.CallFunc.create(monsterAttackCallback))); }else{ monsterSprite.runAction(walkLine); } this.unschedule(this.createMonster); monsterCreater.time += monsterCreater.interval; if(monsterCreater.time < 10){ monsterCreater.interval = 3; }else if(monsterCreater.time <20){ monsterCreater.interval = 2; }else if(monsterCreater.time <30){ monsterCreater.interval = 0.8; }else if(monsterCreater.time <60){ monsterCreater.interval = 0.5; }else{ monsterCreater.interval = 0.3; } this.schedule(this.createMonster,monsterCreater.interval); }*/ }); /** * 使用技能调用的函数 * @param layer 指当前Layer,即PlayLayer */ var useSkill = function(layer) { if(isSkillPeriod || isGameOver){//正在释放技能期间或者游戏已经结束则不能释放技能 return; } if(coolDowan < 30)//冷却时间未到不能释放技能 { cc.log("冷却时间,不能释放技能"); //return; } coolDowan = 0;//重置冷却时间为0 isSkillPeriod = true;//标记为正在释放技能为true var moveToTop = cc.MoveTo.create(0.3,cc.p(240,700)); var moveToFloor = cc.EaseBackIn.create(cc.MoveTo.create(0.3,cc.p(240,positionY + 10))); var heroAttackAnim = cc.Animation.create(); for(var i = 6; i<=9; i++){ var heroAttackFrame = "res/hero" + i + ".png"; heroAttackAnim.addSpriteFrameWithFile(heroAttackFrame); } heroAttackAnim.setDelayPerUnit(0.1); var heroAttackAction = cc.Animate.create(heroAttackAnim); heroSprite.stopAllActions(); var action = cc.Sequence.create(moveToTop, cc.Spawn.create(moveToFloor, heroAttackAction), cc.CallFunc.create(useSkillCallback)); heroSprite.runAction(action);//hero执行action,hero跳到屏幕上方再调到地面,播放攻击帧动画,调用useSkillCallback函数 } /** * hero释放技能落地后回调的函数 * @param sender */ var useSkillCallback = function(sender){ cc.director.getScheduler().setTimeScale(0.2); //bgSprite.runAction(cc.TintTo.create(0.2,50,50,50));//释放技能后背景变暗 var darkSprite = cc.Sprite.create(res.eff_dark_png); darkSprite.setScale(800); darkSprite.setPosition(cc.p(240,400)); heroSprite.getParent().addChild(darkSprite, 2, 1001); heroSprite.getParent().runAction(cc.Sequence.create(cc.ScaleTo.create(0.2,1.5)));//整个场景缩放到原来的1.5倍 heroSprite.getParent().runAction(cc.Spawn.create(cc.CallFunc.create(function(){ var tempArray = []; //释放技能后,遍历已出现的怪物,所有怪物掉一滴血 for(var i = 0; i < monsterArray.length; i++){ monsterBeHurt(monsterArray[i]); if(monsterArray[i].getUserData().curBlood <= 0){ tempArray.push(monsterArray[i]); } } //删除已死亡的怪物和怪物的影子 for(var i=0;i 130 && monsterPosX < 240 && touchLocationX < 240){ //delArray.push(monsterArray[i]); isAttackSuccess = true; monsterBeHurt(monsterArray[i]); }else if( monsterPosX > 240 && monsterPosX < 350 && touchLocationX > 240){ //delArray.push(monsterArray[i]); isAttackSuccess = true; monsterBeHurt(monsterArray[i]); } } var attackAfterAnim = cc.Animation.create(); for(var i = 9; i<=10; i++){ var attackBeforeFrame = "res/hero" + i + ".png"; attackAfterAnim.addSpriteFrameWithFile(attackBeforeFrame); } attackAfterAnim.setDelayPerUnit(0.04); var attackAfterAction = cc.Animate.create(attackAfterAnim); attackAfterAction.setTag(1024); var swordAttackAfterAnim = cc.Animation.create(); for(var i = 9; i<=10; i++){ var swordAttackBeforeFrame = "res/sword" + i + ".png"; swordAttackAfterAnim.addSpriteFrameWithFile(swordAttackBeforeFrame); } swordAttackAfterAnim.setDelayPerUnit(0.04); var swordAttackAfterAction = cc.Animate.create(swordAttackAfterAnim); swordAttackAfterAction.setTag(1024); //如果没有碰到怪物,则硬直状态 if(!isAttackSuccess) { cc.log("硬直"); var heroDelay = cc.DelayTime.create(0.5);//没有攻击上怪物则停顿0.5秒 heroSprite.stopAllActions(); var waitAction = cc.Sequence.create(attackAfterAction,heroDelay,cc.CallFunc.create(playIdleAction)); var swordWaitAction = cc.Sequence.create(swordAttackAfterAction,heroDelay.clone()); waitAction.setTag(1024); heroSprite.runAction(cc.Sequence.create(waitAction)); //swordSprite.runAction(swordWaitAction); //添加一滴汗液 var sweat = cc.Sprite.create(res.miss_png); sweat.setScale(0.8); var positionX = heroSprite.getScale() < 0 ? heroSprite.getPositionX() - 10 : heroSprite.getPositionX() + 10; sweat.setPosition(cc.p(positionX,heroSprite.getPositionY() + 12)); heroSprite.getParent().addChild(sweat,3); var sweatAction = cc.Sequence.create(cc.Sequence.create(cc.MoveBy.create(0.3, cc.p(0, -7)),cc.FadeOut.create(0.1)), cc.CallFunc.create( function(sender){ sender.removeFromParent(); } )); sweat.runAction(sweatAction);//汗液流下后淡出并移除 var shakeTime = 0.03; var moveRight = cc.MoveBy.create(shakeTime,cc.p(3,0)); var moveleft = cc.MoveBy.create(shakeTime,cc.p(-3,0)); var moveTop = cc.MoveBy.create(shakeTime,cc.p(0,3)); var moveBottom = cc.MoveBy.create(shakeTime,cc.p(0,-3)); var shakeAction = cc.Repeat.create(cc.Sequence.create(moveRight,moveleft,moveTop,moveBottom),2); heroSprite.getParent().getParent().runAction(shakeAction);//没有攻击上怪物后屏幕震动 }else{ heroSprite.runAction(cc.Sequence.create(attackAfterAction,cc.CallFunc.create(playIdleAction))); //swordSprite.runAction(swordAttackAfterAction); } //从monsterArray数组中删除已经死去的怪物即它们的影子 deleteChildFromArray(monsterArray,delArray); for(var i=0;i 0.5 ? 1 : -1;//随机产生尸体的旋转方向 //头部和身体执行动画后移除屏幕并删除 monsterHead.runAction(cc.Sequence.create(cc.Spawn.create(headJumpAction,cc.RotateBy.create(0.8,360 * rotateDir)),cc.CallFunc.create( function(pSender) { pSender.removeFromParent(); } ))); monsterBody.runAction(cc.Sequence.create(cc.Spawn.create(bodyJumpAtion,cc.RotateBy.create(0.8,-360 * rotateDir)),cc.CallFunc.create( function(pSender){ pSender.removeFromParent(); } ))); //monster.removeFromParent(); } /** * 游戏结束 */ var gameOver = function(){ console.log("gameover"); isGameOver = true;//标记游戏已经结束 hpNode.getParent().unscheduleAllCallbacks();//停止调用定时跟新函数 //停止怪物的所有动画 for(var i = 0; i < monsterArray.length; i++){ monsterArray[i].stopAllActions(); }; heroSprite.stopAllActions(); var heroJumpAction = cc.JumpTo.create(1.0,cc.p(100,-500),580,1); //hero死后让英雄回到第一针 var heroAnim = cc.Animation.create(); heroAnim.addSpriteFrameWithFile(res.hero1_png); heroAnim.setDelayPerUnit(0.04); var heroAction = cc.Animate.create(heroAnim); //hero跳出屏幕后弹出窗口 heroSprite.runAction(cc.Sequence.create(heroAction, heroJumpAction,cc.DelayTime.create(0.6),cc.CallFunc.create(popupWindow))); /*var swordJumpAction = cc.JumpTo.create(0.15*7,cc.p(-100,-7),360,1); var swordRotation = cc.Repeat.create(cc.RotateBy.create(0.075,180),12); swordSprite.runAction(cc.Spawn.create(swordJumpAction,swordRotation)); var anim = cc.Animation.create(); for (var i = 1; i <= 2; i++){ anim.addSpriteFrameWithFile(res.sword12_png); } anim.setDelayPerUnit(0.1); var action = cc.Animate.create(anim); swordSprite.runAction(cc.Sequence.create(cc.DelayTime.create(0.15*7),action,cc.DelayTime.create(1),cc.CallFunc.create(popupWindow)));*/ }; /** * 游戏结束后弹出窗口 */ var popupWindow = function(){ var popWindow = cc.Node.create(); popWindow.setPosition(cc.p(240,400)); popWindow.setScale(0); var popBg = cc.Sprite.create(res.popup_r_png); popBg.setScaleY(1.7); popWindow.addChild(popBg); heroSprite.getParent().addChild(popWindow,3); var restartItem = cc.MenuItemImage.create( res.btn_1, res.btn_2, function(){ cc.log("再来一次"); if(isSharelayer){ isSharelayer = false; return; } var playScene = new PlayScene(); cc.director.pushScene(playScene); },popWindow); restartItem.setPosition(cc.p(-100,-120)); restartItem.setScaleX(2.0); restartItem.setScaleY(0.8); var labelStart = cc.LabelTTF.create("再来一次", "Arial", 24); labelStart.setColor(cc.color(255,144,0,255)); labelStart.setPosition(cc.p(-100,-120)); popWindow.addChild(labelStart,999); var shareItem = cc.MenuItemImage.create( res.btn_1, res.btn_2, function(){ cc.log("分享"); // dp_share(); },popWindow); shareItem.setPosition(cc.p(100,-120)); shareItem.setScaleX(2.0); shareItem.setScaleY(0.8); var labelShare = cc.LabelTTF.create("炫耀一下", "Arial", 24); labelShare.setColor(cc.color(255,144,0,255)); labelShare.setPosition(shareItem.getPosition()); popWindow.addChild(labelShare,999); var menu = cc.Menu.create(restartItem,shareItem); menu.x = 0; menu.y = 0; popWindow.addChild(menu, 3); var resultLabel = cc.LabelTTF.create("您坚持了" + Math.floor(duration * 100) / 100 + "秒,听说没人能过37秒,快让小伙伴们来挑战吧!!!", "Arial", 26,cc.size(400,100)); resultLabel.setPosition(cc.p(0, 35)); popWindow.addChild(resultLabel); popWindow.runAction(cc.ScaleTo.create(0.3,0.9));//弹窗从屏幕中间慢慢放大 // dp_submitScore(Math.floor(duration * 100) / 100); }; /** * * @param popWindow */ var sendResult = function(popWindow){ } var getnickname = function(time){ var nickname = ""; if(time < 10){ nickname = "初学菜鸟"; }else if(time < 20){ nickname = "挑战者 "; }else if(time < 30){ nickname = "屠龙战神"; }else if(time < 40){ nickname = "一代宗师"; }else if(time < 50){ nickname = "难逢敌手"; }else if(time < 60){ nickname = "生存勇者"; }else if(time < 70){ nickname = "钢铁意志"; }else { nickname = "不死之躯"; } return nickname; } /** * 将数组中的子数组删除 * @param array * @param childArray 需要删除的子数组 */ var deleteChildFromArray = function(array,childArray){ if(array.length < 1 || childArray.length < 1){ return; } for(var i = 0;i < childArray.length; i++){ var index = array.indexOf(childArray[i]); if(index > -1){ array.splice(index, 1); } } }; /** * 格式化时间,秒数转换成“12:50”的形式 * @param value 时间 * @returns {string} */ var timeFormat = function(value){ value = Math.floor(value); var align = function(value1){ var str1 = ""; if(value1 < 10){ str1 = "0" + value1; }else{ str1 = value1; } return str1; } var str = ""; if(value < 10){ str = "00:" + align(value); }else{ str = align(Math.floor(value / 60)) + ":" + align(value % 60); } return str; } //创造怪物的对象 /*var monsterCreater = { time : null, interval : null, node : null, getInstance : function(value){ this.time = 0; this.interval = 1; this.node = value; this.node.schedule(this.node.createMonster,this.interval); } };*/ /** * 创建游戏场景 */ var PlayScene = cc.Scene.extend({ onEnter:function(){ this._super(); var layer = new cc.Layer(); var bgLayer = new BgLayer(); layer.addChild(bgLayer);//添加背景层 monsterLayer = new cc.Layer(); layer.addChild(monsterLayer);//添加怪物层 heroLayer = new cc.Layer(); layer.addChild(heroLayer);//添加hero层 explosionLayer = new cc.Layer(); layer.addChild(explosionLayer);//添加怪物死亡爆炸层 var playLayer = new PlayLayer(); layer.addChild(playLayer);//游戏层 for(var i = 0; i <6; i++){ var childLayer = new cc.Layer(); monsterLayer.addChild(childLayer, 0, i + 1); } this.addChild(layer); } });