cocos creator实战-(三)简单例子摇杆控制角色移动

(待完善,给玩家加上摄像机跟随效果)

1、stick监听cc.Node.EventType.TOUCH_MOVE事件,获取tick移动的坐标和朝向,限制移动的范围

2、根据stick的朝向,每帧更新player的位置和方向

 

// 摇杆代码 joy_stick.js

cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //     // ATTRIBUTES:
        //     default: null,        // The default value will be used only when the component attaching
        //                           // to a node for the first time
        //     type: cc.SpriteFrame, // optional, default is typeof default
        //     serializable: true,   // optional, default is true
        // },
        // bar: {
        //     get () {
        //         return this._bar;
        //     },
        //     set (value) {
        //         this._bar = value;
        //     }
        // },
        stick:{
            type: cc.Node,
            default: null
        },
        max_r : 80
    },

    // LIFE-CYCLE CALLBACKS:

    onLoad () {
        this.start_pos = cc.v2(0, 0);
        this.stick.setPosition(this.start_pos);

        this.dir = cc.v2(0, 0);

        this.stick.on(cc.Node.EventType.TOUCH_START, function(){

        }.bind(this), this);

        this.stick.on(cc.Node.EventType.TOUCH_MOVE, function(e){
            var w_pos = e.getLocation();
            var pos = this.node.convertToNodeSpaceAR(w_pos);
            var len = pos.mag();

            /* 好处
            归一化,一个方向,只有一个值;
            this.dir.x = cos(r);
            this.dir.y = sin(r);
            // -1, 1
            */
            this.dir.x = pos.x / len;
            this.dir.y = pos.y / len;



            if(len > this.max_r){
                // 三角函数或者比例关系算坐标
                pos.x = pos.x * this.max_r / len;
                pos.y = pos.y * this.max_r / len;
            }
            this.stick.setPosition(pos);

        }.bind(this), this);

        this.stick.on(cc.Node.EventType.TOUCH_END, function(){
            this.dir = cc.v2(0, 0);
            this.stick.setPosition(this.start_pos);
        }.bind(this), this);

        this.stick.on(cc.Node.EventType.TOUCH_CANCEL, function(){
            this.dir = cc.v2(0, 0);
            this.stick.setPosition(this.start_pos);
        }.bind(this), this);
    },

    start () {

    },

    // update (dt) {},
});

 

// 玩家代码 player.js

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

    properties: {
        stick : {
            default : null,
            type : joy_stick
        },
        speed : 80
    },

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {},

    start () {

    },

    update (dt) {
        if (this.stick.dir.mag() < 0.5) {
            return;
        }

        var vx = this.stick.dir.x * this.speed;
        var vy = this.stick.dir.y * this.speed;

        this.node.x += vx * dt;
        this.node.y += vy * dt;

        // Math.atan2(y,x) 计算出来的结果angel是一个弧度值 数学的弧度是逆时针的 而游戏中是顺时针的
        var angel = Math.atan2(this.stick.dir.y, this.stick.dir.x);
        var degree = angel* 180 / Math.PI;
        degree = 360 - degree + 90;

        this.node.rotation = degree;
    },
});

 

posted @ 2019-04-03 23:11  orxx  阅读(5520)  评论(0编辑  收藏  举报