cocos3.8 人物控制,人物移动、跳跃,人物碰撞,碰撞触发

cocos3.8.2版本,时间24.5.15

1.前言

记录而已本身菜鸡

准备工作:地面和人物都得挂上碰撞体和刚体(要不然碰撞检测会报错):

人物的刚体和碰撞体要进行下面两个设置:要不然会发现碰撞检测不触发或者人往墙上跳

会粘着墙,

对于地面墙体的刚体进行下面设置节省资源(并且让它们不动):

2..cocos并没有像unity那样有Horizontal和Vertical那样简便的控制

(下面是我的代码,直接CV就好了,懒得再修改说明了,自己看吧)

private isJump:boolean = true;//是否在跳跃

    private selfBody:RigidBody2D = null;//自己的刚体组件

    private jpMoveArray:Array<number> = [];//键盘移动Key数组,其实就AD键而已,

    start() {

        let holdCollider = this.node.getComponent(Collider2D);

        input.on(Input.EventType.KEY_DOWN,this.onKeyDown, this);//键盘按下

        // input.on(Input.EventType.KEY_PRESSING,this.onKeyPressing, this);//键盘按着

        input.on(Input.EventType.KEY_UP,this.onKeyUp, this);//键盘抬起

        holdCollider.on(Contact2DType.BEGIN_CONTACT,this.onBeginContact, this);

        holdCollider.on(Contact2DType.END_CONTACT,this.onEndContact, this);

       

        this.selfBody = this.node.getComponent(RigidBody2D);

    }

    update(deltaTime: number) {

        if (this.jpMoveArray.length > 0) {

            let lv = this.selfBody.linearVelocity;//获取刚体的线性速度

            // 数组中只有AD的key,所有不是往左就是往右

            if (this.jpMoveArray[this.jpMoveArray.length - 1] == KeyCode.KEY_A) {

                // 向左移动

                lv.x = -8;

            }else{

                // 向右移动

                lv.x = 8;

            }

            this.selfBody.linearVelocity = lv;

        }else{

            // 停止运动

            let lv = this.selfBody.linearVelocity;

            lv = new Vec2(0, lv.y);

            this.selfBody.linearVelocity = lv;

        }

    }


 

    //按下时监听

    onKeyDown(event:EventKeyboard){

        // 按下A键

        if (event.keyCode == KeyCode.KEY_A) {

            this.AddJpMove(KeyCode.KEY_A);

        }else if(event.keyCode == KeyCode.KEY_D){

            this.AddJpMove(KeyCode.KEY_D);

        }else if(event.keyCode == KeyCode.KEY_W && !this.isJump){

            let lv = this.selfBody.linearVelocity;

            lv.y = 16;

            this.selfBody.linearVelocity = lv;

        }

    }

    // 按着时监听

    // onKeyPressing(event:EventKeyboard){

    //     console.log(event.keyCode);

    //     if (event.keyCode == KeyCode.KEY_A) {

    //         let lv = this.selfBody.linearVelocity;

    //         lv.x = -8;

    //         this.selfBody.linearVelocity = lv;

    //     }else if(event.keyCode == KeyCode.KEY_D){

    //         let lv = this.selfBody.linearVelocity;

    //         lv.x = 8;

    //         this.selfBody.linearVelocity = lv;

    //     }

    // }

    // 松开时监听

    onKeyUp(event:EventKeyboard){

        if (event.keyCode == KeyCode.KEY_A) {

            this.SpliceJpMove(KeyCode.KEY_A);

        }else if(event.keyCode == KeyCode.KEY_D){

            this.SpliceJpMove(KeyCode.KEY_D);

        }

    }

    // 开始碰撞时触发

    onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D){

        this.isJump = false;

    }

    // 结束碰撞时触发

    onEndContact(selfCollider: Collider2D, otherCollider: Collider2D){

        this.isJump = true;

    }

    /**添加键盘移动数组元素*/

    private AddJpMove(key:number){

        // 当数组没有包含键盘输入A时

        if (this.jpMoveArray.indexOf(key) == -1) {

            this.jpMoveArray.push(key);

        }

    }

    /**删除键盘移动数组元素*/

    private SpliceJpMove(key:number){

        for (let index = 0; index < this.jpMoveArray.length; index++) {

            if (this.jpMoveArray[index] == key) {

                // 如果包含这个key

                this.jpMoveArray.splice(index,1);

                break;

            }

        }

    }

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的人物控制脚本示例: ``` const {ccclass, property} = cc._decorator; @ccclass export default class PlayerController extends cc.Component { @property(cc.Float) speed: number = 300; private _isMoving: boolean = false; onLoad() { cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this); } onDestroy() { cc.systemEvent.off(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this); cc.systemEvent.off(cc.SystemEvent.EventType.KEY_UP, this.onKeyUp, this); } update(dt: number) { if (this._isMoving) { const x = this.node.x + this.speed * dt; this.node.setPosition(x, this.node.y); } } private onKeyDown(event: cc.Event.EventKeyboard) { switch(event.keyCode) { case cc.macro.KEY.left: this._isMoving = true; break; } } private onKeyUp(event: cc.Event.EventKeyboard) { switch(event.keyCode) { case cc.macro.KEY.left: this._isMoving = false; break; } } } ``` 在这个脚本中,我们定义了一个 `PlayerController` 类,它继承自 `cc.Component`。我们通过 `@property` 装饰器定义了一个 `speed` 属性,用于控制人物移动速度。我们还定义了一个 `_isMoving` 属性,用于记录人物是否正在移动。 在 `onLoad` 方法中,我们注册了键盘事件的监听器。在 `onDestroy` 方法中,我们移除了事件监听器,以免在脚本销毁时出现内存泄漏。 在 `update` 方法中,我们检查 `_isMoving` 属性的值,如果为 `true`,则将人物向右移动一定距离,距离的大小由 `speed` 属性决定。 在 `onKeyDown` 和 `onKeyUp` 方法中,我们检查键盘事件的键码,如果是左箭头键,则将 `_isMoving` 属性的值设置为 `true` 或 `false`。 这是一个非常简单的人物控制脚本示例,可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值