3.3.2的缓动写法问题

我是一个cocos 初学者,在对着文档 star-catcher/的demo。然后我本地用的是3.3.2的版本,然后demo教程给的是2.4的版本,代码写法可能有点区别。当我尝试学教程上面的缓动写法的时候, 2.4版本的缓动可以只穿Y坐标,然后他能正确的控制小人上下跳。3.3.2版本的好像只能传个 position进去,给他个Vec3,就要指定 x,y,z 三个值。然后我x和z都传0给他,小人也能跳。

但是我跟到教程后面,尝试修改小人的左右移动的时候,发现移动不了,感觉是因为我在控制他跳的缓动里面写死了0的原因,这种情况该怎么办呢? 我是个初学者,很多api不是很了解,希望大神能指点一下。

很抱歉,目前确实存在这个问题。

建议你在小人的节点上,添加一个父节点 Node, 用于 小人的左右移动。

自己封装一个y属性试试呢?
class{

get y():number{
let position=this.node.getPosition().clone();
return position.y;
}

set y(value:number){
if(value==null){
// 曾遇到过这样写会出现传入一个undefined的值
return;
}
let position=this.node.getPosition().clone();
this.node.setPosition(position.x,value,position.z);
}

tweenAnim(){
tween(this)
.to(0.5,{y:100})
.start();
}

}

1赞

不行啊。。。好像不触发

import { _decorator, Component, Node, tween, Vec3, systemEvent, SystemEvent, macro, KeyCode } from ‘cc’;
const { ccclass, property } = _decorator;

/**

  • Predefined variables
  • Name = Player
  • DateTime = Thu Nov 18 2021 19:08:41 GMT+0800 (China Standard Time)
  • Author = damen_
  • FileBasename = Player.ts
  • FileBasenameNoExtension = Player
  • URL = db://assets/scripts/Player.ts
  • ManualUrl = Introduction · Cocos Creator

*/

@ccclass(‘Player’)
export class Player extends Component {
// [1]
// dummy = ‘’;

// [2]
// @property
// serializableDummy = 0;

// 主角跳跃高度
@property
jumpHeight = 0;
// 主角跳跃持续时间
@property
jumpDuration = 0;
// 最大移动速度
@property
maxMoveSpeed = 0;
// 加速度
@property
accel = 0;
// 向左移动
@property
accLeft: boolean = false;
// 向右移动
@property
accRight: boolean = false;

@property
xSpeed = 0;

get y():number{
    let position=this.node.getPosition().clone();
    return position.y;
}

set y(value:number){
    if(value==null){
        // 曾遇到过这样写会出现传入一个undefined的值
        return;
    }
    let position=this.node.getPosition().clone();
    this.node.setPosition(position.x,value,position.z);
    console.log("set y...");
}

runJumpAction() {

    // 跳跃上升
    var jumpUp = tween().by(this.jumpDuration, { y: this.jumpHeight }, {easing: 'sineOut'});

    // 下落
    var jumpDown = tween().by(this.jumpDuration,{ y: -this.jumpHeight }, {easing: 'sineIn'});

    // 创建一个缓动,按 jumpUp、jumpDown 的顺序执行动作
    var tweens = tween().sequence(jumpUp, jumpDown);
    // 不断重复
    return tweens;
}

onKeyDown (event) {
    // set a flag when key pressed
    switch(event.keyCode) {
        case KeyCode.KEY_A:
            console.log("onKeyDown  A");
            this.accLeft = true;
            break;
        case KeyCode.KEY_D:
            console.log("onKeyDown  D");
            this.accRight = true;
            break;
    }
}

onKeyUp (event) {
    // unset a flag when key released
    switch(event.keyCode) {
        case KeyCode.KEY_A:
            this.accLeft = false;
            break;
        case KeyCode.KEY_D:
            this.accRight = false;
            break;
    }
}

onLoad () {
    var jumpAction = this.runJumpAction();
    tween(this.node).repeatForever(jumpAction).start();

    // 加速度方向开关
    this.accLeft = false;
    this.accRight = false;
    // 主角当前水平方向速度
    this.xSpeed = 0;


    systemEvent.on(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
    systemEvent.on(SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
}


start () {
    // [3]


}

// update (deltaTime: number) {
//     // [4]
// }

update (deltaTime: number) {
    // [4]
    // 根据当前加速度方向每帧更新速度
    if (this.accLeft) {
        console.log("this.accLeft")
        this.xSpeed -= this.accel * deltaTime;
    }
    else if (this.accRight) {
        console.log("this.accRight")
        this.xSpeed += this.accel * deltaTime;
    }

    // 限制主角的速度不能超过最大值
    if (Math.abs(this.xSpeed) > this.maxMoveSpeed) {
        // if speed reach limit, use max speed with current direction
        this.xSpeed = this.maxMoveSpeed * this.xSpeed / Math.abs(this.xSpeed);
    }

    console.log("this.xSpeed: ",this.xSpeed);

    // 根据当前速度更新主角的位置
    var currentPosition = this.node.getPosition();
    this.node.position = new Vec3(currentPosition.x+this.xSpeed * deltaTime, currentPosition.y, currentPosition.z);
}

onDestroy () {
    // 取消键盘输入监听
    systemEvent.off(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
    systemEvent.off(SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
}

}

我研究研究, 刚学,还不知道怎么加父节点,来控制, 只是对着教程敲代码。

搞好了, 我刚才写错了, 这个get set 是这个类的属性,所以我应该把this 传递给 tween。

我对 这个tween的用法好像也有了一点懂了, 第二个参数传递的是 要修改对象的属性。。。

是的 :stuck_out_tongue_closed_eyes:

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。