Koheltaessani tätä peliä eteenpäin tuli taas mutkia matkaan..
Elikkäs en keksi millä tyylillä saisi toteutettua parhaiten ampumisen.. Eli avaruusalus pitäisi saada ampumaan punaisia palloja esim nyt sillon kun painetaan ctrl:ia...
Olikos tämä nyt varmasti oikea alue (C/C++?)
No enivei, tee vaikka tietotyyppi ammus:
ammus.suunta (asteissa)
ammus.x
ammus.y
ammus.alkux <-- Näitä tarvitsee lähinnä vain, jos ammus voi vaeltaa ruudun ulkopuolelle.
ammus.alkuy
Sitten voit tehdä ammuksista taulukon, jonne niitä laitetaan aina kun CTRL käy pohjassa. Tällöin uudelle ammukselle asetetaan oikea suunta ja X ja Y arvot. Joka ruudunpiirron yhteydessä ammusta liikutetaan oikeaan suuntaansa (jos etäisyys menee liian pitkäksi/ammus joutuu ruudun ulkopuolelle tai ammus osuu -> ammus tuhotaan ja tehdään tarpeelliset toimempiteet). Jos pelissä on paljon vihollisia (ja etenkin jos törmäystarkistus on pikselintarkka), ei välttämättä kannata laskea osumia kaikkiin, vaan ohittaa liian kaukana olevat viholliset.
Noh, koitan tehä tuon pohjalta...
Nyt on kyllä ihan pakko kommentoida tuohon kohtaan "Olikos tämä nyt varmasti oikea alue (C/C++?) ".. Kyllä mielestäni on, koska koodaan peliä C++/SDL yhdistelmällä.. Eli suurin osa tästä ammus järjestelmästäkin koodataan C++:lla...
kayttaja-3842 kirjoitti:
Nyt on kyllä ihan pakko kommentoida tuohon kohtaan "Olikos tämä nyt varmasti oikea alue (C/C++?) ".. Kyllä mielestäni on, koska koodaan peliä C++/SDL yhdistelmällä.. Eli suurin osa tästä ammus järjestelmästäkin koodataan C++:lla...
Äsken tämä threadi oli kylläkin VB-alueella, mutta moderaattori näyttää siirtäneen sen.
Ja jos kerta kerta käytät c++ niin kannattaa tallentaa nuo ammusten tiedot vector luokkaan. Tällä tavoin et joudu asettamaan rajoitusta, kuinka monta panosta samaan aikaan voi olla.
Suosittelen myös jonkun paremman tietorakenteen kuin taulukon käyttämistä, esimerkiksi linkitetty lista.
Näin ei tarvitse käydä läpi kuin ne jotka on olemassa ja ammuksiakin voi olla loputtomasti.
Kannattaa tutustua C++:an standardikirjaston vector:iin ja list:iin.
Vector on taulukko, jonka koko voi muuttua ja list on se linkitetty lista.
Lisäänpä vielä selityksen linkitetystä listasta:
Linkitetyssä listassa laitetaan jokaisen alkion mukaan osoitin osoittamaan seuraavaa alkiota.
Eli seuraavan alkion saat ottamalla tämänhetkisestä alkiosta tuon "seuraavaan alkioon osoittavan osottimen".
Sinulla tietysti pitää olla selvillä ensimmäisen alkion osoite.
Ja viimeinen alkio ei sitten kertookin osoitteen, joka osottaa NULL:iin.
Saakohan tuosta nyt selvää? ;)
Täytyy kyllä myöntää, että olen ihan ulkona :D...
Olisiko mahdollista, että koodaisit pienen esimerkin?
Mä voin <3
no en ihan nyt. huomenna.
väsyttää..
anyway, kun kerran koodaat C++:lla olet varmasti tutustunut olioihin.. Eli luot tyyliin uuden olion jokaiselle ammutulle ammukselle ja asetat niille sitten suunnan johon lähtevät ja alkusijainnin tjsp ovelaa :o ja sit käyt ne läpi tyyliin joka frame ja kun ne menee pois ruudulta tuhoat kyseiset otukset! tjsp.
*nods nods* näin. esimerkinki voisin tehä. huomenna.
//Luokka ammusta varten class Ammus { int x, y; //ammuksen sijainti int xSpeed, ySpeed; //kuinka paljon x:n ja y:n lisätään joka frame double z; //ammuksen suunta radiaaneina public: //Konstruktori, joka asettaa muuttujien arvot Ammus(int x, int y, double z, int vauhti){ this->x = x; this->y = y; this->z = z; this->xSpeed = sin(z) * vauhti; this->ySpeed = cos(z) * vauhti; } //liikuttaa ammusta void liikuta() { x += xSpeed; y += ySpeed; } //Tarkistaa osuuko johonkin int tarkistaOsumat() { //Tarkistat osuuko ammus johonkin jne.. } }; std::vector<Ammus> ammukset; //Luodaan vektori ammuksille Ammus ammus(10, 10, 3.14f, 4); //Luodaan kaksi uutta ammusta Ammus ammus2(10, 10, 0.475f, 3); ammukset.push_back(ammus); //Listään ammukset vektoriin ammukset.push_back(ammus2); //Käydään ammukset läpi joka framella ja tehdään tarvittavat toimeenpiteet for(int i = 0; i < ammukset.size(); i++) { ammukset[i].liikuta(); //Liikutetaan ammukset[i].tarkistaOsuuko(); //Osuuko johonkin? }
Kiitos paljon Smuliz vaivannäöstäsi... Tuolla oli pari kohtaa jota en oikein tajunnut, mutta voin selvittää ne kyllä ihan itsekkin.
Kerro toki, mikä jäi epäselväksi niin yritän selittää paremmin :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.