Spaces:
Running
Running
File size: 4,728 Bytes
8cc1449 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
// Define variables
var scene, camera, renderer, controls, clock;
var geometry, material, mesh;
var raycaster, mouse;
var enemies = [];
var towers = [];
var projectiles = [];
// Initialize game
init();
animate();
function init() {
// Create scene
scene = new THREE.Scene();
// Create camera
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 10, 20);
// Create renderer
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Add controls
controls = new THREE.OrbitControls(camera, renderer.domElement);
// Add clock
clock = new THREE.Clock();
// Create ground
geometry = new THREE.PlaneGeometry(100, 100);
material = new THREE.MeshBasicMaterial({color: 0x00ff00, side: THREE.DoubleSide});
mesh = new THREE.Mesh(geometry, material);
mesh.rotateX(-Math.PI / 2);
scene.add(mesh);
// Add towers
addTower(5, 0, 5);
addTower(-5, 0, -5);
// Add enemies
addEnemy(0, 0, -10);
addEnemy(0, 0, -20);
// Add raycaster and mouse
raycaster = new THREE.Raycaster();
mouse = new THREE.Vector2();
// Add event listeners
window.addEventListener('resize', onWindowResize, false);
window.addEventListener('click', onClick, false);
}
function animate() {
requestAnimationFrame(animate);
// Move enemies
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
enemy.position.z += 0.1;
// Check if enemy is at end of path
if (enemy.position.z > 10) {
scene.remove(enemy);
enemies.splice(i, 1);
}
}
// Check for tower range and shoot
for (var i = 0; i < towers.length; i++) {
var tower = towers[i];
var towerPosition = tower.position.clone();
towerPosition.y = 0.5;
// Find nearest enemy
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
var distance = enemy.position.distanceTo(towerPosition);
if (distance < nearestDistance) {
nearestEnemy = enemy;
nearestDistance = distance;
}
}
// Shoot projectile
if (nearestEnemy && nearestDistance <= 5) {
var projectile = new THREE.Mesh(new THREE.SphereGeometry(0.1, 8, 8), new THREE.MeshBasicMaterial({color: 0xff0000}));
projectile.position.set(tower.position.x, tower.position.y + 0.5, tower.position.z);
projectiles.push(projectile);
scene.add(projectile);
// Remove enemy if hit
var index = enemies.indexOf(nearestEnemy);
if (index !== -1) {
scene.remove(nearestEnemy);
enemies.splice(index, 1);
}
}
}
// Move projectiles
for (var i = 0; i < projectiles.length; i++) {
var projectile = projectiles[i];
projectile.position.z -= 0.5;
// Remove projectile if it hits enemy or end of path
for (var j = 0; j < enemies.length; j++) {
var enemy = enemies[j];
if (projectile.position.distanceTo(enemy.position) <= 0.5) {
scene.remove(enemy);
enemies.splice(j, 1);
scene.remove(projectile);
projectiles.splice(i, 1);
break;
}
}
if (projectile.position.z < -10) {
scene.remove(projectile);
projectiles.splice(i, 1);
}
}
// Render scene
renderer.render(scene, camera);
// Update controls
controls.update();
// Update clock
var delta = clock.getDelta();
}
function addTower(x, y, z) {
var tower = new THREE.Mesh(new THREE.BoxGeometry(1, 2, 1), new THREE.MeshBasicMaterial({color: 0xff0000}));
tower.position.set(x, y + 1, z);
towers.push(tower);
scene.add(tower);
}
function addEnemy(x, y, z) {
var enemy = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshBasicMaterial({color: 0x0000ff}));
enemy.position.set(x, y + 0.5, z);
enemies.push(enemy);
scene.add(enemy);
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function onClick(event) {
// Calculate mouse position
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
// Cast ray from camera
raycaster.setFromCamera(mouse, camera);
// Check for tower placement
var intersects = raycaster.intersectObjects([mesh]);
if (intersects.length > 0) {
var point = intersects[0].point;
addTower(point.x, point.y, point.z);
}
} |