内容纲要

StartUi搭建

  • 开始界面:建立2个ui按钮
  • 分别管理开始,和选着关卡
    泡泡龙插图
  • 通过脚本管理按钮:加载不同场景
   properties: {
        //计时组件
        time: 0,
        timeLabel: {
            type: cc.Label,
            default: null,
        },
        //bgm
        Bgm: {
            type: cc.AudioClip,
            default: null,
        },
    },
    onLoad() {
        //开启碰撞检测
        cc.director.getPhysicsManager().enabled = true;
        this.schedule(this.onTime, 1);
        cc.audioEngine.playEffect(this.Bgm, false);
    },
    //计时
    onTime() {
        this.time -= 1;
        this.timeLabel.string = 'Time:' + this.time;
    },
    //加载不同场景
    onStarButton() {
        cc.director.loadScene('StarGame');
    },
    OncustomsGame() {
        cc.director.loadScene('customsGame');
    },
    onGame() {
        cc.director.loadScene('Game');
    },
    onGame2() {
        cc.director.loadScene('Game2');
    },
    onGame3() {
        cc.director.loadScene('Game3');
    },

mainUi搭建

  • 在场景中分别添加地面、怪物、人物、3个渲染文字
    泡泡龙插图(1)

场景

  • 给地面、怪物、人物添加物理组件实现物理运动物理组件
    8584094eb.png)
  • 改变人物、地面、怪物的Type
    泡泡龙插图(2)
  • 建立分组:来判断碰撞的对象
    泡泡龙插图(3)

人物状态:定义

   onLoad() {
        this.isLeftMove = false;//是否可以左移
        this.isRightMove = false;//是否可以右移
        this.isjumpMove = false;//是否能跳跃
        this.isAtk = false;//是否可以攻击
        this.isBullet = false;//子弹是否存在
        this.isFile = false;//是否能存档
        this.isScroe = false;//是否加分
        this.isDis = false;//是否死亡
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onkeyDown, this);//获取玩家按键输入
        cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onkeyUp, this);
        this.playerRigid = this.node.getComponent(cc.RigidBody);//获取玩家的rigidbody
    },

按键输出

  onkeyDown(event) {
        switch (event.keyCode) {
            //玩家按下就移动
            case cc.macro.KEY.a:
                cc.audioEngine.playEffect(this.moveBgm, false);
                this.isLeftMove = true;
                break;
            //玩家按下就移动
            case cc.macro.KEY.d:
                cc.audioEngine.playEffect(this.moveBgm, false);
                this.isRightMove = true;
                break;
            case cc.macro.KEY.w:
                //如果是能跳跃
                if (this.isjumpMove) {
                    cc.audioEngine.playEffect(this.jumpBgm, false);
                    this.playerRigid.linearVelocity = cc.v2(0, 0);//重置限行速度归零
                    this.playerRigid.applyLinearImpulse(cc.v2(0, this.JumpHeight), this.playerRigid.getWorldCenter());//执行跳跃
                    this.isjumpMove = false;//执行过了
                }
                break;
            case cc.macro.KEY.space:
                cc.audioEngine.playEffect(this.AtkBgm, false);
                this.isAtk = true;//按下发子弹
                break;
        }
    },

    onkeyUp(event) {
        switch (event.keyCode) {
            case cc.macro.KEY.a:
                this.isLeftMove = false;
                break;
            case cc.macro.KEY.d:
                this.isRightMove = false;
                break;
            case cc.macro.KEY.space:
                this.isBullet = false;//子弹是否存在
                this.isAtk = false;//没按下
                break;
        }
    },

玩家的碰撞

       onBeginContact: function (contact, selfCollider, otherCollider) {

        if (otherCollider.node.group == 'Ground') {
            console.log('ground');
            this.playerRigid.linearVelocity = cc.v2(1, this.playerRigid.linearVelocity.y);
            this.isjumpMove = true;
        }
        else if (otherCollider.node.group == 'BM') {
            console.log('BM');
            var ms = cc.instantiate(this.PropPrefab);
            this.node.parent.addChild(ms);
            ms.x = this.node.x - 60;
            ms.y = this.node.y + 10;
            otherCollider.node.destroy();
        }
        else if (otherCollider.node.group == 'Prop') {
            otherCollider.node.destroy();
            this.isScroe = true;
            console.log('Prop');
        }
        else if (otherCollider.node.group == 'Monster') {
            this.isDis = true;
        }
        else if (otherCollider.node.group == 'Bullets') {
            console.log('bt');
            otherCollider.node.destroy();
        }
    },

玩家的得分与死亡

   onScroe() {
        cc.audioEngine.playEffect(this.scroeBgm, false);//得分播放音乐
        this.scroe += 10;//加分
        this.scroeLabel.string = 'Scroe:' + this.scroe;//写入组件中

    },
    onHP() {
        this.hpPlayer -= 1;//掉血
        this.hpPlayerLabel.string = 'Hp:' + this.hpPlayer;//写入掉血组件中
    },

玩家的更新

   update(dt) {
        //如果玩家死亡就hp减少,初始化人物位置
        if (this.isDis) {
            this.onHP();
            this.node.x = 211;
            this.node.y = 100;
            //玩家死亡就重新加载场景
            if (this.hpPlayer == 0) {
                cc.director.loadScene('StarGame');
            }
            //死亡重置
            this.isDis = false;
        }
        else {
            //如果能移动
            if (this.isLeftMove) {
                this.node.x -= 2;
                this.node.scaleX = 1;
                this.playerRigid.linearVelocity = cc.v2(1, this.playerRigid.linearVelocity.y);
            }
            //如果能移动
            if (this.isRightMove) {
                this.node.x += 2;
                this.node.scaleX = -1;
                this.playerRigid.linearVelocity = cc.v2(-1, this.playerRigid.linearVelocity.y);
            }
            //玩家的得分如果及格加载地图
            //可通过外部改变reachScroe选择加载场景
            if (this.scroe == this.reachScroe) {
                if (this.goodgame == 2) {
                    cc.director.loadScene('Game2');
                }
                if (this.goodgame == 3) {
                    cc.director.loadScene('Game3');
                }
                if (this.goodgame == 0) {
                    cc.director.loadScene('StarGame');
                }
            }
            // if (this.isFile) {
            //用来存档
            //     this.node.x = this.playerX;
            //     this.node.y = this.playerY;
            //     this.isFile = false;
            // }
            //是否能得分
            if (this.isScroe) {
                this.onScroe();
                this.isScroe = false;
            }
            //按下是否能攻击,并且要松开才能生成子弹
            if (this.isAtk) {
                if (this.isBullet == false) {
                    //添加子弹
                    var bt = cc.instantiate(this.bulletPrefab);
                    this.node.parent.addChild(bt);
                    //初始化子弹的位置根据人物转向
                    if (this.node.scaleX < 0) {
                        bt.scaleX = 1;
                        bt.x = this.node.x + 100;
                        bt.y = this.node.y;
                    }
                    else {
                        bt.scaleX = -1;
                        bt.x = this.node.x - 100;
                        bt.y = this.node.y;
                    }
                }
                //重置子弹
                this.isBullet = true;
            }
        }
    },

怪物的移动定义

      properties: {
        //可以通过外部动态的该边怪物的移动速度
        rightTime: 2,
        right: 350,
        leftTime: 2,
        left: -350,
        upTime: 0,
        up: 0,
        downTime: 0,
        down: 0,
        time: 0,
        state: false,//规定fase为左右移动

    },
    onLoad() {
        //是否能移动
        this.isleft = false;
    },

怪物移动方法

  vertical() {
        var up = cc.moveBy(this.upTime, cc.v2(0, this.up));
        var down = cc.moveBy(this.downTime, cc.v2(0, this.down));
        var ud = cc.repeatForever(cc.sequence(up, down));
        this.node.runAction(ud);
    },

怪物的跟新

        //动态的控制怪物移动速度
        this.time += dt;
        if (this.time >= 2) {
            if (this.isleft) {
                //怪物移动
                var right = cc.moveBy(this.rightTime, cc.v2(this.right, 0));
                //执行动画
                this.node.getComponent(cc.Animation).play('rightMonster');
                this.node.runAction(right);
                //重置移动状态
                this.isleft = false;
            }
            else {
                //怪物移动
                var left = cc.moveBy(this.leftTime, cc.v2(this.left, 0));
                //执行动画
                this.node.getComponent(cc.Animation).play('leftMonster');
                this.node.runAction(left);
                //重置移动状态
                this.isleft = true;
            }
            //重置时间
            this.time = 0;
        }
    },

飞怪物做成预制体

       properties: {
        //飞的怪物
        FlyMonster: {
            type: cc.Prefab,
            default: null,
        },
    },

定义

  onLoad() {
        this.move = true;//是否能移动
        this.up = false;//是否向上
        this.iscrash = false;//是否碰撞
        this.isMove=false;//碰撞到墙是否能移动
        this.monsterX;//记录碰撞点
        //开始的时候调用一次
        this.scheduleOnce(function () {
            this.move = false;
            this.up = true;
        }, 1);
    },

碰撞

  monster: null,
    onBeginContact: function (contact, selfCollider, otherCollider) {
        //碰撞到怪物
        if (otherCollider.node.group == 'Monster') {
            this.iscrash = true;//碰撞了
            this.move = false;//不能移动了
            var ms = cc.instantiate(this.FlyMonster);//生成飞怪物
            this.node.parent.addChild(ms);
            ms.x = this.node.x;//重置位置
            ms.y = this.node.y;
            selfCollider.node.destroy();
            otherCollider.node.destroy();
        }
        else if (otherCollider.node.group == 'Ground') {
            this.isMove=true;//碰撞到地面就停下
        }
    },

逻辑更新

 update(dt) {
        //是否能移动
        if(this.isMove)
        {
            return;
        }
        else
        {
            //能移动根据气泡方向移动
            if (this.move) {
                if (this.node.scaleX > 0) {
                    this.node.x += 3;
                }
                else {
                    this.node.x -= 3;
                }
            }
            //都要飞上去
            if (this.up) {
                this.node.y += 3;
            }
        }
    },

飞怪物定义

   onLoad () {
        //是否停留在地面
        this.isground=false;
    },

碰撞

     onBeginContact: function (contact, selfCollider, otherCollider) {
        //碰撞到地面就停留在地面
        if (otherCollider.node.group == 'Ground') {
            console.log('ground');
            this.isground = true;
        }
    },

更新

      //如果没有碰撞到地面就飞走
        if(this.isground)
        {
            return;
        }
        else
        {
            this.node.y+=2;
        }
    },

https://github.com/chen2964191435/popo

发表评论