diff --git a/lab4/src/lab4.js b/lab4/src/lab4.js index 87321c9a4b65a20f000804535a8135dab68af7aa..33bed85058a530cbb3e0a1ae3956ba9b7baaa78f 100644 --- a/lab4/src/lab4.js +++ b/lab4/src/lab4.js @@ -521,8 +521,6 @@ const KEYS = { }; window.addEventListener("keydown", function (event) { - - if (!KEYS[event.code] || currentCameraNum === 0) return; let { direction, pos } = KEYS[event.code]; //currentLookAt[pos] += CAMERA_SPEED * direction; diff --git a/lab5/src/GameManager.js b/lab5/src/GameManager.js new file mode 100644 index 0000000000000000000000000000000000000000..66d47f46d1d850065fe363949902f40816070063 --- /dev/null +++ b/lab5/src/GameManager.js @@ -0,0 +1,123 @@ + +const DIRECTION = { + UP: 'UP', + DOWN: 'DOWN', + RIGHT: 'RIGHT', + LEFT: 'LEFT', + NONE: 'NONE' +}; + +const MOVEMENT = { + LEFT: { x: -0.08, y: 0 }, + RIGHT: { x: 0.08, y: 0 }, + UP: { x: 0, y : 0.08 }, + DOWN: { x: 0, y: -0.08 }, + NONE: { x: 0, y: 0 } +}; + +const KEYS = { + ArrowLeft: DIRECTION.LEFT, + ArrowRight: DIRECTION.RIGHT, + ArrowUp: DIRECTION.UP, + ArrowDown: DIRECTION.DOWN +}; + +var scene; +var camera; +var renderer; +var player; +var enemies = []; +var walls = []; +var mapGenerator + +function main() { + mapGenerator = new MapGenerator(); + + mapGenerator.generateMap("maps/map1.png"); + + // init scene + scene = new THREE.Scene(); + scene.background = new THREE.Color( 0x3f3f3f ); + camera = new THREE.PerspectiveCamera(85, window.innerWidth / window.innerHeight, 0.1, 1000); + renderer = new THREE.WebGLRenderer(); + renderer.setSize(window.innerWidth, window.innerHeight); + document.body.appendChild(renderer.domElement); + + //create objects + + var geometry = new THREE.BoxGeometry(1,1,1); + var material = new THREE.MeshBasicMaterial({color: 0x00ff00}); + var cube = new THREE.Mesh(geometry, material); + var cube2 = new THREE.Mesh(geometry, material); + walls.push(cube); + walls.push(cube2); + scene.add(camera); + scene.add(cube); + scene.add(cube2); + scene.add(mapGenerator.generateMap("maps/map1.png")); + camera.position.z = 13; + camera.position.x = 0; + camera.position.y = 0; + + cube.position.x = 0; + cube.position.x = 2; + + + // player + geometry = new THREE.SphereGeometry(0.45); + material = new THREE.MeshBasicMaterial( {color: 0xffff00} ); + var sphere = new THREE.Mesh( geometry, material ); + sphere.name = 'player'; + scene.add(sphere); + player = new Player(0,2,sphere); + + console.log(sphere.position); + + function render(){ + checkCollision(); + player.move(); + + requestAnimationFrame(render); + renderer.render(scene, camera); + + } + render(); + +} + +function checkCollision() { + /*walls.forEach(function (wall) { + wall.material.transparent = false; + wall.material.opacity = 1.0; + });*/ + 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); + var ray = new THREE.Raycaster(originPointFastForward, directionVector.clone().normalize()); + var collisionResults = ray.intersectObjects(walls); + if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) { + console.log(collisionResults); + player.setDirection(DIRECTION.NONE); + + /*collisionResults[0].object.material.transparent = true; + collisionResults[0].object.material.opacity = 0.4;*/ + } + } +} + +window.addEventListener("keydown", function (event) { + + //change player direction + if (KEYS[event.code]) + player.setDirection(KEYS[event.code]); + + +}); + diff --git a/lab5/src/MapGenerator.js b/lab5/src/MapGenerator.js new file mode 100644 index 0000000000000000000000000000000000000000..96b5bf5491a0a5d56a4a838ac7af9296d23b643b --- /dev/null +++ b/lab5/src/MapGenerator.js @@ -0,0 +1,35 @@ +class MapGenerator { + constructor() { + this.size = 21; + } + generateMap(filePath) { + var map; + /*var img = new Image(21,21); + img.src = filePath; + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + context.drawImage(img, 0, 0, img.width, img.height); + + console.log(img); + console.log(img.width); + console.log(img.height); + console.log(canvas); + document.body.appendChild(img); + document.body.appendChild(canvas); + + for(var x = 0; x < img.width; x++){ + for(var y = 0; y < img.height; y++){ + console.log(context.getImageData(x, y, 1, 1).data); + } + }*/ + + // create ground + var geometry = new THREE.PlaneGeometry( this.size, this.size ); + var material = new THREE.MeshBasicMaterial( {color: 0x000000, side: THREE.DoubleSide} ); + var plane = new THREE.Mesh( geometry, material ); + plane.position.z -= 0.5; + + return plane; + } +} + diff --git a/lab5/src/Player.js b/lab5/src/Player.js new file mode 100644 index 0000000000000000000000000000000000000000..ce89b3c6f7f76c04f7821386222101b422250f41 --- /dev/null +++ b/lab5/src/Player.js @@ -0,0 +1,27 @@ +class Player { + constructor(posX, posY, obj) { + this.object = obj; + this.object.position.x = posX; + this.object.position.y = posY; + this.direction = DIRECTION.NONE; + } + + move(){ + let { x, y } = MOVEMENT[this.direction]; + this.object.position.x += x; + this.object.position.y += y; + + // TODO + //autoriser les movement uniquement lorsque la position x ou y est sur .5 + // x % 1 == 0.5 -> change direction + } + + setDirection(dir){ + this.direction = dir; + } + + getDirection(){ + return this.direction; + } + +} \ No newline at end of file diff --git a/lab5/src/lab5.html b/lab5/src/lab5.html index cf6a6db8fae8fc628f8b1abf98917f3bd0de19f3..1d9f911eef0f4d5db6e1746a6b1cc59db5908667 100644 --- a/lab5/src/lab5.html +++ b/lab5/src/lab5.html @@ -13,6 +13,8 @@ <div id="main"> </div> <script src="lib/three.js"></script> - <script src="lab5.js"></script> + <script src="GameManager.js"></script> + <script src="MapGenerator.js"></script> + <script src="Player.js"></script> </body> </html> \ No newline at end of file diff --git a/lab5/src/lab5.js b/lab5/src/lab5.js deleted file mode 100644 index 4449da65b4aed4ce9310a8126a73f86f50d94b0c..0000000000000000000000000000000000000000 --- a/lab5/src/lab5.js +++ /dev/null @@ -1,30 +0,0 @@ -function main() { - var scene = new THREE.Scene(); - var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); - var renderer = new THREE.WebGLRenderer(); - renderer.setSize(window.innerWidth, window.innerHeight); - document.body.appendChild(renderer.domElement) - - var geometry = new THREE.BoxGeometry(1,1,1); - var material = new THREE.MeshBasicMaterial({color: 0x00ff00}); - var cube = new THREE.Mesh(geometry, material); - scene.add(camera); - scene.add(cube); - camera.position.z = 3; - camera.position.x = 0; - camera.position.y = 0; - - /*var light = new THREE.AmbientLight( 0xff0000 ); // soft white light - scene.add( light ); - var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 ); - scene.add( directionalLight );*/ - - function render(){ - requestAnimationFrame(render); - renderer.render(scene, camera); - cube.rotation.x += 0.01; - cube.rotation.y += 0.01; - cube.rotation.z += 0.01; - } - render(); -}