Sunday, April 20, 2025
spot_img

Tips on how to 2D topdown motion not utilizing Rigi2D?


I do this nevertheless it not easy like Unity enter, not good when press greater than two instructions.
Thanks u, Im a beginner

// PlayerMovement.ts
import { Node,  _decorator, Part, enter, Enter, KeyCode, EventKeyboard, Vec2, Vec3, Collider2D, ITriggerEvent } from 'cc';
import { PlayerController } from './PlayerController';
const { ccclass, property } = _decorator;

@ccclass('PlayerMovement')
export class PlayerMovement extends Part {
    @property(Collider2D)
    personal collider: Collider2D;
    personal moveDirection: Vec2 = new Vec2();
    // Định nghĩa Vec3 tạm thời bên ngoài phương thức replace để tái sử dụng
    personal tempVec3: Vec3 = new Vec3();
    onLoad() {
        // Lắng nghe sự kiện bàn phím
        enter.on(Enter.EventType.KEY_DOWN, this.onKeyDown, this);
        enter.on(Enter.EventType.KEY_UP, this.onKeyUp, this);
    }
    onDestroy() {
        // Hủy lắng nghe sự kiện khi part bị phá hủy
        enter.off(Enter.EventType.KEY_DOWN, this.onKeyDown, this);
        enter.off(Enter.EventType.KEY_UP, this.onKeyUp, this);
    }
    onKeyDown(occasion: EventKeyboard) {
        swap(occasion.keyCode) {
            case KeyCode.KEY_W:
                this.moveDirection.y = 1;
                break;
            case KeyCode.KEY_D:
                this.moveDirection.x = 1;
                break;
            case KeyCode.KEY_S:
                this.moveDirection.y = -1;
                break;
            case KeyCode.KEY_A:
                this.moveDirection.x = -1;
                break;
        }
    }

    onKeyUp(occasion: EventKeyboard) {
        swap(occasion.keyCode) {
            case KeyCode.KEY_W:
                this.moveDirection.y = 0;
                break;
            case KeyCode.KEY_D:
                this.moveDirection.x = 0;
                break;
            case KeyCode.KEY_S:
                this.moveDirection.y = 0;
                break;
            case KeyCode.KEY_A:
                this.moveDirection.x = 0;
                break;
        }
    }

    protected replace(dt: quantity): void {
        this.moveDirection.normalize(); //pace of cross transfer = regular transfer
        // Tính toán giá trị mục tiêu vị trí mới
        const targetPos = this.node.place.add3f(
            this.moveDirection.x * PlayerController.GPlayerModel.moveSpeed * dt,
            this.moveDirection.y * PlayerController.GPlayerModel.moveSpeed * dt,
            0
        );
        // Sử dụng lerp để di chuyển mượt mà đến vị trí mục tiêu
        this.node.setPosition(targetPos);
    }    
}

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisement -spot_img

Latest Articles