Up-in-the-Air – commitdiff

You can use Git to clone the repository via the web URL. Download snapshot (zip)
Re-randomize collectible placement when restarting the game
authorJulian Fietkau <git@fietkau.software>
Mon, 23 Sep 2024 10:26:36 +0000 (12:26 +0200)
committerJulian Fietkau <git@fietkau.software>
Mon, 23 Sep 2024 10:26:36 +0000 (12:26 +0200)
main.js

diff --git a/main.js b/main.js
index 5426f71ec289ad3b5316355e235f34d2400fc65b..5d7c132f47f80831df61473a51906324aabe080a 100644 (file)
--- a/main.js
+++ b/main.js
@@ -164,85 +164,6 @@ function init(game, canvas) {
   game.objects.pinwheel.cameraY = 9999;
   scene.add(game.objects.pinwheel);
 
-  game.objects.words = [];
-  game.objects.words.collectedCount = 0;
-  game.assets.fonts.geometry = {};
-  let letterMaterial = new THREE.MeshStandardMaterial({
-    color: 0xffffff,
-    emissive: 0x606060,
-    roughness: 0.4,
-    metalness: 1,
-  });
-  const interWordDistance = new THREE.Vector3();
-  let placementSuccess;
-  for(let i = 0; i < 100; i++) {
-    let angleInCourse;
-    let clusteringFunction = (val) => Math.max(0.15 + val / 2, 0.7 - 3 * Math.pow(0.75 - 2 * val, 2), 1 - 3 * Math.pow(1 - val, 2));
-    do {
-      angleInCourse = Math.random();
-    } while(clusteringFunction(angleInCourse) < Math.random());
-    angleInCourse = (0.08 + 0.87 * angleInCourse);
-    if(i == 0) {
-      angleInCourse = 0.05;
-    }
-    let randomCameraX = game.courseRadius * Math.sin(angleInCourse * 2 * Math.PI);
-    let randomCameraY = game.courseRadius * -Math.cos(angleInCourse * 2 * Math.PI);
-    let word = new THREE.Group();
-    word.text = getRandomWord();
-    for(let letter of word.text) {
-      if(!(letter in game.assets.fonts.geometry)) {
-        game.assets.fonts.geometry[letter] = new TextGeometry(letter, {
-          font: game.assets.fonts.cookie,
-          size: 0.2,
-          depth: 0.03,
-          curveSegments: 2,
-          bevelEnabled: false,
-        });
-        game.assets.fonts.geometry[letter].computeBoundingBox();
-        let bbox = game.assets.fonts.geometry[letter].boundingBox;
-        // Add these to local 0,0 later to get the letter's center rotation point
-        game.assets.fonts.geometry[letter].dx = (bbox.max.x - bbox.min.x) / 2;
-        game.assets.fonts.geometry[letter].dy = (bbox.max.y - bbox.min.y) / 2;
-      }
-      let mesh = new THREE.Mesh(game.assets.fonts.geometry[letter], letterMaterial);
-      let container = new THREE.Group();
-      mesh.position.set(-game.assets.fonts.geometry[letter].dx, -game.assets.fonts.geometry[letter].dy, 0);
-      container.add(mesh);
-      word.add(container);
-    }
-    word.randomAnimOffset = Math.random();
-    const vFOV = THREE.MathUtils.degToRad(game.view.camera.fov);
-    let attempts = 0;
-    do {
-      let randomPlacementRadius = Math.min(0.8, angleInCourse) * Math.tan(vFOV / 2) * Math.abs(word.position.z - game.view.camera.position.z);
-      if(i == 0) {
-        randomPlacementRadius = 0;
-      }
-      let randomPlacementAngle = Math.random() * 2 * Math.PI;
-      let randomPlacementX = Math.sin(randomPlacementAngle) * randomPlacementRadius;
-      let randomPlacementY = Math.cos(randomPlacementAngle) * randomPlacementRadius;
-      word.mapPos = new THREE.Vector3(
-        randomCameraX + randomPlacementX,
-        randomCameraY + randomPlacementY,
-        0,
-      );
-      placementSuccess = true;
-      for(let j = 0; j < i; j++) {
-        if(interWordDistance.subVectors(word.mapPos, game.objects.words[j].mapPos).length() <= 1.2) {
-          placementSuccess = false;
-          break;
-        }
-      }
-      attempts += 1;
-      if(attempts >= 10) {
-        angleInCourse = 0.04 + 0.92 * Math.random();
-        attempts = 0;
-      }
-    } while(!placementSuccess);
-    scene.add(word);
-    game.objects.words.push(word);
-  }
-
   game.objects.clouds = [];
   const cloudGeometry = new THREE.PlaneGeometry(1, 200 / 350);
   const cloudShaders = {
@@ -337,6 +258,8 @@ function init(game, canvas) {
 
   game.view.camera.position.set(-5, -game.courseRadius, game.view.camera.position.z);
   game.view.scene = scene;
+  
+  reset(game);
 
   function pinwheelPositionUpdate(game, viewportX, viewportY) {
     const vFOV = THREE.MathUtils.degToRad(game.view.camera.fov);
@@ -379,11 +302,91 @@ function reset(game) {
   game.objects.feather.position.set(-11.45, -game.courseRadius - 4.2, -6.6);
   game.objects.feather.rotation.set(Math.PI, 0, Math.PI / 2.1);
   game.objects.pinwheel.material[4].opacity = 0.0;
+  game.ui.root.querySelector('.ui-page.title').classList.remove('end');
+
+  if(game.objects.words) {
+    for(let word of game.objects.words) {
+      game.view.scene.remove(word);
+    }
+  }
+  game.objects.words = [];
   game.objects.words.collectedCount = 0;
-  for(let word of game.objects.words) {
-    word.collected = null;
+  game.assets.fonts.geometry = {};
+  let letterMaterial = new THREE.MeshStandardMaterial({
+    color: 0xffffff,
+    emissive: 0x606060,
+    roughness: 0.4,
+    metalness: 1,
+  });
+  const interWordDistance = new THREE.Vector3();
+  let placementSuccess;
+  for(let i = 0; i < 100; i++) {
+    let angleInCourse;
+    let clusteringFunction = (val) => Math.max(0.15 + val / 2, 0.7 - 3 * Math.pow(0.75 - 2 * val, 2), 1 - 3 * Math.pow(1 - val, 2));
+    do {
+      angleInCourse = Math.random();
+    } while(clusteringFunction(angleInCourse) < Math.random());
+    angleInCourse = (0.08 + 0.87 * angleInCourse);
+    if(i == 0) {
+      angleInCourse = 0.05;
+    }
+    let randomCameraX = game.courseRadius * Math.sin(angleInCourse * 2 * Math.PI);
+    let randomCameraY = game.courseRadius * -Math.cos(angleInCourse * 2 * Math.PI);
+    let word = new THREE.Group();
+    word.text = getRandomWord();
+    for(let letter of word.text) {
+      if(!(letter in game.assets.fonts.geometry)) {
+        game.assets.fonts.geometry[letter] = new TextGeometry(letter, {
+          font: game.assets.fonts.cookie,
+          size: 0.2,
+          depth: 0.03,
+          curveSegments: 2,
+          bevelEnabled: false,
+        });
+        game.assets.fonts.geometry[letter].computeBoundingBox();
+        let bbox = game.assets.fonts.geometry[letter].boundingBox;
+        // Add these to local 0,0 later to get the letter's center rotation point
+        game.assets.fonts.geometry[letter].dx = (bbox.max.x - bbox.min.x) / 2;
+        game.assets.fonts.geometry[letter].dy = (bbox.max.y - bbox.min.y) / 2;
+      }
+      let mesh = new THREE.Mesh(game.assets.fonts.geometry[letter], letterMaterial);
+      let container = new THREE.Group();
+      mesh.position.set(-game.assets.fonts.geometry[letter].dx, -game.assets.fonts.geometry[letter].dy, 0);
+      container.add(mesh);
+      word.add(container);
+    }
+    word.randomAnimOffset = Math.random();
+    const vFOV = THREE.MathUtils.degToRad(game.view.camera.fov);
+    let attempts = 0;
+    do {
+      let randomPlacementRadius = Math.min(0.8, angleInCourse) * Math.tan(vFOV / 2) * Math.abs(word.position.z - game.view.camera.position.z);
+      if(i == 0) {
+        randomPlacementRadius = 0;
+      }
+      let randomPlacementAngle = Math.random() * 2 * Math.PI;
+      let randomPlacementX = Math.sin(randomPlacementAngle) * randomPlacementRadius;
+      let randomPlacementY = Math.cos(randomPlacementAngle) * randomPlacementRadius;
+      word.mapPos = new THREE.Vector3(
+        randomCameraX + randomPlacementX,
+        randomCameraY + randomPlacementY,
+        0,
+      );
+      placementSuccess = true;
+      for(let j = 0; j < i; j++) {
+        if(interWordDistance.subVectors(word.mapPos, game.objects.words[j].mapPos).length() <= 1.2) {
+          placementSuccess = false;
+          break;
+        }
+      }
+      attempts += 1;
+      if(attempts >= 10) {
+        angleInCourse = 0.04 + 0.92 * Math.random();
+        attempts = 0;
+      }
+    } while(!placementSuccess);
+    game.view.scene.add(word);
+    game.objects.words.push(word);
   }
-  game.ui.root.querySelector('.ui-page.title').classList.remove('end');
 }
 
 function animate(game, renderer, scene) {