内容纲要

1.游戏原图:

影子传说插图
影子传说插图(1)
影子传说插图(2)

2.游戏玩法及介绍

  • 影子传说是1985年任天堂出品的一款FC红白机游戏,一款塔夫的游戏,节奏很快,故事改编自一部快节奏的忍者题材电影,因此整部游戏也极具电影感。
  • 故事一开始,公主Kiri就被邪恶忍者绑架,这时,主角影从一片树林后跳了出来,前去营救公主。
  • a,d键控制人物左右移动,w键控制人物跳跃,j键攻击

3.游戏制作

1. 搭建游戏开始场景,并添加部分开始动画,并以h键开始游戏

影子传说插图(3)

h键开始游戏代码:

onKeyDown: function (event) {
    switch (event.keyCode) {
        case cc.macro.KEY.h:
            cc.director.preloadScene("Main");
            cc.director.loadScene('Main');
            break;
    }
},
2. 搭建游戏主场景

人物移动,跳跃,攻击,代码实现

case cc.macro.KEY.a:
    this.left = true;
    break;
case cc.macro.KEY.d:
    this.right = true;
    break;
case cc.macro.KEY.w:
    this.up = true;
    break;
case cc.macro.KEY.j:
    this.atc = true;
    break;
if (this.left) {
    this.node.scaleX = 1;
    if (this.node.x > -4335) {
        this.node.x -= 3;
    }
    if (this.moving == false) {
        anim.play('RightClip');
        this.moving = true;
    }
}
else if (this.left == false && this.right == false) {
    anim.play('Stand');
    this.moving = false;
}
if (this.right) {
    this.node.scaleX = -1;
    if (this.node.x < 225) {
        this.node.x += 3;
    }
    if (this.moving == false) {
        anim.play('RightClip');
        this.moving = true;
    }
}
else if (this.right == false && this.left == false) {
    anim.play('Stand');
    this.moving = false;
}
if (this.up) {
    if (this.rb.linearVelocity.y == 0) {
        this.rb.linearVelocity = cc.v2(0, 500);
    }
    if (this.right) {
        anim.play('LeftJump');
    }
    else if (this.left) {
        anim.play('LeftJump');
    }
    else if (this.left == false && this.right == false) {
        anim.play('Jump');
    }
    else if (this.left == true && this.right == true) {
        anim.play('Jump');
    }
}
else {
    if (this.node.y > -100) {
        anim.play('Jump');
    }
}
if (this.atc) {
    if (this.attcking == false) {
        var plb = cc.instantiate(this.playerBulletPrefab);
        this.node.parent.addChild(plb);
        if(this.node.scaleX>0){
            plb.x=this.node.x-30;
            plb.y=this.node.y;
            plb.scaleX=1;
        }
        else{
            plb.x=this.node.x+30;
            plb.y=this.node.y;
            plb.scaleX=-1;
        }
        plb.getComponent('Bullet').Main = this;
        this.attcking = true;
    }
}

子弹预制体以及红色敌人预制体:拖拽子弹(红色敌人)图片至Canvas下,添加脚本Bullet(RedMove),然后将该节点拖拽至asset下,删除Canvas下bulletPrefab(redPrefab)节点,生成子弹(红色敌人)预制体。

人物子弹碰撞敌人,碰撞敌人子弹的代码实现

onBeginContact: function (contact, selfCollider, otherCollider) {
        if ((otherCollider.node.name == 'blue1') || (otherCollider.node.name == 'blue0') || (otherCollider.node.name == 'HuidaoBlue0')|| (otherCollider.node.name == 'HuidaoBlue1')|| (otherCollider.node.name == 'HuidaoBlue2')|| (otherCollider.node.name == 'HuidaoBlue3')
        || (otherCollider.node.name == 'blue2')|| (otherCollider.node.name == 'blue3')) {
            var d = cc.instantiate(this.diePrefab);
            this.node.parent.addChild(d);
            d.position = this.node.position;
            otherCollider.node.destroy();
            selfCollider.node.destroy();
            this.Main.gainScore();
        }
        if(otherCollider.node.name == 'Red'){
            var d = cc.instantiate(this.diePrefab);
            this.node.parent.addChild(d);
            d.position = this.node.position;
            otherCollider.node.destroy();
            selfCollider.node.destroy();
            this.Main.gainScore();
            this.Main.gainScore();
        }
        if (otherCollider.node.name == 'Boss') {
            var d = cc.instantiate(this.diePrefab);
            this.node.parent.addChild(d);
            d.position = this.node.position;
            otherCollider.node.destroy();
            selfCollider.node.destroy();
            cc.director.loadScene('Meet');
        }
        if (otherCollider.node.name == 'redBullet') {
            otherCollider.node.destroy();
            selfCollider.node.destroy();
        } 
    },

其中this.Main.gainScore();为调用获取分数的方法,该方法实现代码

gainScore: function () {
    this.score += 10;
    // 更新 scoreDisplay Label 的文字
    this.scoreDisplay.string = '1UP:' + this.score;
    if ((this.score > 250) && (this.node.x<-3000)) {
        this.meet = true;
        this.Boss.active = true;
    }
},

代码实现人物碰撞敌人子弹死亡

if (otherCollider.node.name == 'redBullet') {
    otherCollider.node.destroy();
    this.hp = 0;
    this.subLife();
}

其中this.subLife();为调用人物生命值方法

subLife: function () {
    this.life -= 1;
    if (this.life < 0) {
        cc.director.loadScene('Black');
    }
    //更新LifeDisplay的文字
    this.LifeDisplay.string = this.life;
    },
3. 实现Boss移动,发射火焰。

首先生成火焰预制体,火焰预制体上添加火焰移动代码
其次在Boss中添加火焰预制体,并判断与人物距离,实习移动,具体代码如下

//生成火焰
spawnFire() {
    var fire = cc.instantiate(this.FirePrefab);
    this.node.addChild(fire);
},
//限制火焰生成时间
onLoad() {
    this.schedule(this.spawnFire, 5);
},

发表评论