56 lines
1.8 KiB
TypeScript
Raw Normal View History

2022-12-08 21:14:02 +08:00
import { _decorator, Component, Node, input, Input, EventTouch, Vec2, Vec3, UITransform } from "cc";
2022-11-27 23:23:47 +08:00
const { ccclass, property } = _decorator;
2022-12-08 21:14:02 +08:00
@ccclass("JoyStickManager")
2022-11-27 23:23:47 +08:00
export class JoyStickManager extends Component {
2022-12-08 21:14:02 +08:00
input: Vec2 = Vec2.ZERO;
private body: Node;
private stick: Node;
private touchStartPos: Vec2;
private defaultPos: Vec2;
private radius: number = 0;
init() {
this.body = this.node.getChildByName("Body");
this.stick = this.body.getChildByName("Stick");
const { x, y } = this.body.position;
this.defaultPos = new Vec2(x, y);
this.radius = this.body.getComponent(UITransform).contentSize.x / 2;
input.on(Input.EventType.TOUCH_START, this.onTouchMove, this);
input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this);
}
onDestroy() {
input.off(Input.EventType.TOUCH_START, this.onTouchMove, this);
input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
input.off(Input.EventType.TOUCH_END, this.onTouchEnd, this);
}
onTouchMove(e: EventTouch) {
const touchPos = e.touch.getUILocation();
if (!this.touchStartPos) {
this.touchStartPos = touchPos.clone();
this.body.setPosition(this.touchStartPos.x, this.touchStartPos.y);
2022-11-27 23:23:47 +08:00
}
2022-12-08 21:14:02 +08:00
const stickPos = new Vec2(touchPos.x - this.touchStartPos.x, touchPos.y - this.touchStartPos.y);
const len = stickPos.length();
if (len > this.radius) {
stickPos.multiplyScalar(this.radius / len);
2022-11-27 23:23:47 +08:00
}
2022-12-08 21:14:02 +08:00
this.stick.setPosition(stickPos.x, stickPos.y);
this.input = stickPos.clone().normalize();
}
2022-11-27 23:23:47 +08:00
2022-12-08 21:14:02 +08:00
onTouchEnd() {
this.body.setPosition(this.defaultPos.x, this.defaultPos.y);
this.stick.setPosition(0, 0);
this.touchStartPos = undefined;
this.input = Vec2.ZERO;
}
2022-11-27 23:23:47 +08:00
}