diff --git a/lab5/src/static/js/Enemy.js b/lab5/src/static/js/Enemy.js index d843a0feca5a22dd489d166860bb08b662e55362..62817f5733dd2ca2ad8984e9da7a3186859b4960 100644 --- a/lab5/src/static/js/Enemy.js +++ b/lab5/src/static/js/Enemy.js @@ -2,12 +2,11 @@ class Enemy { constructor(obj) { this.object = obj; this.direction = DIRECTION.NONE; - this.newDirection = DIRECTION.NONE; - } move(path){ let { x, y } = MOVEMENT[this.direction]; + //move this.object.position.x += x; this.object.position.y += y; @@ -29,24 +28,23 @@ class Enemy { & (Math.abs(posY) % 1 < 0.05 | Math.abs(posY) % 1 > 0.95)) { // postion to coordinates - let x = Math.round(posX + SIZE/2 - 0.5); - let y = (Math.round(posY - SIZE/2 - 0.5) * -1) -1; + let [x,y] = this.getCoordinates(); var directions = this.getPossibleDirections(x,y,path); - // 10% chance to change direction if 2 direction available + // 10% chance to change direction if 2 directions available if (directions.length == 2 & Math.floor(Math.random()*10) == 0){ - this.direction = directions[ Math.floor(Math.random()*directions.length) ]; + this.changeDirection(directions, false); } // 25% chance to change direction if 3 directions available if (directions.length == 3 & Math.floor(Math.random()*3) == 0){ - this.direction = directions[ Math.floor(Math.random()*directions.length) ]; + this.changeDirection(directions, false); } - // 50% chance to change direction if 3 directions available + // 50% chance to change direction if 4 directions available if (directions.length == 4 & Math.floor(Math.random()) == 0){ - this.direction = directions[ Math.floor(Math.random()*directions.length) ]; + this.changeDirection(directions,false); } @@ -69,11 +67,9 @@ class Enemy { nextBox = 0; break; } - if (nextBox == 0){ - //change direction - this.direction = DIRECTION.NONE; - - this.direction = directions[ Math.floor(Math.random()*directions.length) ]; + if (nextBox == 0){ + // a collision occured with a wall-> change direction (it can be opposite direction) + this.changeDirection(directions, true); } } } @@ -94,11 +90,29 @@ class Enemy { possibleDirections.push(DIRECTION.RIGHT); } - // choose random direction - //this.direction = possibleDirection[ Math.floor(Math.random()*possibleDirection.length) ]; return possibleDirections; } + getCoordinates(){ + var posX = this.object.position.x; + var posY = this.object.position.y; + let x = Math.round(posX + SIZE/2 - 0.5); + let y = (Math.round(posY - SIZE/2 - 0.5) * -1) -1; + return [x,y]; + } + + changeDirection(directions, allowOpposite){ + var newDirection ; + if (allowOpposite == false){ // the new direction must not be the opposite direction of the actual direction + do{ + newDirection = directions[ Math.floor(Math.random()*directions.length) ]; + }while( newDirection == OPPOSITE_DIRECTION[this.direction]); + }else{ + newDirection = directions[ Math.floor(Math.random()*directions.length) ]; + } + this.direction = newDirection; + } + getDirection(){ return this.direction; } diff --git a/lab5/src/static/js/GameManager.js b/lab5/src/static/js/GameManager.js index dc1d3d24046cd26faa98652e30295d8ba106b12f..a1ca8e999ab46ed8fc05aee3f0f96174a0e8fe97 100644 --- a/lab5/src/static/js/GameManager.js +++ b/lab5/src/static/js/GameManager.js @@ -7,6 +7,14 @@ const DIRECTION = { NONE: 'NONE' }; +const OPPOSITE_DIRECTION = { + UP: DIRECTION.DOWN, + DOWN: DIRECTION.UP, + RIGHT: DIRECTION.LEFT, + LEFT: DIRECTION.RIGHT, + NONE: DIRECTION.NONE +}; + const SPEED = 0.05; const MOVEMENT = { LEFT: { x: -SPEED, y: 0 }, @@ -42,8 +50,6 @@ const SIZE = 21 function main() { mapGenerator = new MapGenerator(); - //mapGenerator.generateMap("maps/map1.png"); - // init scene scene = new THREE.Scene(); scene.background = new THREE.Color( 0x3f3f3f ); @@ -55,8 +61,6 @@ function main() { camera = new THREE.PerspectiveCamera(85, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 12; camera.position.x = 0; - /*camera.position.y = -10; - camera.rotation.x = 0.5;*/ scene.add(camera); // Modal management @@ -73,12 +77,11 @@ function main() { }*/ //create objects - // laod map from image [plane, walls, foods, playerObj, path, enemies_spawns] = mapGenerator.generateMap("map1", scene); player = new Player(playerObj); - // spawn enemey + // spawn enemies for (let i = 0; i < MAX_ENEMIES; i++) { spawnEnemy(); } @@ -87,14 +90,14 @@ function main() { //getListofMaps(); function render(){ - //checkCollision(); player.move(path); enemies.forEach(enemy => { enemy.move(path); }); - //checkCollision(); + checkCollision(); + checkCollisionFood(); requestAnimationFrame(render); renderer.render(scene, camera); @@ -114,46 +117,20 @@ function spawnEnemy(){ enemies.push(new Enemy(enemy)); } - -// check player collision with food/specail food and enemies function checkCollision() { + let[playerX, playerY] = player.getCoordinates(); + enemies.forEach(enemy => { + let[enemyX, enemyY] = enemy.getCoordinates(); - var playerObj = scene.getObjectByName("Player"); - var originPoint = playerObj.position.clone(); - var originPointFastForward = originPoint; - let {x,y} = MOVEMENT[player.getDirection()]; - originPointFastForward.x += x; - originPointFastForward.y += y; - for (var vertexIndex = 0; vertexIndex < playerObj.geometry.vertices.length; vertexIndex++) { - var localVertex = playerObj.geometry.vertices[vertexIndex].clone(); - var globalVertex = localVertex.applyMatrix4(playerObj.matrix); - var directionVector = globalVertex.sub(playerObj.position); - - // check collision with walls - /*var ray = new THREE.Raycaster(originPointFastForward, directionVector.clone().normalize()); - var collisionResults = ray.intersectObjects(walls); - if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { - player.setDirection(DIRECTION.NONE); - }*/ - - ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize()); - collisionResults = ray.intersectObjects(enemies.getObject()); - if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { - alert('Game Over'); - player.setDirection(DIRECTION.NONE); - - /*collisionResults[0].object.material.transparent = true; - collisionResults[0].object.material.opacity = 0.4;*/ + //console.log(playerX + ' ' + playerY + ' ' + enemyX + ' ' + enemyY); + if (enemyX == playerX & enemyY == playerY){ + alert("GameOver"); } - - collisionResults = ray.intersectObjects(foods); - if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { - console.log("Miam"); - score++; - } - } + }); } + + window.addEventListener("keydown", function (event) { //change player direction @@ -170,6 +147,49 @@ window.addEventListener("keydown", function (event) { }); +// check player collision with food/special food and enemies +function checkCollisionFood() { + + var playerObj = player.getObject(); + var originPoint = playerObj.position.clone(); + /*var originPointFastForward = originPoint; + let {x,y} = MOVEMENT[player.getDirection()]; + originPointFastForward.x += x; + originPointFastForward.y += y; */ + for (var vertexIndex = 0; vertexIndex < playerObj.geometry.vertices.length; vertexIndex++) { + var localVertex = playerObj.geometry.vertices[vertexIndex].clone(); + var globalVertex = localVertex.applyMatrix4(playerObj.matrix); + var directionVector = globalVertex.sub(playerObj.position); + + var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize()); + collisionResults = ray.intersectObjects(foods); + if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { + + console.log("Miam " + collisionResults[0].object.name); + score++; + } + + /*check collision with enemies + ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize()); + //collisionResults = ray.intersectObjects(enemies.map(o => o.getObject())); + //console.log(enemies.map(o => o.getObject())); + if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { + + console.log('Game Over ' + collisionResults.length + ' ' ); + //player.setDirection(DIRECTION.NONE); + }*/ + + /*// check collision with walls + var ray = new THREE.Raycaster(originPointFastForward, directionVector.clone().normalize()); + var collisionResults = ray.intersectObjects(walls); + if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { + player.setDirection(DIRECTION.NONE); + }*/ + } +} + + +// ask for all maps image filename et absolute path of the file /*function getListofMaps(){ // send synchronous request var request = new XMLHttpRequest(); diff --git a/lab5/src/static/js/MapGenerator.js b/lab5/src/static/js/MapGenerator.js index 6bcc8629bf82367f504d42fd90c572066bd4642c..b4f7ea3d2cd04f85e1700d0319c908d36e5368e4 100644 --- a/lab5/src/static/js/MapGenerator.js +++ b/lab5/src/static/js/MapGenerator.js @@ -13,7 +13,7 @@ class MapGenerator { var walls = []; var foods = []; var path = []; - var enemies_spawn = []; + var enemies_spawn_zones = []; var player; var map_content = []; @@ -89,6 +89,7 @@ class MapGenerator { var geometry = new THREE.SphereGeometry(0.1); var material = new THREE.MeshBasicMaterial( {color: 0xffffff} ); var food = new THREE.Mesh( geometry, material ); + food.name = "food" + foods.length; food.position.x = -x + (SIZE - 1)/2; food.position.y = -y + (SIZE - 1)/2; @@ -103,6 +104,7 @@ class MapGenerator { var geometry = new THREE.SphereGeometry(0.2); var material = new THREE.MeshBasicMaterial( {color: 0x00ff00} ); var food = new THREE.Mesh( geometry, material ); + food.name = "s_food" + foods.length; food.position.x = -x + (SIZE - 1)/2; food.position.y = -y + (SIZE - 1)/2; scene.add(food); @@ -117,7 +119,7 @@ class MapGenerator { case "SPAWN_E": var spawnX = (-x + (SIZE - 1)/2); var spawnY = (-y + (SIZE - 1)/2); - enemies_spawn.push({"x":spawnX, "y": spawnY}); + enemies_spawn_zones.push({"x":spawnX, "y": spawnY}); path[y].push(1); break; @@ -142,6 +144,6 @@ class MapGenerator { } } - return [plane, walls, foods, player, path, enemies_spawn]; + return [plane, walls, foods, player, path, enemies_spawn_zones]; } } \ No newline at end of file diff --git a/lab5/src/static/js/Player.js b/lab5/src/static/js/Player.js index 0cfb2c2cb04f7d26d4021c90fd78a72e31bb2672..0f2c1b891958c40e4fd90523028f1cd7787901ec 100644 --- a/lab5/src/static/js/Player.js +++ b/lab5/src/static/js/Player.js @@ -33,12 +33,11 @@ class Player { // postion to coordinates - let x = Math.round(posX + SIZE/2 - 0.5); - let y = (Math.round(posY - SIZE/2 - 0.5) * -1) -1; + let [x,y ] = this.getCoordinates(); // check if direction can be changed according to path if (this.newDirection != this.direction){ - var nextBox; + var nextBox = -1; // check if a path is available (not a wall) in the new direction switch(this.newDirection){ case DIRECTION.DOWN: @@ -51,7 +50,10 @@ class Player { nextBox = path[y][(x-1)%SIZE]; break; case DIRECTION.RIGHT: - nextBox = path[y][(x+1)%SIZE] + nextBox = path[y][(x+1)%SIZE]; + break; + case DIRECTION.NONE: + this.direction = this.newDirection; break; } @@ -81,15 +83,7 @@ class Player { //change direction this.direction = DIRECTION.NONE; } - - - } - - - //console.log (this.object.position.x + " " + this.object.position.y); - - } setDirection(dir){ @@ -98,8 +92,21 @@ class Player { //this.direction = dir; } + getObject(){ + return this.object; + } + getDirection(){ return this.direction; } + // position to coordinate in map array + getCoordinates(){ + var posX = this.object.position.x; + var posY = this.object.position.y; + let x = Math.round(posX + SIZE/2 - 0.5); + let y = (Math.round(posY - SIZE/2 - 0.5) * -1) -1; + return [x,y]; + } + } \ No newline at end of file