mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 02:37:05 +02:00
feat: track turning
This commit is contained in:
1 parent
9306773b5b
commit
b3ecb1e9b9
2 files changed
+43
-10
No files matched your search
@@ -1,6 +1,6 @@
|
||||
import { ThreeEvent, useThree } from '@react-three/fiber';
|
||||
import { ReactNode, forwardRef, useImperativeHandle, useRef } from 'react';
|
||||
import { Group, Mesh, Object3D } from 'three';
|
||||
import { Group, Mesh, MeshStandardMaterial, Object3D, Vector2 } from 'three';
|
||||
import { resolveJsxTree } from '../../../../../core/blitzkrieg/resolveJsxTree';
|
||||
import { normalizeAnglePI } from '../../../../../core/math/normalizeAngle180';
|
||||
|
||||
@@ -10,10 +10,15 @@ interface HullContainerProps {
|
||||
objects: Object3D[];
|
||||
onYawStart: () => void;
|
||||
onYawEnd: (yaw: number) => void;
|
||||
onTrackStart: () => void;
|
||||
onTrackEnd: () => void;
|
||||
}
|
||||
|
||||
export const HullContainer = forwardRef<Group, HullContainerProps>(
|
||||
({ children, yaw, objects, onYawStart, onYawEnd }, ref) => {
|
||||
(
|
||||
{ children, yaw, objects, onYawStart, onYawEnd, onTrackEnd, onTrackStart },
|
||||
ref,
|
||||
) => {
|
||||
const canvas = useThree((state) => state.gl.domElement);
|
||||
const hullContainer = useRef<Group>(null);
|
||||
|
||||
@@ -31,13 +36,19 @@ export const HullContainer = forwardRef<Group, HullContainerProps>(
|
||||
function handlePointerDown(event: ThreeEvent<PointerEvent>) {
|
||||
event.stopPropagation();
|
||||
|
||||
draftHullYaw = yaw;
|
||||
if (isHull) {
|
||||
draftHullYaw = yaw;
|
||||
|
||||
onYawStart();
|
||||
window.addEventListener('pointermove', handlePointerMove);
|
||||
window.addEventListener('pointerup', handlePointerUp);
|
||||
onYawStart();
|
||||
window.addEventListener('pointermove', handlePointerMoveHull);
|
||||
window.addEventListener('pointerup', handlePointerUpHull);
|
||||
} else if (isTrack) {
|
||||
onTrackStart();
|
||||
window.addEventListener('pointermove', handlePointerMoveTrack);
|
||||
window.addEventListener('pointerup', handlePointerUpTrack);
|
||||
}
|
||||
}
|
||||
function handlePointerMove(event: PointerEvent) {
|
||||
function handlePointerMoveHull(event: PointerEvent) {
|
||||
event.preventDefault();
|
||||
|
||||
draftHullYaw += event.movementX * ((2 * Math.PI) / canvas.width);
|
||||
@@ -46,10 +57,30 @@ export const HullContainer = forwardRef<Group, HullContainerProps>(
|
||||
hullContainer.current.rotation.z = draftHullYaw;
|
||||
}
|
||||
}
|
||||
function handlePointerUp() {
|
||||
function handlePointerUpHull() {
|
||||
onYawEnd(normalizeAnglePI(draftHullYaw));
|
||||
window.removeEventListener('pointermove', handlePointerMove);
|
||||
window.removeEventListener('pointerup', handlePointerUp);
|
||||
window.removeEventListener('pointermove', handlePointerMoveHull);
|
||||
window.removeEventListener('pointerup', handlePointerUpHull);
|
||||
}
|
||||
function handlePointerMoveTrack(event: PointerEvent) {
|
||||
event.preventDefault();
|
||||
|
||||
const mesh = object as Mesh;
|
||||
const material = mesh.material as MeshStandardMaterial;
|
||||
const offset = new Vector2(
|
||||
0,
|
||||
-event.movementY * (6 / canvas.height) +
|
||||
event.movementX * (6 / canvas.width),
|
||||
);
|
||||
|
||||
material.map?.offset.add(offset);
|
||||
material.roughnessMap?.offset.add(offset);
|
||||
material.normalMap?.offset.add(offset);
|
||||
}
|
||||
function handlePointerUpTrack() {
|
||||
onTrackEnd();
|
||||
window.removeEventListener('pointermove', handlePointerMoveTrack);
|
||||
window.removeEventListener('pointerup', handlePointerUpTrack);
|
||||
}
|
||||
|
||||
if (!isVisible) return null;
|
||||
|
||||
@@ -146,6 +146,8 @@ export default function Page({ params }: { params: { id: string } }) {
|
||||
setControlsEnabled(true);
|
||||
setHullYaw(yaw);
|
||||
}}
|
||||
onTrackStart={() => setControlsEnabled(false)}
|
||||
onTrackEnd={() => setControlsEnabled(true)}
|
||||
>
|
||||
<TurretContainer
|
||||
gunOrigin={gunOrigin}
|
||||
|
||||
Reference in new issue
Block a user