first commit
This commit is contained in:
109
assets/scripts/GameMrg.ts
Normal file
109
assets/scripts/GameMrg.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import {
|
||||
_decorator,
|
||||
Component,
|
||||
Vec3,
|
||||
RigidBody,
|
||||
input,
|
||||
Input,
|
||||
EventTouch,
|
||||
} from "cc";
|
||||
import { TrajectoryPreview } from "./TrajectoryPreview";
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@ccclass("GameMrg")
|
||||
export class GameMrg extends Component {
|
||||
@property(RigidBody)
|
||||
rigidBody: RigidBody = null!;
|
||||
|
||||
@property(TrajectoryPreview)
|
||||
trajectory: TrajectoryPreview = null!;
|
||||
|
||||
@property
|
||||
maxPower: number = 25;
|
||||
|
||||
private startPos: Vec3 = new Vec3();
|
||||
private endPos: Vec3 = new Vec3();
|
||||
private isDragging: boolean = false;
|
||||
|
||||
start() {
|
||||
input.on(Input.EventType.TOUCH_START, this.onTouchStart, this);
|
||||
input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
|
||||
input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this);
|
||||
input.on(Input.EventType.TOUCH_CANCEL, this.onTouchEnd, this);
|
||||
}
|
||||
|
||||
onDestroy() {
|
||||
input.off(Input.EventType.TOUCH_START, this.onTouchStart, this);
|
||||
input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
|
||||
input.off(Input.EventType.TOUCH_END, this.onTouchEnd, this);
|
||||
input.off(Input.EventType.TOUCH_CANCEL, this.onTouchEnd, this);
|
||||
}
|
||||
|
||||
onTouchStart(e: EventTouch) {
|
||||
this.startPos.set(e.getLocation().x, e.getLocation().y, 0);
|
||||
this.isDragging = true;
|
||||
}
|
||||
|
||||
onTouchMove(e: EventTouch) {
|
||||
if (!this.isDragging) return;
|
||||
this.endPos.set(e.getLocation().x, e.getLocation().y, 0);
|
||||
const dragVec = new Vec3(
|
||||
this.startPos.x - this.endPos.x,
|
||||
this.startPos.y - this.endPos.y,
|
||||
0
|
||||
);
|
||||
if (dragVec.length() < 10) {
|
||||
this.trajectory.hideTrajectory();
|
||||
return;
|
||||
}
|
||||
|
||||
// 主方向(始终向前 + 抬升)
|
||||
const forward = new Vec3(0, 0.5, 1).normalize();
|
||||
|
||||
// 力度
|
||||
const power = Math.min(dragVec.y * 0.05 + 10, this.maxPower);
|
||||
|
||||
// 左右弧线
|
||||
const sideForce = dragVec.x * 0.02;
|
||||
|
||||
// 显示轨迹
|
||||
this.trajectory.showTrajectory(
|
||||
// this.rigidBody.node.worldPosition,
|
||||
this.startPos.clone(),
|
||||
forward,
|
||||
power,
|
||||
sideForce
|
||||
);
|
||||
}
|
||||
|
||||
onTouchEnd(e: EventTouch) {
|
||||
if (!this.isDragging) return;
|
||||
this.isDragging = false;
|
||||
this.trajectory.hideTrajectory();
|
||||
|
||||
this.endPos.set(e.getLocation().x, e.getLocation().y, 0);
|
||||
|
||||
const dragVec = new Vec3(
|
||||
this.startPos.x - this.endPos.x,
|
||||
this.startPos.y - this.endPos.y,
|
||||
0
|
||||
);
|
||||
|
||||
if (dragVec.length() < 10) return;
|
||||
|
||||
// 主方向
|
||||
const forward = new Vec3(0, 0.5, 1).normalize();
|
||||
|
||||
// 力度
|
||||
const power = Math.min(dragVec.y * 0.05 + 10, this.maxPower);
|
||||
|
||||
// 左右弧线
|
||||
const sideForce = dragVec.x * 0.02;
|
||||
|
||||
// 发射冲量
|
||||
const impulse = forward.multiplyScalar(power);
|
||||
impulse.x += sideForce;
|
||||
|
||||
this.rigidBody.applyImpulse(impulse);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user