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);
}
}