Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ampuminen (SDL)

Sivun loppuun

kayttaja-3842 [14.08.2006 18:27:17]

#

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...

Meitsi [14.08.2006 18:33:07]

#

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.

kayttaja-3842 [14.08.2006 19:27:02]

#

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...

Meitsi [14.08.2006 19:57:43]

#

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.

Smuliz [14.08.2006 21:27:59]

#

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.

Megant [14.08.2006 21:31:11]

#

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ää? ;)

kayttaja-3842 [15.08.2006 20:08:18]

#

Täytyy kyllä myöntää, että olen ihan ulkona :D...
Olisiko mahdollista, että koodaisit pienen esimerkin?

Tzaeru [15.08.2006 21:02:55]

#

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.

Smuliz [16.08.2006 09:44:33]

#

//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?
}

kayttaja-3842 [16.08.2006 13:43:08]

#

Kiitos paljon Smuliz vaivannäöstäsi... Tuolla oli pari kohtaa jota en oikein tajunnut, mutta voin selvittää ne kyllä ihan itsekkin.

Smuliz [17.08.2006 20:36:14]

#

Kerro toki, mikä jäi epäselväksi niin yritän selittää paremmin :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta