【用Cocos Creator给暗恋的女生写一个游戏(6)】——(Run Game)主角逻辑

我们在Canvas节点的同级添加一个Game节点,并添加两个子节点如图

这里写图片描述

新建一个脚本取名叫做“Game”并添加到Game节点上

Game.js

var Player = require("Player");
cc.Class({
    extends: cc.Component,

    properties: {
        player:Player,
    },

    onLoad: function () {
        //返回键返回菜单
        cc.eventManager.addListener({
            event: cc.EventListener.KEYBOARD,
            onKeyPressed: function(keyCode, event) {
                if(keyCode == cc.KEY.back){
                    cc.director.loadScene('Menu');
                }
            }
        }, this.node);
        this.startGame();
    },

    startGame: function(){
        this.player.init(this);
    },

    stopGame: function(){

    },

});

作为一个专业的游戏开发者(一脸严肃,咳咳),我们有必要探讨一下游戏的设计模式

我们知道一个游戏中会有很多元素,对应到我们设计的很多节点,按理说每个节点都有自己的逻辑,有时多个节点彼此也有联系,我们把每个节点想象成一个人,如果每个人都乱交(胡乱交际的意思,请那位早熟的同学出去),那这个游戏的世界就乱套,所以我们需要一位领导者来领导这些人,每一位普通人都各司其职,当他需要其他人的帮助时,要向领导者请示,这样一来,所有普通人都只与领导者联系,领导者控制者所有普通人,世界一片美好。。。我们把这个模式叫做领导者模式(这个名字是我自己起的。。。。)

这个Game就相当于领导者,我们在其中写游戏的主体逻辑和管理各个节点的重要方法,像开始游戏,结束游戏和各个节点的初始化之类

require方法可以得到脚本组件,我们在属性里添加一个player让它的类型是require(“Player”),然后在将Player节点拖入对应位置,player属性就会引用Player节点的Player脚本,这样就可以在Game.js里调用Player.js的方法了(Player.js应先建立,不然require不到文件会报错)

这里写图片描述

新建一个脚本取名叫做“Player”并添加到Player节点上

Player.js

var STATE = cc.Enum({
    NONE:0,
    NORMAL:1,
    SUPER:2,
    DEAD:3,
});
cc.Class({
    extends: cc.Component,

    properties: {
        speedX:0,
        gravity:0,
        jumpSpeed:0,
        groundY:0,
        state:{
            default:STATE.NONE,
            type:STATE,
            visible:false,//属性面板不显示
        }
    },

    // // use this for initialization
    init: function (game) {
        this.game = game;
        this.speedY = 0;
        this.state = STATE.NORMAL;
        this.registerInput();
    },

    registerInput: function(){
        let self = this;
        //键盘事件
        cc.eventManager.addListener({
            event: cc.EventListener.KEYBOARD,
            onKeyPressed: function(keyCode, event) {
                if(keyCode == cc.KEY.back){
                    cc.director.loadScene("Menu");
                }else{
                    self.jump();
                }
            }
        }, self.node);
        //触摸事件
        cc.eventManager.addListener({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            onTouchBegan: function(touch, event) {
                self.jump();
            }
        }, self.node);
    },

    jump:function(){
        this.speedY = this.jumpSpeed;  
    },

    strengthen:function(){
        this.state = STATE.SUPER;
    },

    recover:function(){
        this.state = STATE.NORMAL;
    },

    die:function(){
        this.state = STATE.DEAD;  
    },

    update: function (dt) {
        if(this.state != STATE.NONE && this.state != STATE.DEAD){
            this.speedY -= this.gravity * dt;
            this.node.y += this.speedY * dt;
            if(this.node.y <= this.groundY){
                this.node.y = this.groundY;
            }
        }
    },
});

这里写图片描述

我们从上往下看

大多数情况下我们都会给主角划分状态,我这里给主角设定了四个状态

NONE:游戏开始前,什么状态都没有

NORMAL:正常状态

SUPER:超级赛亚人形态。。。

DEAD:死

主角的一些基本属性

speedX:主角的横向速度,因为相对屏幕水平是不移动的,这个x轴速度是用来移动背景的,暂时不用管,

gravity:重力,

jumpSpeed:起跳速度,

groundY:地面位置,我们让它等于主角落在地面是主角的Y轴坐标,主角是不能掉到地面下方的,我们会在更新主角位置时判断

state:主角的状态,一开始我们把它设为无状态(OMG啊。。。)

当领导发话“开始游戏了!”,player就执行init方法,初始化一些乱七八糟的东西,让主角状态变成normal,注册事件

中间的几个改变主角状态的方法,会在特定的时候调用

最下面的update会根据主角的属性更新主角的位置

看一下效果

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值