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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.