Three.js ile tarayıcıda ilk tarla

Semih1 dk okuma

Bir tarayıcı oyununun ilk sahnesi nasıl kurulur? Kamera, ışık, düşük poligonlu bir tarla ve tıklanabilir parseller için Three.js ile adım adım başlangıç.

Tarayıcı oyunlarında ilk sahne, oyuncunun “bu oyun hızlı” diye karar verdiği yerdir. Bu yazıda Three.js ile düşük poligonlu bir tarla kurup parsellere tıklanabilir hale getireceğiz.

Sahne, kamera, ışık

Çiftlik oyunlarında genellikle yukarıdan, hafif eğik bakan bir kamera kullanılır. Ortografik kamera, uzaklığa göre küçülme olmadığı için tahtayı bir masa oyunu gibi gösterir.

import * as THREE from 'three';

const scene = new THREE.Scene();
const aspect = innerWidth / innerHeight;
const camera = new THREE.OrthographicCamera(-10 * aspect, 10 * aspect, 10, -10, 0.1, 100);
camera.position.set(12, 14, 12);
camera.lookAt(0, 0, 0);

scene.add(new THREE.HemisphereLight(0xffffff, 0x6b8f5a, 1.1));
const sun = new THREE.DirectionalLight(0xfff1d6, 1.4);
sun.position.set(6, 10, 4);
scene.add(sun);

Parselleri dizmek

Her parsel ince bir kutu. Aynı geometriyi yüzlerce kez çizeceksek InstancedMesh kullanmak çizim çağrısını tek bir çağrıya indirir.

const plot = new THREE.BoxGeometry(1.8, 0.2, 1.8);
const soil = new THREE.MeshLambertMaterial({ color: 0x8a5a3b });
const field = new THREE.InstancedMesh(plot, soil, 9);
const m = new THREE.Matrix4();
for (let i = 0; i < 9; i++) {
  m.setPosition((i % 3) * 2 - 2, 0, Math.floor(i / 3) * 2 - 2);
  field.setMatrixAt(i, m);
}
scene.add(field);

Tıklama: hangi parsel?

Raycaster, ekrandaki bir noktadan sahneye ışın gönderir. InstancedMesh ile kesişimde instanceId bize parselin numarasını verir.

const ray = new THREE.Raycaster();
addEventListener('pointerdown', (e) => {
  const p = new THREE.Vector2((e.clientX / innerWidth) * 2 - 1, -(e.clientY / innerHeight) * 2 + 1);
  ray.setFromCamera(p, camera);
  const hit = ray.intersectObject(field)[0];
  if (hit) selectPlot(hit.instanceId);
});

Performans için üç kural

  • Aynı nesneyi tekrar tekrar çiziyorsan instancing kullan.
  • Gölgeleri yalnızca gereken ışıkta aç; mobilde en pahalı ayar odur.
  • Dokuları sıkıştır ve sahneyi, sayfanın geri kalanı açıldıktan sonra yükle.

Bu adımlar bir oyunun iskeletidir. Döngü, görevler ve ekonomi bunun üstüne kurulur. Canlı bir örnek görmek istersen Farmie’yi açabilirsin.

Kitapçıkta devamı

  1. 2 dk okuma

    Tarayıcı oyununda 60 FPS: telefonu ısıtmadan akıcı sahne

    Three.js ile yapılan bir tarayıcı oyununu orta seviye telefonlarda akıcı tutmak için çizim çağrıları, gölgeler, dokular ve piksel oranı üzerine pratik notlar.

  2. 2 dk okuma

    WHMCS mi WiseCP mi? Hosting firması için panel seçerken sorulacak 6 soru

    Hosting ve alan adı satan bir firma için WHMCS ile WiseCP arasında seçim yaparken bakılacak noktalar. Kazanan yok, doğru sorular var.

Şans

Aklında bir proje mi var? Kutuyu açalım: ne yapmak istediğini anlat, sana kapsamı ve yol haritasını içeren bir teklif hazırlayayım.

Teklif iste

ya da doğrudan yaz: merhaba@semih.fun