handle collisions
This commit is contained in:
parent
0437902699
commit
04d6187401
2 changed files with 73 additions and 6 deletions
19
js/Env.js
19
js/Env.js
|
@ -102,21 +102,30 @@ export class Env {
|
||||||
* Animate all the entities in the environnement
|
* Animate all the entities in the environnement
|
||||||
*/
|
*/
|
||||||
animate = () => {
|
animate = () => {
|
||||||
|
// Retrieve ennemies
|
||||||
|
const ennemies = this.elements
|
||||||
|
.filter((entityData) => entityData[1] == TypeEntity.ennemy)
|
||||||
|
.map((ennemyData) => ennemyData[0]);
|
||||||
|
|
||||||
// Player animation
|
// Player animation
|
||||||
this.elements
|
this.elements
|
||||||
.filter((entityData) => entityData[1] == TypeEntity.player)
|
.filter((entityData) => entityData[1] == TypeEntity.player)
|
||||||
.map((playerData) => playerData[0])
|
.map((playerData) => playerData[0])
|
||||||
.forEach((player) => {
|
.forEach((player) => {
|
||||||
if (player.animation) {
|
if (player.animation) {
|
||||||
player.animation();
|
if (
|
||||||
|
!player.animation(ennemies.map((object) => object.data))
|
||||||
|
) {
|
||||||
|
// If animation returned false, the player died!
|
||||||
|
console.log("player died!");
|
||||||
|
// TODO: Stop the game
|
||||||
|
// Destroy the player?
|
||||||
|
// End game
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Enemy animation
|
// Enemy animation
|
||||||
const ennemies = this.elements
|
|
||||||
.filter((entityData) => entityData[1] == TypeEntity.ennemy)
|
|
||||||
.map((ennemyData) => ennemyData[0]);
|
|
||||||
|
|
||||||
ennemies.forEach((ennemy) => {
|
ennemies.forEach((ennemy) => {
|
||||||
ennemy.data.position.x -= 0.05;
|
ennemy.data.position.x -= 0.05;
|
||||||
if (ennemy.data.position.x <= -10) {
|
if (ennemy.data.position.x <= -10) {
|
||||||
|
|
60
js/Player.js
60
js/Player.js
|
@ -11,7 +11,12 @@ export class Player extends Cube {
|
||||||
this.movementData = new Rotation(this.data.position);
|
this.movementData = new Rotation(this.data.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
animation = () => {
|
/**
|
||||||
|
* Play the player animation
|
||||||
|
* @param {*} listEnnemies
|
||||||
|
* @returns boolean if the player is alive or not
|
||||||
|
*/
|
||||||
|
animation = (listEnnemies) => {
|
||||||
// If we jump
|
// If we jump
|
||||||
if (this.movementData.state) {
|
if (this.movementData.state) {
|
||||||
// Rotation
|
// Rotation
|
||||||
|
@ -43,8 +48,14 @@ export class Player extends Cube {
|
||||||
this.movementData.changeState();
|
this.movementData.changeState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return !this.checkCollision(listEnnemies);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle player's input
|
||||||
|
* @param {string} key key pressed
|
||||||
|
*/
|
||||||
controlUser = (key) => {
|
controlUser = (key) => {
|
||||||
const now = Date.now();
|
const now = Date.now();
|
||||||
if (
|
if (
|
||||||
|
@ -59,4 +70,51 @@ export class Player extends Cube {
|
||||||
this.movementData.changeState(now);
|
this.movementData.changeState(now);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check collisions with ennemies
|
||||||
|
* @param {*} listEnnemies
|
||||||
|
* @returns boolean
|
||||||
|
*/
|
||||||
|
checkCollision = (listEnnemies) => {
|
||||||
|
for (
|
||||||
|
let vertexIndex = 0;
|
||||||
|
vertexIndex < this.data.geometry.attributes.position.array.length;
|
||||||
|
vertexIndex++
|
||||||
|
) {
|
||||||
|
// Retrieve the vertex from the player geometry
|
||||||
|
const localVertex = new THREE.Vector3()
|
||||||
|
.fromBufferAttribute(
|
||||||
|
this.data.geometry.attributes.position,
|
||||||
|
vertexIndex
|
||||||
|
)
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
// Apply the player matrix for the vector
|
||||||
|
const globalVertex = localVertex.applyMatrix4(this.data.matrix);
|
||||||
|
|
||||||
|
// Substract the position from it
|
||||||
|
const directionVector = globalVertex.sub(this.data.position);
|
||||||
|
|
||||||
|
// Create the raycaster for this vector from the player position
|
||||||
|
const ray = new THREE.Raycaster(
|
||||||
|
this.data.position,
|
||||||
|
directionVector.clone().normalize()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check if the raycaster hit ennemies
|
||||||
|
const collisionResults = ray.intersectObjects(listEnnemies, false);
|
||||||
|
if (
|
||||||
|
collisionResults.length > 0 &&
|
||||||
|
directionVector.length() < 1.5 &&
|
||||||
|
collisionResults[0].distance < directionVector.length()
|
||||||
|
) {
|
||||||
|
// Yes some ennemies are in the way
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No ennemies found
|
||||||
|
return false;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue