Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Raskas peli

Sivun loppuun

mika132 [16.10.2009 13:30:32]

#

Eli tein C++ sitä peliä josta moni varmasti tietääkin jo, kun näitä kysymyksiä on ollut.

Nyt kuitenkin. Pelissä on 5 eri kuvaa. (yksi on näytön kokoinen 1024*768) jotta sain lattian. En tiedä olisiko saanut jotenkin sillä tavalla, että 20*20 kuva olisi monistettu koko alueelle?

Peli on kuitenkin hiivatin raskas. Avaan pelin kestää noin 20 sekunttia. Klikkaan "jääkaappia" kestää noin 10sek, jotta se avaa taustan (jotta vanhat kuvat menevät piiloon) ja sitten painan RSHIFT jotta pääsen takaisin ensimmäiseen huoneeseen. Tähän kuluu noin 5sek. Sitten painan "esineet" nappia kesti 30sek, jotta se sai avattua tuon ikkunan. Painoin jälleen RSHIFT jotta pääsin takaisin ja aikaa kului tuo 5-10sek. Painoin uudestaan jääkaappia ja noin 30sekunnin odotuksen jälkeen painoin esc, kun mitään ei tapahtunut. Sulkeutumiseenkin meni noin 20sek. Mikä aiheuttaa raskaan ohjelman? Tai miten voisin lievittää sitä.

Teuro [16.10.2009 14:01:31]

#

Kuulostaa sille, että teet jonkun todella raskaan operaation tarpeettoman monta kertaa. Katso vaikka softan kuluttama muisti ajon aikana. Kuvat lataat tietenkin ohjelman alussa, joka voi hiukan kestää. Ajon aikana kuvien piirto muistista on kohtuullisen helppoa. Piirtämisenkin tehnet ensin taustaan, jonka piirrät yhdellä kertaa suoraan näytölle.

Näyttömuistiin on meinaan todella hidasta kirjoitella suoraan.

mika132 [16.10.2009 14:52:13]

#

Jos heitän koodin tähän ja katsoisitte, koska en tajunnut kunnolla. =)

Koodi

Teuro [16.10.2009 14:57:12]

#

Ei tarvinne kertoa enempää... Ne grafiikathan piti ladata heti alussa ja käyttää sen jälkeen niitä muistista. Nythän niitä ladataan monta kertaa.

mika132 koodi kirjoitti:

while(pois==false){
    if (huone == 0){
        lattia=SDL_LoadBMP("grafiikat/lattia.bmp");
        kuva=SDL_LoadBMP("grafiikat/kuva.bmp");
        talo_1=SDL_LoadBMP("grafiikat/talo_1.bmp");
        talo_2=SDL_LoadBMP("grafiikat/talo_2.bmp");
        paneeli=SDL_LoadBMP("grafiikat/paneeli.bmp");
    }
}

Ja sitten ihan muuta höpinää. Tuolla tavalla tehtynä pelisi koodista tulee pitkä, sekava, hankalasti ylläpidettävä jne... Teet näköjään jokaiselle huoneelle oman if-haaran. Mielummin yksi käsittelijä "engine", joka lukee huoneen tiedot tiedostosta ja piirtää huoneen.

mika132 [16.10.2009 15:26:48]

#

Tiedän. Koodista tulee pitkä ja sekava. En vain taida vielä osata tehdä tuollaista käsittelijää. :)

Millä funktiolla siasin kuvan koon tietoon? Se helpottaisi jo paljon muutamia asioita. :)

Sitten onko se mahdollista, että 20x20 kuvan saisi koko näytölle? Siinä vain säästyisi pelin kokonais koko kun ei ole 1024x768 kuvia.

Ja voisiko joku ohjeistaa miten SDL_gfx asennetaan Visual C++ 2008:aan?

Claw [16.10.2009 16:14:14]

#

Suosittelen tutustumaan tähän:
http://www.lazyfoo.net/SDL_tutorials/lesson03/windows/msvsnet0508e/index.php

Legu [16.10.2009 16:20:30]

#

mika132 kirjoitti:

Millä funktiolla siasin kuvan koon tietoon? Se helpottaisi jo paljon muutamia asioita. :)

SDL:n dokumentaatiosta käy helposti ilmi, että SDL_Surfacella on tiedot w ja h. Siis leveys on kuva->w ja korkeus kuva->h.

mika132 kirjoitti:

Sitten onko se mahdollista, että 20x20 kuvan saisi koko näytölle? Siinä vain säästyisi pelin kokonais koko kun ei ole 1024x768 kuvia.

Oletkohan sattunut kuulemaan silmukoista?

for (int y = 0; y < nayton_korkeys; y += kuvan_korkeus) {
    for (int x = 0; x < nayton_leveys; x += kuvan_leveys) {
        // Piirretään kuva kohtaan x,y
    }
}

Metabolix [16.10.2009 16:31:43]

#

Kuvien lataamiseen voisit käyttää vaikka tuota yhä listalla uusimpana näkyvää koodivinkkiäni. Vinkin esimerkissä on näytetty ja selitetty yksinkertainen, aivan aloittelijallekin soveltuva käyttötapa. (Turha noita vinkkejä kai on kirjoittaa, kun ei niitä kukaan vinkkejä tarvitseva älyä käydä lukemassa. >_>)

mika132 [16.10.2009 17:06:53]

#

Juu vilkaisenpa koodiasi jahka ehdin. :)

Mutta nyt yritän tehdä sellaista, että jos painetaan "lihatiskiä" ostos tilassa niin se lähtee kulkemaan hiiren mukana ja painaessa esine jonnekkin se jää siihen, mutta ongelmaksi muodostuu, että se ei lähde hiiren mukaan vaan ostos tilassa painaessani vasenta hiiren painiketta (eli ostos tila on huone 2) siirtyessä kauppaan (huone 0) se pläjähtää siihen kohtaan missä painoin ostos tilassa hiirtä kuvan kohdalla.

tämä koodin pätkä on while(pois==false) silmukassa. Eli samassa missä käytännössä koko peli.

			if (hiiren_mukana==1)
			{
				hiiri=SDL_GetMouseState(&hiiren_x,&hiiren_y);
				if (hiiri & SDL_BUTTON(1))
				{
					hiiren_mukana=2;
					hiiri=SDL_GetMouseState(&hiiren_x,&hiiren_y);
					PiirraKuvaTausta(lihatiski, naytto, hiiren_x, hiiren_y);
					there_x = hiiren_x;
					there_y = hiiren_y;
					hiiren_mukana=2;
				}
			}
			if (hiiren_mukana==2)
			{
				PiirraKuvaTausta(lihatiski, naytto, there_x, there_y);
			}

Seuraava koodin pätkä on tarkastus, että painetaanko ostostilassa lihatiskiä.

void MitaOstetaan(int hiiren_x, int hiiren_y, int lihatiskiKuvanX, int lihatiskiKuvanY, int lihatiskiKuvanLeveys, int lihatiskiKuvanKorkeus){
	int lihatiski_viimeinen_X = lihatiskiKuvanX + lihatiskiKuvanLeveys;
	int lihatiski_viimeinen_y = lihatiskiKuvanY + lihatiskiKuvanKorkeus;

	if ((hiiren_x >= lihatiskiKuvanX) && (hiiren_x <= lihatiski_viimeinen_X))
	{
		if ((hiiren_y >= lihatiskiKuvanY) && (hiiren_y <= lihatiski_viimeinen_y))
		{
			hiiren_mukana=1;
			huone=0;
		}
	}

}

Varmuuden vuoksi koko koodi

Torgo [16.10.2009 17:19:06]

#

mika132 kirjoitti:

Tiedän. Koodista tulee pitkä ja sekava. En vain taida vielä osata tehdä tuollaista käsittelijää.

Ei siinä sinänsä mitään väärää ole, että perusasioita vielä opiskellessa tekee yksinkertaisia ohjelmia tuolla tyylillä. Mutta kun ohjelman koko alkaa kasvaa, kasvaa myös logiikan määrä ja niin hyvin pian tuosta "yksinkertaisesta" tavastasi tuleekin paljon monimutkaisempi ja vaikeampi tapa.

Yksinkertaista kentän piirtoa varten sinun ei tarvitse opetella uusia asioita muuta kuin tiedostojen käsittely. Sitten vain päätät millä tavalla kuvaat kentät ja kirjoitat ne joko samaan tiedostoon tai jokaisen omaansa. Sitten teet funktion, joka ottaa kenttänumeron tai -nimen parametrinaan, lukee sen perusteella oikeat tiedot tiedostosta ja alustaa kentän tiedostossa esitellyllä tavalla. Kentät voi kuvata esim. xml:llä, mutta kannattaa ainakin aluksi harjoitusmielessä keksiä vain jokin oma, mahdollisimman yksinkertainen kuvaustapa.

mika132 kirjoitti:

Sitten onko se mahdollista, että 20x20 kuvan saisi koko näytölle? Siinä vain säästyisi pelin kokonais koko kun ei ole 1024x768 kuvia.

http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface

Jos lähdekuva (*src) on kooltaan 20x20 ja lähdealue (*srcrect) on null, niin kohteeseen (*dst) piirretään 20x20 kuva kohdealueelle (*dstrect). Eli voit piirrellä noita 20x20 kuvia näyttöpinnalle niin paljon kuin sielu sietää ennen flippausta.

Metabolix kirjoitti:

Turha noita vinkkejä kai on kirjoittaa, kun ei niitä kukaan vinkkejä tarvitseva älyä käydä lukemassa.

_o/ Mä luin. Pikalukumoodissa tosin, mutta tosi hyvältä vaikutti. :)

Metabolix [16.10.2009 17:36:30]

#

Kai nyt järkikin sanoo, että jos kuva piirretään ehtolauseen (if (hiiri & SDL_BUTTON(1))) sisällä, se tosiaan piirretään vasta, kun nappia painetaan – aivan kuten havaitsitkin. Kyllä ne havainnot yleensä vastaavat täysin sitä, mitä koodiin on kirjoitettu, eli kannattaa vain opetella katselemaan omasta koodista, millaisia ehtoja, silmukoita tms. sen olennaisen rivin (tällä kertaa kuvan piirtämisen) ympärillä on.

Kannattaa heti alkuun myös erottaa piirtokoodi ja logiikka toisistaan.

int ukko_x = 100, ukko_x = 100;
while (!pois) {
  // Ensin käsitellään syötteet.
  if (tilanne == 0) {
    liiku_vasemmalle = napit[SDLK_LEFT];
  } else {...}

  // Sitten suoritetaan pelin logiikka.
  if (tilanne == 0) {
    if (liiku_vasemmalle) {
      int ukko_x_uusi = ukko_x - 1;
      if (ukko_x_uusi >= 0) {
        ukko_x = ukko_x_uusi;
      }
    }
  } else {...}

  // Lopuksi piirretään kuvat.
  if (tilanne == 0) {
    SDL_Rect ukko_rect = {ukko_x, ukko_y};
    SDL_BlitSurface(ukko, NULL, ruutu, &ukko_rect);
  } else {...}

  // Ja aivan viimeisenä on flip.
  SDL_Flip(ruutu);
}

Esimerkki on karkea, mutta idea tulee toivottavasti selväksi: Syötteiden käsittelyn yhteydessä yksinkertaisesti tulkitaan syötteet ja tallennetaan tulkinnat muuttujiin. Logiikkavaiheessa tarkistetaan näistä syötteistä, mitä pitää tehdä, ja muutetaan sisäisiä muuttujia sen mukaan. Kaikki piirtoasiat tehdään vasta tämän jälkeen, ja piirtokoodin yhteydessä ei tarkisteta enää muuta kuin yksinkertaisesti, mikä huone on kyseessä (eli mikä tausta piirretään), missä kohti esineet ovat, mitkä esineet edes näkyvät jne., ja tämä kaikki on jo tallennettu muuttujiin (ukko_x, ukko_y yms.).

Oikeasti logiikkaa ei missään tapauksessa pitäisi tunkea main-funktioon, vaan eri osa-alueet ovat omissa funktioissaan. Yksinkertaistettuna toiminta voisi olla tällainen (todellisuudessa käytettäisiin esim. polymorfisia luokkia):

enum tilannetyyppi {
  OLOHUONE, JAAKAAPPI
};
tilannetyyppi tilanne = OLOHUONE;

// ...

while (!pois) {
  switch (tilanne) {
    case OLOHUONE:
      olohuone_viestit();
      olohuone_logiikka();
      olohuone_piirto();
      break;
    case JAAKAAPPI:
      jaakaappi_viestit();
      jaakaappi_logiikka();
      jaakaappi_piirto();
      break;
  }
  SDL_Flip(ruutu);
}

Torgo kirjoitti:

_o/ Mä luin. Pikalukumoodissa tosin, mutta tosi hyvältä vaikutti. :)

Et välttämättä täyttänyt sitä toista kriteeriä eli vinkintarvetta. :)

mika132 [16.10.2009 18:32:09]

#

En tiedä ymmärsitkö väärin, mutta tarkoitin, että klikatessa kuva piirretään ja sen pitäisi kulkea hiiren mukana niin pitkään, että painetaan toisen kerran ykköshiirtä ja sitten se jää siihen ja koodinaatit tallennetaan johonkin muuttujaan.

Nyt käy niin, että klikattu kuva ei liiku hiiren mukana vaan jää heti siihen missä kohtaa klikkasin ensimmäisen kerran. Eli koodi ikäänkuin ottaa kaksi kertaa ykköspainikkeen käskyn vastaan ja se ei pitäisi ottaa kuin kerran.

eq [16.10.2009 23:17:32]

#

mika132 kirjoitti:

En tiedä ymmärsitkö väärin, mutta tarkoitin, että klikatessa kuva piirretään ja sen pitäisi kulkea hiiren mukana niin pitkään, että painetaan toisen kerran ykköshiirtä ja sitten se jää siihen ja koodinaatit tallennetaan johonkin muuttujaan.

Nyt käy niin, että klikattu kuva ei liiku hiiren mukana vaan jää heti siihen missä kohtaa klikkasin ensimmäisen kerran. Eli koodi ikäänkuin ottaa kaksi kertaa ykköspainikkeen käskyn vastaan ja se ei pitäisi ottaa kuin kerran.

Tarkistatko ensimmäisen ja toisen "klikkauksen" välissä sitä, että hiiren painike tosiaan käy ylhäällä?

Metabolix [16.10.2009 23:19:57]

#

Kuten yritin selittää, et piirrä kuvaa silmukassa hiiren kohdalle, vaan piirrät sen vasta klikkauksen jälkeen. Katso nyt tuota laittamaasi koodinpätkää ja mieti, missä ensimmäisen piirtofunktion pitäisi olla, jotta kuva piirrettäisiin aina eikä vasta klikkauksella.

mika132 [16.10.2009 23:54:56]

#

Tarkoitus olisikin se, että se piirretään vasta sen toisen klikkauksen jälkeen. Eli käytännössä puhutaan pelissä jossa saa itse asettaa omien tavaroiden sijainnin.

Metabolix [17.10.2009 01:06:50]

#

Etkö juuri valittanut sitä, että se ei seuraa hiirtä? Miten voit havaita seuraamisen tai seuraamattomuuden, jos sen ei ole edes tarkoitus seurata hiirtä?

Jos ongelmasi tosiaan on vain, että kuva siirtyy ensimmäiseen klikattuun kohtaan eikä toiseen, kysymys on varmaankin tuosta, mitä eq arveli: hiiren nappi on pohjassa ja aiheuttaa ensimmäisen "klikkauksen", ja tämän jälkeen ohjelma jatkaa kulkuaan niin nopeasti, että toisenkin tarkistuksen aikana nappi on yhä pohjassa.

Jos ohjelmasi toimii tapahtumien mukaan (nappia painettu) eikä tilanteen mukaan (nappi pohjassa juuri nyt), viestit kuuluisi käsitellä näin:

void jaakaappi_viestit() {
  SDL_Event tapahtuma;
  // Kun jonossa on viestejä, haetaan viesti ja käsitellään tapahtuma.
  while (SDL_PollEvent(&tapahtuma)) {
    if (tapahtuma.type == SDL_MOUSEBUTTONDOWN) {
      // Nappia painettiin. Tarkemmat tiedot ovat rakenteessa tapahtuma.button.
      // http://sdl.beuc.net/sdl.wiki/SDL_MouseButtonEvent
    }
  }
}

Hyvin monilta ongelmilta välttyisit, kun noudattaisit aiemmin selittämääni rakennetta. Tämäkin funktiomalli on tehty sen mukaan. Voit halutessasi aluksi käyttää vain kahta funktiota joka tilalle: X_viestit() ja X_piirto().

mika132 [17.10.2009 15:17:49]

#

olen kenties huono selittämään, mutta nyt kuva ei seuraa hiirtä. Siis tarkoitus on, että kun painetaan jotain ostettavaa tavaraa niin kuva seuraa hiirtä niin pitkään, että painetaan ykköspainiketta uudestaan tämän jälkeen kuva jää siihen eikä liiku enää.

Metabolix [17.10.2009 15:43:23]

#

Olet kenties vain huono ymmärtämään vastauksia. Ehkä sinun pitäisi vain tehdä yksinkertaisia tekstiohjelmia (ja unohtaa SDL kokonaan), kunnes ohjelmoinnin logiikka alkaa hahmottua mielessäsi selkeämmin. Sitten voisit palata tähän keskusteluun, lukea pari viimeistä viestiä uudestaan ja ymmärtää.

Aloita nyt asian korjaaminen siitä, että muutat ohjelmasi rakenteen ehdottamallani tavalla. Useimmat ongelmat ratkeavat tällä aivan itsestään.

Kertauksen vuoksi vielä: Kuva ei ainakaan ruudulla seuraa hiirtä, jos et jatkuvasti piirrä sitä uudestaan hiiren kohdalle. Lisäksi tarkistuksessasi katsotaan vain, onko hiiren nappi pohjassa, ja koska et ehkä ehdi nostaa sormeasi siinä ensimmäisen ja toisen "klikkauksen" välissä, ensimmäinen klikkaus kuittaa molemmat.

mika132 [17.10.2009 15:59:53]

#

No sitten en tarvitse muuta kuin koodin, että takristetaan milloin hiiri nousee ja lisätään se muuttujan arvo. Eli onko se

if (hiiri & SDL_BUTTONUP(1)) {
hiiren_mukana=1;

}

Mod. lisäsi kooditagit

Metabolix [17.10.2009 16:14:48]

#

Ei, ei ole. Jos soveltaisit hieman perusasioita, voisit johtaa sen tuosta aiemmasta tarkistuksestasi.

vehkis91 [17.10.2009 16:15:04]

#

Muokkaamalla vähän tuota Metabolixin laittamaa koodia päästään tähän:

void jaakaappi_viestit()
{
    SDL_Event tapahtuma;
    // Kun jonossa on viestejä, haetaan viesti ja käsitellään tapahtuma.
    while (SDL_PollEvent(&tapahtuma))
    {
       if(event.type == SDL_MOUSEBUTTONDOWN)
       {
         if(event.button.button == SDL_BUTTON_LEFT)
         {
            //Jos painettiin vasen nappi pohjaan. Eli aloitettiin raahaus
            //tee jotain....
         }
      }
      else
      if(event.type == SDL_MOUSEBUTTONUP)
      {
         if(event.button.button == SDL_BUTTON_LEFT)
         {
            //Jos päästettiin vasen nappi ylös. ELi lopetettiin raahaus
            //Tee jotain.
         }
      }
    }
}

Tuohon vaan lisäät vaikka boolean muuttujan, jonka arvo on true kun raahataan ja false kun ei raahata.

mika132 [17.10.2009 18:02:10]

#

Ai. Ajattelin jos tekisin sen näin:

    SDL_Event tapahtumaa;
    // Kun jonossa on viestejä, haetaan viesti ja käsitellään tapahtuma.
    while (SDL_PollEvent(&tapahtumaa))
    {
       if(event.type == SDL_MOUSEBUTTONDOWN)
       {
         if(event.nappi.nappi == SDL_BUTTON_LEFT)
         {
			hiiri=SDL_GetMouseState(&hiiren_x,&hiiren_y);
			PiirraKuvaTausta(lihatiski, naytto, hiiren_x, hiiren_y);
         }
      }
      else
      if(event.type == SDL_MOUSEBUTTONUP)
      {
         if(event.nappi.nappi == SDL_BUTTON_LEFT)
         {
				hiiri=SDL_GetMouseState(&hiiren_x,&hiiren_y);
				there_x = hiiren_x;
				there_y = hiiren_y;
				PiirraKuvaTausta(lihatiski, naytto, there_x, there_y);
         }
      }

Mutta ongelma on helkkarinmoinen läjä erroreita joista en tajua mitään, kun ylempänä on tuo

	Uint8* nappi;

mutta:

1> (polku)\bisnesmanager2.cpp(247) : error C2065: 'event' : undeclared identifier
1> (polku)\bisnesmanager2.cpp(247) : error C2228: left of '.type' must have class/struct/union
1>        type is ''unknown-type''

vehkis91 [17.10.2009 18:30:27]

#

Edit2: oli koodissa pikku virhe...
Edit: ja noi sun virhees tulee, ku sull on määritetty SDL_Event tapahtumaa, mutta käytät silmukan sisällä event.xxx etkä tapahtumaa.xxx


Tuossa on edelleenkin virheitä...

Tässä yksinkertainen esimerkki. Miten asian pitäisi toimia.

//Ennen pääsilmukkaa
   SDL_Event event;
//boolean arvo
   bool napattu = false;
//kuvan alkukoordinaatit
   int kuvanX = 100, kuvanY = 100;

//pääsilmukassa
while(jotain)
{

    while (SDL_PollEvent(&event))
    {
       hiiri=SDL_GetMouseState(&hiiren_x,&hiiren_y);

       if(event.type == SDL_MOUSEBUTTONDOWN)
       {
         if(event.nappi.nappi == SDL_BUTTON_LEFT)
         {
            if(hiiri_on_kuvan_päällä)
               napattu = true;
         }
      }
      else
      if(event.type == SDL_MOUSEBUTTONUP)
      {
         if(event.nappi.nappi == SDL_BUTTON_LEFT)
         {
             //jos napattuna
             if(napattu)
             {
                kuvanX = hiiren_x;
                kuvanY = hiiren_y;
                napattu = false;
             }
         }
      }
    }
//Jos napattu, niin piirretään hiiren koordinaatteihin, muuten kuvan
//koordinaatteihin.
if(napattu)
    PiirraKuvaTausta(lihatiski, naytto, hiiren_x, hiiren_y);
else
   PiirraKuvaTausta(lihatiski, naytto, kuvanX, kuvanY);
//toiminta..
}

mika132 [17.10.2009 19:25:09]

#

Juu. Errorit väheni.

1>c:\documents and settings\mika.koti-8fec3c6ef1\omat tiedostot\visual studio 2008\projects\bisnesmanager\bisnesmanager2\bisnesmanager2.cpp(253) : error C2039: 'nappi' : is not a member of 'SDL_Event'
1> c:\program files\microsoft visual studio 9.0\vc\include\sdl_events.h(217) : see declaration of 'SDL_Event'
1>c:\documents and settings\mika.koti-8fec3c6ef1\omat tiedostot\visual studio 2008\projects\bisnesmanager\bisnesmanager2\bisnesmanager2.cpp(253) : error C2228: left of '.nappi' must have class/struct/union
1>c:\documents and settings\mika.koti-8fec3c6ef1\omat tiedostot\visual studio 2008\projects\bisnesmanager\bisnesmanager2\bisnesmanager2.cpp(255) : error C2065: 'hiiri_on_kuvan_päällä' : undeclared identifier
1>c:\documents and settings\mika.koti-8fec3c6ef1\omat tiedostot\visual studio 2008\projects\bisnesmanager\bisnesmanager2\bisnesmanager2.cpp(262) : error C2039: 'nappi' : is not a member of 'SDL_Event'
1> c:\program files\microsoft visual studio 9.0\vc\include\sdl_events.h(217) : see declaration of 'SDL_Event'
1>c:\documents and settings\mika.koti-8fec3c6ef1\omat tiedostot\visual studio 2008\projects\bisnesmanager\bisnesmanager2\bisnesmanager2.cpp(262) : error C2228: left of '.nappi' must have class/struct/union

viiteen, mutta se valittaa edelleen samoja enkä tajua miksi. :O

Metabolix [17.10.2009 19:30:08]

#

Mistä ihmeestä olet tuon napin repinyt, kun esimerkissäni lukee aivan selvästi button? Edellisessä (vehkiksen) koodissa oli osassa kohdista event eikä tapahtuma. Lisäksi kannattaisi yrittää ymmärtää, että annetut koodit eivät ole valmiita koodeja, jotka voisit vain lätkäistä projektiisi, vaan niissä on kohtia, jotka sinun pitäisi itse kirjoittaa (kuten "hiiri_on_kuvan_päällä", josta tulee virheilmoitus).

mika132 [17.10.2009 19:50:03]

#

juu kiitos. Minun PAHA moka. : <

Voisiko joku vielä kertoa miten saa Save, Load enginen? Eli tallennetaan muutama muuttuja talteen jotta voidaan jatkaa siitä mihin viimeksi jäätiin. =)

vehkis91 [17.10.2009 19:52:41]

#

No jos vaikka opettelisit eka tiedostojen käsittelyn(ifstream ja ofstream).

Edit: hupsista olin vahingoss kopioinut väärän esimerkin, niin oli event.nappi.nappi eikä event.button.button. :D:D

En huomannut tuota ollenkaa, mut onneks Metabolix korjas asian.

mika132 [18.10.2009 14:08:20]

#

Juu pitää lukaista. :)

Ajattelin kysäistä vielä sellaista, että miten mahtaa onnistua tiettyjen muuttujien järjestykseen laitto? Eli jos on tälläiset:

string joukkue_1="Jukkapalmu";
int =joukkue_1_pisteet=0;

string joukkue_2="Cpp on kivaa";
int =joukkue_2_pisteet=2;

Luonnollisesti nuo pisteet vaihtuva välillä, eli miten se tehdään varmaankin jotenkin taulukoilla, mutta minulla ei ole hajauakaan, että miten.

vehkis91 [18.10.2009 14:47:59]

#

Tee vaikka tietue joukkueelle, niin on helpompi käsitellä niitä.

#include <iostream>
#include <string>

const int JOUKKUEITA = 3;

struct JOUKKUE
{
   std::string nimi;
   int pisteet;
};


void selectionSort(JOUKKUE* tmp ,int pituus);


int main(int argc, char** argv)
{
   //tehdään taulukko, joka sisältää 3 joukkuetta
   JOUKKUE joukkue[JOUKKUEITA];

   //Laitetaan jokkueille tiedot
    joukkue[0].nimi = "Jukkapalmu";
    joukkue[0].pisteet = 0;

    joukkue[1].nimi = "Cpp";
    joukkue[1].pisteet = 2;

    joukkue[2].nimi = "asd";
    joukkue[2].pisteet = 1;

    std::cout<<"Joukkue[0] pisteet: "<<joukkue[0].pisteet;
    std::cout<<" Joukkue[0] nimi: "<<joukkue[0].nimi<<std::endl;
    std::cout<<"Joukkue[1] pisteet: "<<joukkue[1].pisteet;
    std::cout<<" Joukkue[1] nimi  "<<joukkue[1].nimi<<std::endl;
    std::cout<<"Joukkue[2] pisteet: "<<joukkue[2].pisteet;
    std::cout<<" Joukkue[2] nimi  "<<joukkue[2].nimi<<std::endl;
   //Järjestetään uudelleen

    std::cout<<std::endl<<"Lajitellaan..."<<std::endl<<std::endl;
    selectionSort(joukkue, JOUKKUEITA);

   //Tulostetaan tiedot uudelleen

    std::cout<<"Joukkue[0] pisteet: "<<joukkue[0].pisteet;
    std::cout<<" Joukkue[0] nimi: "<<joukkue[0].nimi<<std::endl;
    std::cout<<"Joukkue[1] pisteet: "<<joukkue[1].pisteet;
    std::cout<<" Joukkue[1] nimi  "<<joukkue[1].nimi<<std::endl;
    std::cout<<"Joukkue[2] pisteet: "<<joukkue[2].pisteet;
    std::cout<<" Joukkue[2] nimi  "<<joukkue[2].nimi<<std::endl;

    //eli kuten huomaat, nyt listan viimeisenä on eniten pisteitä saanut ja ensimmäisenä vähiten pisteitä saanut;
    std::cout<<"Eniten pisteitä sai: "<<joukkue[2].nimi<<std::endl;

    std::cin.get();

   return 0;
}

void selectionSort(JOUKKUE* tmp ,int pituus)
{
  int min;

  for (int i = 0; i < pituus - 1; i++)
  {
    min = i;
    for (int j = i+1; j < pituus; j++)
      if (tmp[j].pisteet < tmp[min].pisteet)
        min = j;

    std::swap(tmp[i], tmp[min]);
  }
}

mika132 [18.10.2009 17:19:21]

#

Ajattelin harjoitella C++ perusteita ihan perus pienellä tekstipelillä joten aloitin console application. No ongelmaksi tuli nyt se, että miten saan kuvan fullscreeniin ilman SDL:ää? :O

vehkis91 [18.10.2009 17:21:34]

#

Jos kerta teet konsolilla winukassa, niin et saa mitenkää.

aaämdee [18.10.2009 17:26:42]

#

Windowsin CMD ikkunan saa fullscreeniin painamalla ALT + ENTER

Antti Laaksonen [18.10.2009 17:42:50]

#

...ja myös ohjelma voi "painaa" näppäimiä:

#include <windows.h>

void kokoruutu(void) {
    keybd_event(0x12, 0x38, 0, 0);
    keybd_event(0x0d, 0x1c, 0, 0);
    keybd_event(0x0d, 0x1c, 2, 0);
    keybd_event(0x12, 0x38, 2, 0);
}

int main(void) {
    char viesti[] = "TERVETULOA!";
    int i;
    kokoruutu();
    Sleep(2000);
    for (i = 0; i < 11; i++) {
        printf("%c", viesti[i]);
        Sleep(200);
    }
    Sleep(5000);
    return 0;
}

mika132 [18.10.2009 18:18:46]

#

hmm... Mitenkäs sitten tällä tavalla mahdetaan tarkistaa mitä painetaan? Ei nimittäin näytä helpolta. Onko se jotenkin:

if (keybd_event(0x0D, 0x38, 0, 0))
{
    //tehdään jotain
}

E: Ja sitten miten saisi tehtyä hieman järkevän ulkoasun, jottei tekstit mene vain allekkain? Esim oikealla on valikko ja taulukko minkä jo tein vasemmalla?

vehkis91 [18.10.2009 18:21:34]

#

käsittääkseni tuo koodi, painaa nappia, eli emuloi napin painallusta.

Ja jälkimmäiseen.
pdcurses winukalle, ncurses linuxille.

Metabolix [18.10.2009 18:21:59]

#

Kumpikaan noista ei enää ole normaalia tekstiohjelman toimintaa vaan vaatii taas lisäkirjaston. Perusteita opetellessa kannattaa kuitenkin tehdä ohjelma ihan ilman ylimääräistä kikkailua, ja koodeistasi päätellen kaipaat harjoitusta ennen muuta perusteissa.

mika132 [18.10.2009 19:03:57]

#

Asensin mielestäni kirjaston oikein, mutta pelin mukaan en. :O

Kohdekansio johon GnuWin32 meni.
C:\Program Files\GnuWin32\
siellä on sitten kansiot:
include
lib
Menin visual C++ asetuksiin ja sieltä "Visual C++ directories"
sieltä "include files" ja sinne osoitteeksi
C:\Program Files\GnuWin32\include\

Sitten "lib files" ja sinne osoitteeksi
C:\Program Files\GnuWin32\lib\


Testaus ja tsadaa. Linkkeri erroreita ihan muutama:

1>ManagerHockey.obj : error LNK2019: unresolved external symbol _endwin referenced in function _main
1>ManagerHockey.obj : error LNK2019: unresolved external symbol _wgetch referenced in function _main
1>ManagerHockey.obj : error LNK2019: unresolved external symbol _start_color referenced in function _main
1>ManagerHockey.obj : error LNK2019: unresolved external symbol _curs_set referenced in function _main
1>ManagerHockey.obj : error LNK2001: unresolved external symbol __imp__SP
1>ManagerHockey.obj : error LNK2019: unresolved external symbol _raw referenced in function _main
1>ManagerHockey.obj : error LNK2001: unresolved external symbol __imp__stdscr
1>ManagerHockey.obj : error LNK2019: unresolved external symbol _initscr referenced in function _main


Sivun alkuun

Vastaus

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

Tietoa sivustosta