Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Miten elementtejä kannattaisi tallentaa ja käsitellä?

Pentu [02.08.2023 19:02:59]

#

Moro!

Kehittämässäni (ChatGPT -kisa) pelissä liikkuvat elementit (kalat) on tallennettu objekteihin, joille annetaan tietyt ennalta määritellyt tiedot toisesta objektista. Lisäksi päälle liimataan sijainti tiedot ja id.

En tiedä onko ratkaisu nykyisellään kovinkaan hyvä. Elementeille annetaan kuitenkin paljon samaa tietoa, eri väriset pitää käsitellä eri tavoin. Nykyisellään ratkaisu toimii varmaan ihan hyvin tällaisessa pelissä.

Etsin kuitenkin pätevämpää ratkaisua hoitaa tuo elementtien luominen ja käsittelyyn.
Pelin pääsilmukan koodi kokonaisuudessaan.

Grafiikan luonti on renderin heiniä, mutta kannattaisiko elementin piirtämisen hoitava funktio sisällyttää myös elementin objektiin. Jatkossa, jos ja kun lisään uusia elementtejä peliin, niin ei tarvitsisi moneen kohtaan lisätä koodia.

Elementin luonnin hoitava koodi.

// NOTICE Joitakin osia tuotu vanhasta generaattorista
function generateFish() {
  // Arvo satunnainen väri
  const randomColor = getRandomColor()

  // Etsi vastaava kala-objekti fishColorsData-listasta
  const fishData = fishColorsData.find((fish) => fish.color === randomColor);

  if (fishData) {
    // Jos löydettiin kala-objekti, käytä getSpeed-funktiota tai arvo normaali nopeus
    const speed = fishData.getSpeed ? fishData.getSpeed() : Math.random() < 0.12 ? 1.5 : 1; // getRandomNumber(1, 5);

	// Generoidaan kalan sijainti ja muut ominaisuudet
    const positionX = gameWidth;
    //NOTICE Arvontaa muutettu kalan piirron muutoksen vuoksi + sijanti tiedot siirretty myöhemmälle kalojen vaihtelevan koon vuoksi
    const positionY = Math.floor(Math.random() * (gameHeight - fishData.height) + fishData.height / 2); // Satunnainen korkeus (20-260); // Arvo satunnainen sijainti pystysuunnassa

	const newFish = {
	  // DEBUG pidetään toistaiseksi kalan ominaisuutena
	  level: Math.floor(Math.random() * playerFish.level) + 1, // Satunnainen taso (1-pelaajan taso)

      id: fishCount + 2, // Lisää 2 id:hen, jotta huomioi pelaajan kalan
	  color: fishData.color,
      positionX,
      positionY,
      speed,
      width: fishData.width,
      height: fishData.height,
      eye: { ...fishData.eye }, // Kopioidaan silmä-objekti uuteen kalahaamuun
      pupil: { ...fishData.pupil }, // Kopioidaan pupilli-objekti uuteen kalahaamuun
      onCollision: fishData.onCollision,
	  // Lisää muut kalan ominaisuudet tarpeen mukaan
    };

    fishList.push(newFish); // Lisää uusi kalaobjekti kalalistaan
    fishCount++; // Kasvata generoitujen kalojen määrää yhdellä
  } else {
	  console.log("Arvottua kalaa ei löytynyt!")
  }
}

* Tarkennuksena:
Kisa versioon ei ole tulossa muutoksia.

Edit:
game.js
render.js
pelisivu

jalski [02.08.2023 20:46:54]

#

Sori, en nyt ota varsinaisesti kantaa tähän ongelmaan, mutta ajattelin kysyä pystyykö pelin näppäimistönluku rutiinille tekemään jotain? Nykyisellään reagoi tosi hitaasti varsinkin sen jälkeen mikäli sattuu painamaan useamman näppäimen yhtäaikaa pohjaan. Olisiko näppäin tapahtumilla mahdollista päivittää näppäimien tiloja vaikka map-rakenteeseen ja pelissä tarkastaa suoraan tuosta rakenteesta onko näppäin pohjassa vai ei. Pelin tapahtuma looppia pitäisi sitten vaan ajaa ajastimella ja muut mahdolliset ajastimet pystyy korvaamaan laskuri muuttujilla.

Pentu [03.08.2023 09:38:42]

#

Joo, koodista toki löytyy varmasti paljon muutakin parannettavaa. Muitakin epäkohtia voi (ja pitää) toki tuoda esille.

Kyllä tohon näppäintenlukuun pitäisi jotain muutoksia tehdä. Toi liike on muutenkin hieman kankeaa, eikä pelaajan hahmon nopeus muutu pelin nopeutuessakaan. Viimeisimmäksi painettu näppäin on toki hieman ongelmallinen liikkeen hallintaan. Esimerkiksi painat vahingossa kesken liikkeen nuolta toiseen suuntaan, niin liike pysähtyy vaikka näppäin toinen näppäin olisi yhä pohjassa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta