Refactored the WHOLE project

From a simple test file, we're now on road to create a real project
Took 3 hours, but code looks nice
This commit is contained in:
2023-11-15 17:23:11 +01:00
parent c73aa99ca2
commit d15d257ddb
8 changed files with 191 additions and 133 deletions

View File

@@ -1,128 +1,46 @@
import * as THREE from 'three';
import * as MathUtils from 'three/src/math/MathUtils.js';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import {createGround} from './objects/ground.js';
import {alignGround} from './utils/placement.js';
import * as Freecam from './cameras/freecam.js';
import { getCamera } from './cameras/PerspectiveCamera.js';
import {addAssetsOnScene} from './utils/addAssetsOnScene.js';
import * as PlayerMovement from './utils/playerMovement.js';
import * as Animations from './utils/animateMesh.js';
let Clock = new THREE.Clock();
console.log("OK")
/* --------------------- */
/* | SCENE CREATION | */
/* --------------------- */
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x0EB1D2);
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
const camera = getCamera();
const renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
//Freecam
Freecam.enableFreeCam(camera, renderer);
const ground = createGround();
scene.add(ground);
const loader = new GLTFLoader();
let mixer, clip, action, playerModel;
loader.load( './src/objects/models/player.gltf', function ( gltf ) {
playerModel = gltf;
gltf.scene.scale.set(0.2,0.2,0.2);
gltf.scene.rotateOnWorldAxis(new THREE.Vector3(1,0,0), MathUtils.degToRad(90));
alignGround(ground, gltf.scene);
scene.add( gltf.scene );
mixer = new THREE.AnimationMixer( gltf.scene );
clip = THREE.AnimationClip.findByName( gltf.animations, 'Walk' );
action = mixer.clipAction( clip );
}, undefined, function ( error ) {
console.error( error );
} );
scene.add(new THREE.AmbientLight(0x404040, 50));
camera.position.x = 0;// <----->
camera.position.y = -4;// ^^ / vv
camera.position.z = 4;// ^-----v
camera.rotateOnWorldAxis(new THREE.Vector3(1, 0, 0), MathUtils.degToRad(60));
/* ----- -*
MOVEMENT
-----------*/
const PLAYER_SPEED = 0.015;
const playerDirection = new THREE.Vector3(0, 0, 0);
const playerRotation = new THREE.Quaternion();
//Here, we create/load every asset used, and add it in the scene
let assets = await addAssetsOnScene(scene);
/* --------------------- */
/* | MOVEMENT | */
/* --------------------- */
// Events to listen keyboard inputs
document.addEventListener('keydown', handleKeyDown);
document.addEventListener('keyup', handleKeyUp);
document.addEventListener('keydown', PlayerMovement.handleKeyDown);
document.addEventListener('keyup', PlayerMovement.handleKeyUp);
//Managing keys
function handleKeyDown(event) {
action.play();
switch (event.code) {
case 'ArrowUp':
case 'KeyW':
playerDirection.y = 1; // Up
break;
case 'ArrowDown':
case 'KeyS':
playerDirection.y = -1; // Back
break;
case 'ArrowLeft':
case 'KeyA':
playerDirection.x = -1; // Left
break;
case 'ArrowRight':
case 'KeyD':
playerDirection.x = 1; // Right
break;
}
}
/* --------------------- */
/* | ANIMATIONS | */
/* --------------------- */
//We can add an animationMixer on objects, and define ready to play actions on objects
//https://threejs.org/docs/#api/en/animation/AnimationAction
Animations.addAnimationMixerOnMesh(assets.player, ["Walk"]);
function handleKeyUp(event) {
action.stop();
switch (event.code) {
case 'ArrowUp':
case 'KeyW':
case 'ArrowDown':
case 'KeyS':
playerDirection.y = 0; // Arrêter le mouvement vertical
break;
case 'ArrowLeft':
case 'KeyA':
case 'ArrowRight':
case 'KeyD':
playerDirection.x = 0; // Arrêter le mouvement horizontal
break;
}
}
function updatePlayerPosition() {
const delta = playerDirection.clone().multiplyScalar(PLAYER_SPEED);
playerModel.scene.position.add(delta);
camera.position.add(delta);
const ROTATION_SPEED = 0.05; // Vitesse de rotation
if (playerDirection.lengthSq() > 0) {
const angle = Math.atan2(playerDirection.x, -playerDirection.y);
const targetRotation = new THREE.Quaternion();
targetRotation.setFromAxisAngle(new THREE.Vector3(0, 1, 0), angle);
playerRotation.slerp(targetRotation, ROTATION_SPEED);
playerModel.scene.setRotationFromQuaternion(playerRotation);
playerModel.scene.rotateOnWorldAxis(new THREE.Vector3(1, 0, 0), MathUtils.degToRad(90));
}
}
function animate() {
requestAnimationFrame( animate );
if(mixer) mixer.update( Clock.getDelta()*1.4 ); //If mixer ready
updatePlayerPosition();
//Freecam.updateFreeCamKeys()//Freecam
renderer.render( scene, camera );
PlayerMovement.updatePlayerPositionAnimation(assets.player, camera);//Updating player position and rotation
Animations.updateAnimations(Clock.getDelta());//Playing animations
renderer.render( scene, camera );//Calculating and redering new frame
}
animate();