awacke1 commited on
Commit
414d077
·
verified ·
1 Parent(s): 456f16d

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +192 -0
app.py ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from streamlit.components.v1 import html
3
+
4
+ # Define the HTML content with the Three.js game
5
+ game_html = """
6
+ <!DOCTYPE html>
7
+ <html lang="en">
8
+ <head>
9
+ <meta charset="UTF-8">
10
+ <title>Galaxxon - Three.js Arcade Game</title>
11
+ <style>
12
+ body { margin: 0; overflow: hidden; background: #000; }
13
+ canvas { display: block; width: 100%; height: 100%; }
14
+ </style>
15
+ </head>
16
+ <body>
17
+ <script type="module">
18
+ import * as THREE from 'https://cdn.jsdelivr.net/npm/[email protected]/build/three.module.js';
19
+
20
+ let scene, camera, renderer, player, enemies = [], bullets = [], obstacles = [];
21
+ let clock = new THREE.Clock();
22
+ let moveLeft = false, moveRight = false, moveUp = false, moveDown = false, shoot = false;
23
+
24
+ function init() {
25
+ scene = new THREE.Scene();
26
+ camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
27
+ renderer = new THREE.WebGLRenderer();
28
+ renderer.setSize(window.innerWidth, window.innerHeight);
29
+ document.body.appendChild(renderer.domElement);
30
+
31
+ camera.position.set(0, 20, 30);
32
+ camera.lookAt(0, 0, 0);
33
+
34
+ const playerGeometry = new THREE.BoxGeometry(1, 1, 1);
35
+ const playerMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
36
+ player = new THREE.Mesh(playerGeometry, playerMaterial);
37
+ player.position.y = -10;
38
+ scene.add(player);
39
+
40
+ spawnEnemies();
41
+ spawnObstacles();
42
+
43
+ const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
44
+ scene.add(ambientLight);
45
+
46
+ window.addEventListener('keydown', onKeyDown);
47
+ window.addEventListener('keyup', onKeyUp);
48
+ window.addEventListener('resize', onWindowResize);
49
+
50
+ animate();
51
+ }
52
+
53
+ function spawnEnemies() {
54
+ const enemyGeometry = new THREE.BoxGeometry(0.8, 0.8, 0.8);
55
+ const enemyMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
56
+ for (let i = 0; i < 5; i++) {
57
+ for (let j = 0; j < 3; j++) {
58
+ const enemy = new THREE.Mesh(enemyGeometry, enemyMaterial);
59
+ enemy.position.set(i * 2 - 4, j * 2 + 5, 0);
60
+ enemies.push(enemy);
61
+ scene.add(enemy);
62
+ }
63
+ }
64
+ }
65
+
66
+ function spawnObstacles() {
67
+ const obstacleGeometry = new THREE.BoxGeometry(2, 2, 2);
68
+ const obstacleMaterial = new THREE.MeshBasicMaterial({ color: 0x808080 });
69
+ for (let i = 0; i < 3; i++) {
70
+ const obstacle = new THREE.Mesh(obstacleGeometry, obstacleMaterial);
71
+ obstacle.position.set(Math.random() * 20 - 10, Math.random() * 10, 0);
72
+ obstacles.push(obstacle);
73
+ scene.add(obstacle);
74
+ }
75
+ }
76
+
77
+ function onKeyDown(event) {
78
+ switch (event.code) {
79
+ case 'ArrowLeft': case 'KeyA': moveLeft = true; break;
80
+ case 'ArrowRight': case 'KeyD': moveRight = true; break;
81
+ case 'ArrowUp': case 'KeyW': moveUp = true; break;
82
+ case 'ArrowDown': case 'KeyS': moveDown = true; break;
83
+ case 'Space': shoot = true; break;
84
+ }
85
+ }
86
+
87
+ function onKeyUp(event) {
88
+ switch (event.code) {
89
+ case 'ArrowLeft': case 'KeyA': moveLeft = false; break;
90
+ case 'ArrowRight': case 'KeyD': moveRight = false; break;
91
+ case 'ArrowUp': case 'KeyW': moveUp = false; break;
92
+ case 'ArrowDown': case 'KeyS': moveDown = false; break;
93
+ case 'Space': shoot = false; break;
94
+ }
95
+ }
96
+
97
+ function updatePlayer(delta) {
98
+ const speed = 10;
99
+ if (moveLeft && player.position.x > -15) player.position.x -= speed * delta;
100
+ if (moveRight && player.position.x < 15) player.position.x += speed * delta;
101
+ if (moveUp && player.position.y < 0) player.position.y += speed * delta;
102
+ if (moveDown && player.position.y > -15) player.position.y -= speed * delta;
103
+
104
+ if (shoot && clock.getElapsedTime() > 0.2) {
105
+ shootBullet();
106
+ clock = new THREE.Clock();
107
+ }
108
+ }
109
+
110
+ function shootBullet() {
111
+ const bulletGeometry = new THREE.SphereGeometry(0.2, 8, 8);
112
+ const bulletMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
113
+ const bullet = new THREE.Mesh(bulletGeometry, bulletMaterial);
114
+ bullet.position.copy(player.position);
115
+ bullet.position.y += 1;
116
+ bullets.push(bullet);
117
+ scene.add(bullet);
118
+ }
119
+
120
+ function updateBullets(delta) {
121
+ const bulletSpeed = 20;
122
+ for (let i = bullets.length - 1; i >= 0; i--) {
123
+ bullets[i].position.y += bulletSpeed * delta;
124
+ if (bullets[i].position.y > 20) {
125
+ scene.remove(bullets[i]);
126
+ bullets.splice(i, 1);
127
+ } else {
128
+ checkCollisions(bullets[i], i);
129
+ }
130
+ }
131
+ }
132
+
133
+ function checkCollisions(bullet, bulletIndex) {
134
+ for (let i = enemies.length - 1; i >= 0; i--) {
135
+ if (bullet.position.distanceTo(enemies[i].position) < 1) {
136
+ scene.remove(enemies[i]);
137
+ enemies.splice(i, 1);
138
+ scene.remove(bullet);
139
+ bullets.splice(bulletIndex, 1);
140
+ break;
141
+ }
142
+ }
143
+ }
144
+
145
+ function updateEnemies(delta) {
146
+ const enemySpeed = 2;
147
+ enemies.forEach(enemy => {
148
+ enemy.position.y -= enemySpeed * delta;
149
+ if (enemy.position.y < -15) enemy.position.y = 15;
150
+ });
151
+ }
152
+
153
+ function updateObstacles(delta) {
154
+ const obstacleSpeed = 1;
155
+ obstacles.forEach(obstacle => {
156
+ obstacle.position.y -= obstacleSpeed * delta;
157
+ if (obstacle.position.y < -15) obstacle.position.y = 15;
158
+ });
159
+ }
160
+
161
+ function onWindowResize() {
162
+ camera.aspect = window.innerWidth / window.innerHeight;
163
+ camera.updateProjectionMatrix();
164
+ renderer.setSize(window.innerWidth, window.innerHeight);
165
+ }
166
+
167
+ function animate() {
168
+ requestAnimationFrame(animate);
169
+ const delta = clock.getDelta();
170
+
171
+ updatePlayer(delta);
172
+ updateBullets(delta);
173
+ updateEnemies(delta);
174
+ updateObstacles(delta);
175
+
176
+ renderer.render(scene, camera);
177
+ }
178
+
179
+ init();
180
+ </script>
181
+ </body>
182
+ </html>
183
+ """
184
+
185
+ # Streamlit app
186
+ st.title("Galaxxon - A Three.js Arcade Game")
187
+ st.write("Use WASD or Arrow Keys to move, Spacebar to shoot. Destroy red enemies and avoid gray obstacles!")
188
+
189
+ # Render the HTML game
190
+ html(game_html, height=600, scrolling=False)
191
+
192
+ st.write("Note: The game runs in your browser. Ensure you have an internet connection for Three.js to load.")