Nytku alotin kunnolla tän SDL:n opettelemisen, aattelin tehä ihqa oman kyselytriidin tänne ettei kovin foorumi tukkeutuisi.
Elikkä kyselen myöhempiäkin ongelmia tässä samassa aiheessa. :)
First problem:
Koodi on:
#include <SDL/SDL.h> void img(SDL_Surface *pic, SDL_Surface *screen, unsigned int x, unsigned int y) { SDL_Rect area; area.x = x; area.y = y; SDL_BlitSurface(pic, NULL, screen, &area); } int main() { if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); return 0; } int mouse_x, mouse_y; SDL_GetMouseState(&mouse_x, &mouse_y); SDL_Surface *screen; screen = SDL_SetVideoMode(1000, 800, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); SDL_Surface *pic; pic = SDL_LoadBMP("grass.bmp"); img(pic, screen, 0, 0); // img(pic, screen, 0, 20); SDL_Flip(screen); SDL_FreeSurface(pic); SDL_Delay(6969); SDL_Quit(); return 0; }
Ja errori tällainen:
/usr/bin/ld: cannot open output file ankriot: Is a directory collect2: ld:n paluuarvo oli 1
Olen tässä säätänyt tota SDL:än ekaa koodia vähän parempaan suuntaan, ja ajattelin tässä pienen minimapin tehdä.
Elikkä pitäisi tuo grass.bmp näyttää monta kertaa,
mutta errori ei ainakaan siitä johdu.
Kertokaas te viisaammat mikä tuossa mättää :S
Edit: Älkää välittäkö tuosta hiirijutusta. Tein sen tulevaisuutta varten. :D
Kuten näet, kyseessä ei ole koodista tuleva virhe (ei lue tiedostoa eikä rivinumeroa) vaan linkitysvirhe (ohjelma ld on linkkeri). Virheenä on, että olet käännöskomennossasi määrännyt ohjelman nimeksi "ankriot" mutta sinulla on jo hakemisto "ankriot", joten tiedostoa ei voi luoda.
Metabolix kirjoitti:
Kuten näet, kyseessä ei ole koodista tuleva virhe (ei lue tiedostoa eikä rivinumeroa) vaan linkitysvirhe (ohjelma ld on linkkeri). Virheenä on, että olet käännöskomennossasi määrännyt ohjelman nimeksi "ankriot" mutta sinulla on jo hakemisto "ankriot", joten tiedostoa ei voi luoda.
Kiitos, Metabolix! :D Taas pelastit päiväni.
Ite en älynny tosta virheilmoituksesta mitään. :/
Terppa taas.
Nyt tulin tämmöstä uteleen että tämä järjestys:
// Kopio SDL-oppaasta SDL_Surface *naytto; SDL_Surface *kuva; naytto = SDL_SetVideoMode(1024, 768, 30, SDL_HWSURFACE|SDL_DOUBLEBUF); kuva=SDL_LoadBMP("kuva.bmp");
Että pitääkö tuo järjestys olla juuri tuo?
Että haittaako jos menee tällee:
SDL_Surface *naytto; naytto = SDL_SetVideoMode(1024, 768, 30, SDL_HWSURFACE|SDL_DOUBLEBUF); SDL_Surface *kuva; kuva=SDL_LoadBMP("kuva.bmp");
Ku jostai syystä kuvat ei tuu näytölle ja on vähän hankalaa metsästää vikaa ku en tiedä oikein tarkkaan noita funktioiden merkityksiä.
Tämä saattaa kuullostaa sekolta, että tällä tapaa harjoittelen,
mutta ei sitä opi mitään jos vain opasta lukee. >:P
Kyllä ne merkitykset kerrotaan aika hyvin SDL-oppaassa. Tuossahan et ole edes vaihtanut funktioiden järjestystä vaan siirtänyt vain muuttujan määrittelyn eri kohtaan; siitä taas kerrotaan C++-oppaassa eikä se vaikuta ohjelman toimintaan (paitsi jos siirrät sen niin, ettei koko ohjelma käänny).
Merkitykset:
- SDL_Init: käynnistää SDL:n; aina ensimmäisenä.
- SDL_SetVideoMode: avaa ikkunan; aina ennen muita ikkunaan liittyviä asioita.
- SDL_LoadBMP: lataa BMP-kuvan; pakollinen ennen piirtämistä. :D
- SDL_BlitSurface: piirtää yhden kuvan toiseen kuvaan (ikkunakin on kuva).
- SDL_Flip: flippaa ikkunan puskurit, ks. selitys alempana.
- SDL_FreeSurface: tuhoaa ladatun kuvan; käytä, kun et tarvitse kuvaa enää (viimeistään ohjelman lopussa).
- SDL_Quit: sulkee SDL:n; aina ohjelman lopussa.
Käytännössä noiden funktioiden pitäisi olla suunnilleen tuossa järjestyksessä. Ensimmäiset tulevat pelin alkuun (kerran), viimeiset loppuun (kerran) ja keskeltä blittaus ja flippaus taas pelisilmukkaan: ensin blittaillaan kuvia ja lopuksi flipataan ruutu.
Kun kaksoispuskurointi on käytössä (SDL_DOUBLEBUF, kuten koodista näet), ikkuna on kuin kaksipuoleinen paperi: yksi puoli on esillä ja toiselle puolelle piirretään. SDL_Flip kääntää paperin ympäri, eli äsken piirretty puoli tulee näkyviin ja toisin päin. Muista aina kumittaa paperi tyhjäksi ennen piirtämistä (SDL_FillRect(ruutu, 0, 0)
), ettei vanha kuva jää taustalle kummittelemaan. Toinen vaihtoehto on piirtää koko kuva uusiksi reunoja myöten, kuten peleissä yleensä käy (esim. piirretään taustakuva tai tason lattia tms.).
Ok, kiitos Metabolix. :D
Sain toimimaa ku hoksasin että olin taas mämmänny tuon terminaali cd:n kaa.
Nytte seuraava jutskapuppeli:
-Kuinka piirtää 2 kuvaa päällekkäin, kun päällimmäinen kuva on osittain läpinäkyvä?
Tämä saattaisi selvitä oppaastakin, mutten ole _vielä_ joutanut sitä kokonaan lukemaan sanasta sanaan.
Mut oon kuitenki tekemässä ylhäältäpäin kuvattua harjottelupeliä ja mulla on 2 kuvaa:
-grass.bmp, joka on kokonaan virheä
-player.bmp, jonka tein gimpillä ja siinä on keskellä musta piste mutta muuten läpinäkyvä.
BMP-kuvassa ei ole itsessään läpinäkyvyyttä, mutta jos värität läpinäkyvät alueet jollain värillä (usein esim. kirkkain pinkki), voit määrätä SDL:n jättämään sen värin kuvasta piirtämättä. Oikea funktio on SDL_SetColorKey, haulla löytyy varmaan esimerkkejä. Itse piirto tapahtuu tuon jälkeen ihan samalla tavalla kuin ennenkin.
Ai :o
Joo kiitos, tota en tiennykkää. (Taas)
Pitää kattoa voiko tällä vehkeellä näyttää .png kuvia, mutta muuten pitää ottaa tuo SDL_SetColorKey mukaan.
Kiitos jälleen, Metabolix! :D
Et arvaakkaa miten kiitollinen oon että joku viittii oikeasti jelppiä tunaria aloittelijaa. :D
Edit: Löytyi: https://www.ohjelmointiputka.net/keskustelu/
Joo taas probleemaa pukkaa.
Nyt ei erroria tule, mutta viritykset ei vain toimi.
Elikkä yritin tehdä sellaisen, että pelini loppuu kun painetaan esciä.
Pelin piirto tapahtuu while(1):llä.
Mutta miten teen sen, että esciä painamalla tämä ohjelma loppuu?
Koodi:
while(1) { SDL_Event events; Uint8* buttons; buttons = SDL_GetKeyState(NULL); if(buttons[SDLK_ESCAPE]) { SDL_Quit(); return 0; } }
Silmukassa täytyy olla SDL_PumpEvents(), jotta jonossa olevat näppäimenpainallukset käsiteltäisiin.
Metabolix kirjoitti:
Silmukassa täytyy olla SDL_PumpEvents(), jotta jonossa olevat näppäimenpainallukset käsiteltäisiin.
Oho, niin pitikin :D
Kiitos, Metabolix. Se oli kyllä tuolla koodissa mutta epähuomiossani poistunut. :D
Edit: Jee, nyt sain toimimaan ohjelman lopetuksen, mutta ei reagoi nuolinäppäimiin. Pitää tsekkailla viel :P
Hmm... Mikähän tässä nyt on?
En saa nuolinäppäimiä toimimaan:
#include <SDL/SDL.h> void img(SDL_Surface *pic, SDL_Surface *screen, unsigned int x, unsigned int y) { SDL_Rect area; area.x = x; area.y = y; SDL_BlitSurface(pic, NULL, screen, &area); } int main() { if(SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); return 0; } // int mouse_x, mouse_y; // SDL_GetMouseState(&mouse_x, &mouse_y); SDL_Surface *screen; screen = SDL_SetVideoMode(1000, 800, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF); unsigned int map_x = 0; unsigned int map_y = 0; unsigned int x = 0; unsigned int y = 0; while(1) { SDL_Event events; SDL_PollEvent(&events); Uint8* buttons; buttons = SDL_GetKeyState(NULL); if(buttons[SDLK_LEFT] && map_x >= 20) x = x - 20; else if(buttons[SDLK_UP] && map_y >= 20) y = y - 20; else if(buttons[SDLK_RIGHT] && map_x <= 980) x = x + 20; else if(buttons[SDLK_DOWN] && map_y <= 780) y = y + 20; SDL_Surface *grass; grass = SDL_LoadBMP("grass.bmp"); while(map_y <= 800) { while(map_x <= 1000) { img(grass, screen, map_x, map_y); if(x == map_x && y == map_y) { SDL_Surface *player; player = SDL_LoadBMP("player.bmp"); img(player, screen, map_x, map_y); SDL_FreeSurface(player); } map_x = map_x + 20; } map_x = 0; map_y = map_y + 20; } SDL_FreeSurface(grass); SDL_Flip(screen); if(buttons[SDLK_ESCAPE]) { SDL_Quit(); return 0; } } }
Nuolinäppäintarkistuksissasi pitäisi map_x:n ja map_y:n sijaan olla tietenkin x ja y. Lisäksi voisit poistaa muuttujat map_x ja map_y muualta koodista ja käyttää niitä vain piirtovaiheessa. Et tarvitse niitä muualla, ja tällä tavalla olisit välttänyt tuonkin virheen, kun muuttujat esiintyisivät vain siinä, missä niitä käytetään:
// KAIKKI aiemmat map_x- ja map_y-rivit pois! for (int map_x = 0; map_x < 1000; map_x += 20) { for (int map_y = 0; map_y < 800; map_y += 20) { ... } }
Ota "SDL_Event eventti" pois ja korvaa SDL_PollEvent-funktio SDL_PumpEvents-funktiolla, joka ei tarvitse parametria. Nykyinen tapasi on aivan väärä: SDL_PollEvent hakee jonosta tasan yhden viestin, vaikka niitä usein (esimerkiksi hiirtä liikuttaessa) ehtii tulla suuri määrä. Et (onneksi) käytä sitä (jo vanhentunutta) viestiä mihinkään, joten voit aivan hyvin jättää viestit hakematta. SDL_PumpEvents hoitaa kaikki jonossa olevat viestit pois alta.
Metabolix kirjoitti:
Ota "SDL_Event eventti" pois ja korvaa SDL_PollEvent-funktio SDL_PumpEvents-funktiolla, joka ei tarvitse parametria.
Näin tein, näin Linux vastasi:
virhe: öeventsö on esittelemättä tällä näkyvyysalueella
Kiitos, Metabolix, noi x, y, map_x ja map_y jutut olivat iso huolimattomuusvirhe. :D
Kiitos että jaksat auttaa. :)
Ja tosiaan... 100% aloittelijana en oikeen tarkkaa tiedä tätä SDL-syntaksia vielä ja funkkarit hakusessa. :)
Manuskat ollu kovassa käytössä, tsekkaillaan viel..
Edit: Tarkemmin sanottuna en ymmärrä, miksi tällainen rivi pitää olla:
SDL_PumpEvents(&events);
koska eihän tuota eventsiä koskaan käytetä mihinkään?
Lue tarkemmin: ... joka ei tarvitse parametria. Ota siis myös &events pois sieltä suluista. Yksi homman pointti tässä olikin juuri, kuten itse sanoit, että otetaan se events pois, kun sitä ei tarvita.
Kannattaa muuten x ja y korvata jollain pelaaja-alkuisella.
struct pelaajan_tiedot { int x, y; int elama; }; // ... pelaajan_tiedot pelaaja; pelaaja.x = 10;
(C++-opas, osa 4, tietueet.)
Metabolix kirjoitti:
Lue tarkemmin: ... joka ei tarvitse parametria. Ota siis myös &events pois sieltä suluista. Yksi homman pointti tässä olikin juuri, kuten itse sanoit, että otetaan se events pois, kun sitä ei tarvita.
Kannattaa muuten x ja y korvata jollain pelaaja-alkuisella.
struct pelaajan_tiedot { int x, y; int elama; }; // ... pelaajan_tiedot pelaaja; pelaaja.x = 10;(C++-opas, osa 4, tietueet.)
Oho, hehe :D Sry.
Kiitos, Metabolix. Totta puhuen en ole läpi lukenut tuota C++ opasta, vaan SDL-puolelta vain. :/
Pitäisi kai tuohonkin oppaaseen kovemmin tutustua.
Edit: Nyt tulee niin urpo kysymys, mutta varmistan vain.
Voihan näin laittaa:
unsigned int x, y = 0;
? :D
Voi, mutta ei tietueen sisään. Ja tuossahan x jää alustamatta, kun nolla sijoitetaan vain y:hyn.
Metabolix kirjoitti:
Voi, mutta ei tietueen sisään. Ja tuossahan x jää alustamatta, kun nolla sijoitetaan vain y:hyn.
Mutta, jos alustaa muuttujan intiksi, niin eikös se automaattisesti ole 0? Tuossa tapauksessa x = 0 ja y = 0.
Metabolix kirjoitti:
Voi, mutta ei tietueen sisään. Ja tuossahan x jää alustamatta, kun nolla sijoitetaan vain y:hyn.
Ok, eli ei voi. :D -Kiitos jälleen.
Nyt tämmönen pikakyssäri tästä for():ista:
for(unsigned int map_y = 0; map_y <= 800; map_y += 20)
Eli kun ylläoleva for suoritetaan ensimmäisen kerran, onko map_y 0 vai 20?
Macro kirjoitti:
Mutta, jos alustaa muuttujan intiksi, niin eikös se automaattisesti ole 0?
Elinajaltaan staattiset ovat. (Staattinen muuttuja on olemassa ohjelman alusta loppuun.) Muut taas eivät ole.
// Globaalit muuttujat ovat staattisia. int x; // int x = 0; void funktio() { // Tavallinen paikallinen muuttuja ei ole staattinen. int y; // int y = mitä sattuu. // Muuttujan voi määritellä staattiseksi, jolloin muuttujan arvo säilyy // funktiokutsujen välilläkin, aivan kuten globaalien muuttujien. static int z; // static int z = 0; }
ankzilla: 0, kuten olisit helposti voinut kokeilemalla todeta.
Nämä koodit vastaavat täsmälleen toisiaan:
for (A; B; C) { D; } { A; while (B) { D; C; } }
Ylimääräiset sulut whilen ympärillä ovat tarpeen, jotta A-rivillä määritellyt muuttujat (kuten map_y) eivät näy enää while-silmukan jälkeen.
Ok :o
Hyviä uutisia: Sain pelin ohjauksen ja lopetuksen toimimaan kuin unelma! :D
Enää vain itse pelin tehtävät jne, sitten laitan sen tänne putkaan! :D
Kiitos avusta, Metabolix. :)
Nyt se myrkyn lykkäsi.
Koodia rivistä 125 lähtien:
if(x != map_x || y != map_y) { if(map_y == bike_y + 20 && map_x != bike_x) img(grass, screen, map_x, map_y); if(map_x == bike_x + 20 && map_y != bike_y) img(grass, screen, map_x, map_y); }
Errorit:
ankzilla@AnkkaPC:~/ankriot$ g++ /home/ankzilla/ankriot/source.cpp -o index -lSDL /home/ankzilla/ankriot/source.cpp:125: virhe: odottamaton ö\302ö ohjelmassa /home/ankzilla/ankriot/source.cpp:125: virhe: odottamaton ö\240ö ohjelmassa
Sinänsä tämä saattaisi olla helppo ratkaista, mutten älyä erroreista taaskaan mitään. :S
Nanolla koodatessa tuo on käynyt itsellenikin. Syytä en tiedä.
Yleensä kun noin käy, poistan vaan ko. rivin (esim. ctrl + K) ja kirjoitan uudestaan :)
Varmaan viisaampikin tapa olemassa...
Todella rassaava virhe: Alt Gr + Space -> U00A8 (no-break space). Olet siis pitänyt Alt Gr -nappulaa vahingossa liian kauan pohjassa, jolloin editori laittaa ||:n jälkeen tavallisen välilyönnin sijaan UTF-8-koodatun U00A8-merkin, joka näyttää editorissa täsmälleen samalta, mutta ei toimi koodissa. Jee.
Kumita siis kyseinen välilyönti ja kirjoita tilalle tavallinen.
Jotkin editorit osaavat näyttää virheen suoraan.
Oho :D
Kiitos oikeasti tästä, en olisi millään voinut tuota tietää. :D
Nyt sain skriptini toimimaan. :)
Edit: Kokeilkaa: http://82.128.207.9/ankriot.zip
Terppa taas.
Nyt en ole Ankriotin parissa, tai mitään muutakaan tärkeää ohjelmaa tekemässä. Kunhan testailen.
Eli tarkoituksenani on tehdä ohjelma, joka loppuu kun hiiri siirretään koordinaattien 500 yläpuolelle.
Mielestäni SDL-oppaassa hiiri-kohta oli hivenen epäselvä, enkä saanut siitä kaikkea sanomaa irti kokemattomana.
Noh, koodia tulee. Sanokaas ainaki pahimmat emämunaukset:
-Oops.. Noh, nyt hoksasin että en ollut alustanut SDL:ään. Mutta kertokaas miten se tehdään tässä tapauksessa?
#include <SDL/SDL.h> int main() { unsigned int coord, x, y; bool quit = 0; while(!quit) { SDL_PumpEvents(); coord = SDL_GetMouseState(&x, &y); if(x < 500 && y < 500) { quit = true; } } SDL_Quit(); return 0; }
Edit: Hmm.. Kummallisin errori on tässä:
virhe: virheellinen muunnos tyypistä öunsigned int*ö tyypiksi öint*ö
No SDL_GetMouseState ottaa parametrikseen kaksi int* ja noi sun x ja y on määritelty unsigned int.
Sitten mun mielestä on hassua kun oot laittanut booliksi 0 (eikä false) mutta kuitenkin toisaalta käytät true.
Eikös 0 ja false oo synonyymejä?
Ja kokeilin jo ottaa tota unsignediä pois, ei tapahtunu mitää.
Edit: Mitäs vittua? :D Anteeksi, nyt oon sekoillu jotai tallennuksen kaa.
Elikkä menihän tuo kääntäjästä läpi kun unsignedin otin toistamiseen pois.
Kiitos, Grez.
Edit: BTW, mitä varten toi coord on tolla? meinaa tuo funktio ei palauta koordinaatteja. Jos painaa jotain nappia, niin tuo funktio palauttaa sen napin numeron. tais olla näin: vasen nappi = 0, rulla = 1, oikea nappi = 2.
#include <SDL/SDL.h> int main() { SDL_Init(SDL_INIT_VIDEO); int coord, x, y; bool quit = false; while(!quit) { SDL_PumpEvents(); coord = SDL_GetMouseState(&x, &y); if(y < 500) { quit = true; } } SDL_Quit(); return 0; }
Joo, alkoi toimimaan ku otin tuon unsignedin pois.
Joko mulla on tosi paska muisti tai klikkasin tallennusnapin ohi,
mut alkoi toimimaan kun unsignedin poistin. Se on vain jokin tapa käyttää sitä aina.
ankzilla kirjoitti:
Eikös 0 ja false oo synonyymejä?
Joo ja 1 ja true on synonyymejä. Totesin vaan että tuntuu kummalta että falsesta käytät 0 mutta 1:stä true.
Grez kirjoitti:
ankzilla kirjoitti:
Eikös 0 ja false oo synonyymejä?
Joo ja 1 ja true on synonyymejä. Totesin vaan että tuntuu kummalta että falsesta käytät 0 mutta 1:stä true.
Niin joo... Yleensä oon sillee järjestelmällinen et koodaan kaiken huolella, ja esim tuommosissa käytän ykkösiä ja nollia.
Nyt kokeilujutussa vain varmuuden vuoksi tuohon booliin laitoin true 1:n sijasta. :)
Edit: Voisko joku ajan kuluksi kertoa, mitenkä SDL:llä tulostetaan tekstiä näytölle?
Esim TTF_RenderText_Solid
Hanki lisäkirjasto, kuten paljon puhuttu SDL_ttf, tai koodaa itse bittikarttoja lukeva kirjoitusfunktio. Ei ole hankala homma, jos tuntee perusasiat. Kaikkein inhottavin homma on tehdä oma fontti. :<
tgunner kirjoitti:
Hanki lisäkirjasto, kuten paljon puhuttu SDL_ttf, tai koodaa itse bittikarttoja lukeva kirjoitusfunktio. Ei ole hankala homma, jos tuntee perusasiat. Kaikkein inhottavin homma on tehdä oma fontti. :<
Hei mutta tuohan oli tosi hyvä idea! :D
Kiitos, tgunner! Teen oikein verisen ja sotaisen fontin :D
Edit: Kymysys viel: Onko C++:ssa funktiota, kuin PHP:ssä str_replace?
On, mutta toimii eritavalla.
Macro kirjoittikin oman funktionsa tätä tulostusta varten.
1 ja true ja 0 ja false eivät ole synonyymeja. Monissa tapauksissa molemmat toimivat, mutta eron voi todeta näinkin helposti:
#include <iostream> // Funktiosta on kaksi versiota, joten kääntäjä valitsee niistä sopivimman. void tyyppi(int x) { std::cout << "int" << std::endl; } void tyyppi(bool x) { std::cout << "bool" << std::endl; } int main() { tyyppi(1); // int tyyppi(true); // bool }
Tyypinmuunnosten yhteydessä kaikissa perustietotyypeissä nolla muuttuu falseksi ja muut arvot trueksi. Vastaavasti false muuttuu nollaksi ja true ykköseksi. Niitä voi pitää suunnilleen samassa määrin synonyymeina kuin float-ykköstä ja int-ykköstä.
Hoo, kiitos MIB.
Itse asiassa kun katselin noita skriptejä, hoksasinkin aina minua kiusanneen kysymykseen ratkaisun:
-Kuinka asettaa muuttujan arvoksi tekstiä?
Noh, stringin includettemallahan se onnistuu! :D
Nyt voinen alkaa koodaamaan uutta vakavammin otettavaa peliä: Ankowaria!
Ajattelin tehdä paskagrafiikkaisen fps-pelin harjoittelumielessä.
Sinänsä on hyvä, että näillä taidoilla en osaisi sellaista tehdä, mitä olen tekemässä. :D
(Järkeä, eikö?)
Mielestäni asetin sopivan riman itselleni, että nyt on tavallaan "pakko" opetella lisää SDL:n käyttöä, koska projekteja ei yleensäkkään tule kesken heitettyä.
(Mitä nyt pari floppia, mut suunnillee)
;)
Et pelkällä SDL:lä voi 3d:tä koodata... Sun pitää ottaa OpenGL mukaan, että tuo onnistuu.
Miten niin ei voi? Toki järkevämpää varmaan pistää homma näyttiksen huoleksi.
Voi tai ei, tuon pelin jälkeen ei kannata 3D-linjalle lähteä alkuunkaan. Aivan ensiksi kannattaa koodata edes 2-ulotteinen peli niin, että siinä on tiedostosta ladattava, ruutua isompi pelikenttä, josta piirretään aina vain näkyvä osa. Lisäksi ruudun koko pitäisi voida asettaa asetustiedostossa, eli mitään "x <= 1200"-kohtia ei pitäisi koodissa olla.
Tää on harjoittelua, elikkä teen teen tän 1200x800 resolle.
Tierän, että tämä pitäisi voida säätää, kuten kaikissa muissa peleissä, mutta nyt vain koitan saada jonkinlaista AK-47:aa tohon :DDD
Edit: Tulee muutes siistejä kuvia ku googlettaa "OpenGL" :D
Edit2: Onkos SDL:ssä mitään simppeliä ruuduntyhjennysfunkkaria?
Ku nuo vanhat kuvat jää kummittelemaan tohon tyhjälle taustalle :D
SDL_FillRect(ruutu, 0, 0);
Tietenkin toimii. Se vain piirtää väritetyn laatikon, aivan kuten SDL_BlitSurface piirtää kuvan. Tässä tapauksessa väri on musta ja laatikko käsittää koko ruudun.
Metabolix kirjoitti:
Tietenkin toimii. Se vain piirtää väritetyn laatikon, aivan kuten SDL_BlitSurface piirtää kuvan. Tässä tapauksessa väri on musta ja laatikko käsittää koko ruudun.
Ok, kiitos. :) (Ei näitä voi entuudestaan tietää =D)
Edit: Tämmöstä kyssäriä vielä, että mites tuo hiiren piilotus onnistuu?
-Tai silleen että se korvattaisiin tilapäisesti toisella kuvalla?
vehkis91 kirjoitti:
Et pelkällä SDL:lä voi 3d:tä koodata... Sun pitää ottaa OpenGL mukaan, että tuo onnistuu.
Hmm...
Mitä nyt olen pari iltaa tässä koodaillut menemään, niin sain ihan kivan näkymän tähän peliin.
Tosin liikkumista tms. ei vielä ole.
Mut mun mielestä tää on suhteellisen helppo tehdä ilman OpenGL:ää.
Olisiko mitään todennäköisyyksiä mihin voisin törmätä 3d-maailmaa tehdessäni SDL:llä?
Jos tarkoitat 3d-maailmalla oikeasti renderöityä 3d:tä, jossa siis hahmot ovat kaukana pienempiä kuin lähellä ja voi vapaasti kääntää katsetta ylös, alas ja sivuille, törmäät moneenkin matemaattiseen kysymykseen. Huomaat ne varmasti itse, tai jos et huomaa, pelistäsi tulee grafiikaltaan aika säälittävä (tai olet nero :D).
Jos tarkoitat isometrista grafiikkaa, jota käytetään monissa vanhoissakin peleissä, niin se ei ole teknisesti 3d-grafiikkaa vaan aivan tavallisia 2d-kuvia, jotka graafikko on piirtänyt hienosti ja jotka asetellaan näytölle oikeassa järjestyksessä niin, että ensin piirretään maa ylhäältä alas, sitten maassa olevat hahmot ylhäältä alas ja lopuksi lentävät hahmot ylhäältä alas.
Viitsisitkö laittaa screenshottia, että minkänäköistä oot saanut aikaan?
Hiiren piilotus:
SDL_ShowCursor(0);
Sitten vain pääsilmukassa haet hiiren koordinaatit ja piirrät kuvan hiiren kohtaan.
vehkis91: En nyt vielä screenshottia kehtaa laittaa, mutta kiitos funktiosta! :)
Metabolix: Muuten kyllä, mutta ylös ja alas ei voi katsoa. :D
Tästä tulee fps peli.
Ja toivotaan että olen nero :DD
Puuttuu =-merkki. Lukisit C++-oppaita, niin osaisit tuollaiset perusasiat. Tuo ei ole kovin hyvä lähtökohta 3d-pelin tekemiselle.
Metabolix kirjoitti:
Puuttuu =-merkki. Lukisit C++-oppaita, niin osaisit tuollaiset perusasiat. Tuo ei ole kovin hyvä lähtökohta 3d-pelin tekemiselle.
Ai vitsi.. Ei ollut tuo kysymys puol minuuttia. :D
Oli pelkkä huolimattomuusvirhe, anteeksi.
Edit: Heh, evokysymys taas:
-Miten kopioidaan taulukko muuttujasta toiseen?
Loopissa.
ankzilla kirjoitti:
Ai vitsi.. Ei ollut tuo kysymys puol minuuttia. :D
Eli et vaivaudu paneutumaan ongelmaan puolta minuuttia ennen kysymyksen lähettämistä tänne?
ankzilla kirjoitti:
-Miten kopioidaan taulukko muuttujasta toiseen?
memcpy:llä.
Blaze kirjoitti:
Eli et vaivaudu paneutumaan ongelmaan puolta minuuttia ennen kysymyksen lähettämistä tänne?
ankzilla kirjoitti:
Oli pelkkä huolimattomuusvirhe, anteeksi.
Ei sitä koko aikaa voi olla skarppina.
Blaze kirjoitti:
memcpy:llä.
Elikkäs ei ole mitään suoraa taktiikkaa tähän?
Onneksi tällä kertaa taulukko on yksinkertainen, ja tein tällaisen:
int sky[] = {0, 0, 1200, 800}; int sky_copy[4] = {sky[0], sky[1], sky[2], sky[3]};
Mut pitääpä Googletella tuotakin. :)
Huomaathan, että taulukoita ei kopioida "muuttujasta toiseen", vaan muuttujassa säilytetään ainoastaan osoitetta sen taulukon sisältävän muistialueen alkuun.
memcpylla tuo kopiointi onnistuu jokseenkin niin suoraan kuin C:llä on mahdollista: http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
hunajavohveli kirjoitti:
Huomaathan, että taulukoita ei kopioida "muuttujasta toiseen", vaan muuttujassa säilytetään ainoastaan osoitetta sen taulukon sisältävän muistialueen alkuun.
Ok, mutta tuossa mun tän hetkisessä koodissa:
Kun sky[0]:aa muutetaan, eihän sky_copy[0] muutu?
C++ sisältää turvallisemman tavan: copy.
#include <algorithm> const int maara = 4; int lahde[maara], kohde[maara]; int main() { std::copy(lahde, lahde + maara, kohde); }
Tämän copy-mallifunktion etu memcpy-funktioon nähden on, että lähde- ja kohdetaulukkojen ei välttämättä tarvitse olla samaa tyyppiä, vaan esimerkiksi kopiointi int-taulukosta float-taulukkoon tuottaa mielekkään lopputuloksen.
Viimeinen kysymyksesi on siinä määrin typerä, että ei voi sanoa kuin kaksi asiaa:
1. Kokeile.
2. Lue C++-oppaasta.
Metabolix kirjoitti:
Tämän copy-mallifunktion etu memcpy-funktioon nähden on, että lähde- ja kohdetaulukkojen ei välttämättä tarvitse olla samaa tyyppiä, vaan esimerkiksi kopiointi int-taulukosta float-taulukkoon tuottaa mielekkään lopputuloksen.
Viimeinen kysymyksesi on siinä määrin typerä, että ei voi sanoa kuin kaksi asiaa:
1. Kokeile.
2. Lue C++-oppaasta.
Kiitos, Metabolix. :)/:S
Mutta tota noin... (Yllättäen) Nämä mun tekstuurisähellykset eivät alkaneet toimimaan.
Koodi on tällanen:
_1 = alku x
_2 = alky y
_3 = loppu x
_4 = loppu y
copy = sky_2; for(sky_2; sky_2 <= sky_4; sky_2 += 25) { copyb = sky_1; for(sky_1; sky_1 <= sky_3; sky_1 += 25) image(texture_sky, screen, sky_3, sky_2); sky_1 = copyb; } sky_2 = copy; copy = wall_2; for(wall_2; wall_2 <= wall_4; wall_2 += 25) { copyb = wall_1; for(wall_1; wall_1 <= wall_3; wall_1 += 25) image(texture_wall, screen, wall_3, wall_2); wall_1 = copyb; } wall_2 = copy; copy = floor_2; for(floor_2; floor_2 <= floor_4; floor_2 += 25) { copyb = floor_1; for(floor_1; floor_1 <= floor_3; floor_1 += 25) image(texture_floor, screen, floor_3, floor_2); floor_1 = copyb; } floor_2 = copy;
Elikkä näin alussa olen olettanut, että näkyy 1 seinä, 1 lattia ja 1 taivas.
Noh, muuten ihan jees mutta kun näkyy vain mustaa xD
Mikä voisi olla vikana?
Koodisi on aivan järjettömän sekavaa, ja tästä ei myöskään voi (muuttujien arvoja tietämättä) lainkaan sanoa, mikä voisi olla vikana. Itse sanoisin, että kun koodi on noin rumaa, siinä on varmasti kaikki muukin vikana.
Miksi käytät noin sekavasti muuttujia? Etkö oppinut aiemmasta keskustelusta mitään?
for (int y = alaraja; y < ylaraja; y += muutos) { for (int x = alaraja; x < ylaraja; x += muutos) { image(...); } }
Näin et tarvitse yhtäkään ylimääräistä muuttujan säilöntää tai kopiointia tai mitä nuo koodissasi ovatkaan.
Yksi "vika" koodissasi voisi olla se, että piirrät kuvan kohtaan sky_3 (esim.) etkä sky_1. Tällaisetkin virheet olisi ehkä helpompi välttää, jos tekisit tuon minun mallini mukaan.
Metabolix kirjoitti:
Yksi "vika" koodissasi voisi olla se, että piirrät kuvan kohtaan sky_3 (esim.) etkä sky_1. Tällaisetkin virheet olisi ehkä helpompi välttää, jos tekisit tuon minun mallini mukaan.
Ai perkele niin oonki. :o
Ei pitäs näköjään koskaan iltamyöhällä koodauksia tehä, en kyl älyä miks oon tuollasta laittanu.
Sori :S
Mut kuitenki...
Elikkä tuossa koodissa on aikaisemmin määritelty nuo muuttujat, mutta ne silti laitetaan takaisin alkuperäiseen arvoonsa myöhempää käyttöä varten.
Tuo on siis se mun monimutkainen teksuurunpiirtäjä, eikä omasta mielestäni ole kauhean sekavaa?
Mutta testasin tosiaan eilen, niin kaikki muuttujat toimivat, ja ne ovat arvoja 0-1200 tai 0-800.
Ai perskele tosiaan, en hoksannutkaan tuollaista.. :D
Koodasin ennen aika paljon PHP:llä, enkä koskaan käyttänyt foria, vaan whileä.
Tästä johtuen en ole välttämättä noita järkeviä niksejä hoksannut. :D
Edit: Kiitos, Metabolix. Nyt sain toimimaan kun korjasin huolimattomuusvirheeni. :)
Uskokaa tai älkää, mun fps sähellys ilman OpenGL:ää käyttäen tulee olemaan ihan pelattavaa. ;)
Mut nyt pitäisi vain miettiä, että miten näissä muissa fps peleissä tehdään tämä, että hiiri pysyy koko ajan keskellä, mutta kun sitä liikuttaa niin asteet muuttuvat.
Kysypä keneltä tahansa täällä, niin saat saman vastauksen siihen, kumpi on sekavampi.
copy = sky_2; for(sky_2; sky_2 <= sky_4; sky_2 += 25) { copyb = sky_1; for(sky_1; sky_1 <= sky_3; sky_1 += 25) image(texture_sky, screen, sky_3, sky_2); sky_1 = copyb; } sky_2 = copy;
Kun tietää, mitä koodi tekee, onnistuu ymmärtämään sen. Kun ei tiedä, joutuu ensin tutkimaan sitä sen hetken, että pääsee hommasta jyvälle. Miksi for-silmukan aloituksena on "sky_2;", joka ei siis edes tee mitään? Mitä ovat sky_1–sky_4? Miksi korotus on juuri 25?
Korjattu versio:
for (int y = sky_y0; y < sky_y1; y += sky_texture->h) { for (int x = sky_x0; x < sky_x1; x += sky_texture->w) { image(sky_texture, screen, x, y); } }
Ahaa, tässä käydään läpi muuttujilla x ja y jonkinlainen sky-alue läpi kohdasta (x0, y0) kohtaan (x1, y1) ja piirretään joka kohtaan sky_texture. Muuttujien korotuskin tehdään tekstuurin koon mukaan, niin on selvää, että kuvat tulevat piirrettyä vierekkäin eikä jää rakoja tai mene päällekkäin.
Muuttujien nimiin ja koodin selkeyteen kannattaa ehdottomasti panostaa. Siitä on hyötyä kahdessa asiassa: ymmärrät koodiasi paremmin sitten puolen vuoden kuluttua, kun et muista sitä enää, ja lisäksi muiltakin saa paremmin apua, kun koodista saa jotain selvää. Jos olisit kirjoittanut tuonkin koodin siististi, moni aivan itsesi tasoinen aloittelija olisi helposti löytänyt virheen.
ankzilla kirjoitti:
Mut nyt pitäisi vain miettiä, että miten näissä muissa fps peleissä tehdään tämä, että hiiri pysyy koko ajan keskellä, mutta kun sitä liikuttaa niin asteet muuttuvat.
Onnistuu niin, että laitat ohjelmasi "kaappaamaan" hiiren, jolloin hiiri on "vangittuna" ohjelmasi sisälle, eli se ei pääse ikkunoidussakaan tilassa pois ohjelmasi käytöstä. Sitten luet aina joka kierroksella hiiren suhteellisen muutoksen ja sen mukaan sitten lisäilet niitä kulmia.
// Alustukseen SDL_WM_GrabInput(SDL_GRAB_ON); while (peli) { int delta_x, delta_y; Uint8 hiiri = SDL_GetRelativeMouseState(&delta_x, &delta_y); // sitten esim. kulma += herkkyys * delta_x; }
Metabolix kirjoitti:
Mitä ovat sky_1–sky_4? Miksi korotus on juuri 25?
ankzilla kirjoitti:
Koodi on tällanen:
_1 = alku x
_2 = alky y
_3 = loppu x
_4 = loppu y
Ja korotus on juuri 25px, koska tekstuurin koko on 25x25px.
Myöhemmin ajattelin SDL:llä pienentää kuvaa, mitä kauempana se on.
Metabolix kirjoitti:
Korjattu versio:
for (int y = sky_y0; y < sky_y1; y += sky_texture->h) { for (int x = sky_x0; x < sky_x1; x += sky_texture->w) { image(sky_texture, screen, x, y); } }
En nyt mitenkään epäkohtelias haluaisi olla, ja arvostan apuasi, mutta...
Aloittelijana en voi esimerkiksi tietää mitä tuo sky_texture->h tarkoittaa, koska minun ei ole koskaan tarvinnut tuota nuolta käyttää.
(En ihan oikeasti tiedä mitä tämä tekee, vielä.)
Ja on itsestään selvää, että luen niitä oppaita,
mutta ei ole mitenkään mahdollista, että kaiken lukemani tiedon lukemalla sisäistäisin. Sitä pitää kokeilla.
Näin ollen... Kun teen peliäni, ja jokin asia tyssää, luen opasta tai kysyn täältä.
Kuin tässä tapauksessa kyse oli huolimattomuusvirheestä, päätin teidän puoleen kääntyä.
Kuin myös tuo aikaisempi virheeni. Virheitä tekee aina, huolimattomuusvirheitä enimmäkseen väsyneenä.
Vaikka sitä kuinka lukee sitä juuri kirjoittamaa koodia useaan otteeseen,
ei sitä aina huomaa jos "=" puuttuu yhdestä kohtaa, vaikka tämä kuin kuuluisi siihen perussyntaksiin.
Sitten nuo muuttujien nimeämiset...
Olen 14-vuotias, mutta kuitenkin haluan englanniksi tehdä skriptini.
Olen monesti ilmainensanakirja.fi:stä katsonut mitä jokin asia on englanniksi, mutta ei aina niitä muuttujia ainakaan näillä taidoilla nimetä parhaiten mahdollisesti.
Virheitä tekee, ei voi mitään. :P
Edit: Sitten tuo taulukkohärpäke.. En ymmärtänyt kopiointia, joten tein tuollaisen härpäkkeen. :P
Edit2: Kiitos, Legu. Kirjoitin viestiäni niin kauan etten hoksannut vastaustasi. :D
ankzilla kirjoitti:
Olen monesti ilmainensanakirja.fi:stä katsonut mitä jokin asia on englanniksi, mutta ei aina niitä muuttujia ainakaan näillä taidoilla nimetä parhaiten mahdollisesti.
Ei tässä ole englannista kyse vaan noista numeroista. Kumpi on parempi: se, että joutuu koodin alusta katsomaan, mitä muuttujien 1–4 kommenteissa lukee, vai se, että on sen sijaan käytetty selkeitä nimiä x0, x1, y0 ja y1, joista voi edes suunnilleen päätellä, että kyseessä ovat x- ja y-muuttujien ala- ja ylärajat? Jos ei ole niin fyysikko, että ymmärtää nämä unissaankin, niin vaikka sitten x_min, x_max jne.
Olen itsekin joskus ihan ohjelmoinnin alussa tehnyt funktion, jossa olivat muuttujat a-j eri kohdissa eri merkityksissä. Pari viikkoa myöhemmin en saanut siitä mitään selvää. Sen jälkeen olen nimennyt muuttujat fiksummin, ja kyllä kannattaa.
Muuttujat voi nimetä ihan hyvin suomeksikin, jos englanti ei suju.
Jos sitten joskus projekti laajenee sellaiseksi että mukaan tulee suomea ymmärtämättömiä kehittäjiä, niin taivas_x_maksimi on taatusti helpompi kääntää englantilaisen ymmärtämäksi sky_x_max nimeksi kuin sky_3.
Metabolix kirjoitti:
Ei tässä ole englannista kyse vaan noista numeroista. Kumpi on parempi: se, että joutuu koodin alusta katsomaan, mitä muuttujien 1–4 kommenteissa lukee, vai se, että on sen sijaan käytetty selkeitä nimiä x0, x1, y0 ja y1, joista voi edes suunnilleen päätellä, että kyseessä ovat x- ja y-muuttujien ala- ja ylärajat? Jos ei ole niin fyysikko, että ymmärtää nämä unissaankin, niin vaikka sitten x_min, x_max jne.
Koska en haluaisi monesti kirjoittaa kauhean pitkiä muuttujia.
Se säästää aikaa ja hermoja.
Mielummin luen sky_1, kuin sky_x_min tai sky_x0.
Ja olen entisissäkin peleissäni tehnyt 1-4 härpäkkeitä, tuo edellinen oli vain yksinkertaisesti huolimattomuusvirhe, mikä olisi voinut tapahtua minkä nimisen muuttujan kanssa vain.
Sori että tällä asenteella vastaan näihin, mutta kuitenkin..
ankzilla kirjoitti:
Koska en haluaisi monesti kirjoittaa kauhean pitkiä muuttujia.
Se säästää aikaa ja hermoja.
Tämä asenne muuttuu väkisinkin, kun teet vielä muutaman tuollaisen huolimattomuusvirheen ja joudut itse etsimään ne tai kun joskus katselet vanhoja koodejasi. (Katsotaan, moniko noita huolimattomuusvirheitä jaksaa koodeistasi kaivaa. Itse en taida viitsiä, jos nimet ovat jatkossakin tuollaisia.)
ankzilla kirjoitti:
Ja olen entisissäkin peleissäni tehnyt 1-4 härpäkkeitä, tuo edellinen oli vain yksinkertaisesti huolimattomuusvirhe, mikä olisi voinut tapahtua minkä nimisen muuttujan kanssa vain.
Väitätkö, että seuraava rivi olisi mennyt täydestä?
image(texture_sky, screen, sky_x_max, y);
Metabolix kirjoitti:
ankzilla kirjoitti:
Koska en haluaisi monesti kirjoittaa kauhean pitkiä muuttujia.
Se säästää aikaa ja hermoja.Tämä asenne muuttuu väkisinkin, kun teet vielä muutaman tuollaisen huolimattomuusvirheen ja joudut itse etsimään ne tai kun joskus katselet vanhoja koodejasi. (Katsotaan, moniko noita huolimattomuusvirheitä jaksaa koodeistasi kaivaa. Itse en taida viitsiä, jos nimet ovat jatkossakin tuollaisia.)
Mutta kun aina ei voi tietää, puuttuuko yksi merkki, sana, rivi tai vaikkapa kokonainen if-else.
Metabolix kirjoitti:
ankzilla kirjoitti:
Ja olen entisissäkin peleissäni tehnyt 1-4 härpäkkeitä, tuo edellinen oli vain yksinkertaisesti huolimattomuusvirhe, mikä olisi voinut tapahtua minkä nimisen muuttujan kanssa vain.
Väitätkö, että seuraava rivi olisi mennyt täydestä?
image(texture_sky, screen, sky_x_max, y);
Noh, iltaisin monesti tekemisenpuutteessa myöhään koodailen, joten voisinpa jopa väittää että kyllä.
SDL_gfx:n pitäs asentaa, ku nyt ois siinä vaiheessa että tekstuureihin pitäs pientä perspektiiviä saada.
Elikkäs, aukaisin synapticin ja laitoin hakuun "sdl-gfx image"..
Tämä tarjoaa vähän liikaa vaihtoehtoja, mutta pitään enemmän kriteerejä sisällään pitävää hakua en keksinyt.
Mutta sitten älysin klikata tuota Ubuntu-logoa tuossa, mutta eipä vieläkään tarpeeksi hyvältä näytä.
En suoraan sanottuna yhtään tiedä, mikä noista pitäisi laittaa.
Jotenkaa..
Oisko kellää terminaalikomentoa tuon paketin asennukseen?
Jos ei, niin jelppiä minkäsnäköistä pakettia tuolta Synapticista pitäisi laittaa.
-Kiitos
Miksi "sdl-gfx image"? Siis mitä se image siinä tekee? Olisiko juuri tuon takia Synaptic hakenut molemmilla sanoilla erikseen, jolloin sait suuren määrän image-aiheisia tuloksia. Oikea haku nimellä sdl-gfx antaa tasan kaksi tulosta: kehityspaketin ja runtime-paketin. Ehkä osaat itsekin arvata, kumman tarvitset, kun kerran kehität ohjelmia. Ja varmaan osaat myös sitten asentaa sen komentorivillä Aptilla (komennolla apt-get), tai jos et, on korkea aika opetella.
Metabolix kirjoitti:
Miksi "sdl-gfx image"? Siis mitä se image siinä tekee? Olisiko juuri tuon takia Synaptic hakenut molemmilla sanoilla erikseen, jolloin sait suuren määrän image-aiheisia tuloksia. Oikea haku nimellä sdl-gfx antaa tasan kaksi tulosta: kehityspaketin ja runtime-paketin. Ehkä osaat itsekin arvata, kumman tarvitset, kun kerran kehität ohjelmia. Ja varmaan osaat myös sitten asentaa sen komentorivillä Aptilla (komennolla apt-get), tai jos et, on korkea aika opetella.
Osaan aptia käyttää. Ja pelkällä sdl-gfx:llä tuntui tulevan vielä enemmän vastuaksia Synapticissa.
Ja... ylempi noista? En ole varma. :S
Sori et oon näin vittumainen, mutta en voi itselleni mitään. ^^
legu@legu-laptop:~$ sudo apt-get install libsdl [tab][tab] libsdl0.11 libsdl-image1.2 libsdl0.11-dev libsdl-image1.2-dev libsdl1.0-dev libsdl-image-dev libsdl1.1-dev libsdl-mixer1.0-dev libsdl1.2 libsdl-mixer1.1-dev libsdl1.2-all libsdl-mixer1.2 libsdl1.2-arts libsdl-mixer1.2-dev libsdl1.2debian libsdl-mixer-dev libsdl1.2debian-all libsdl-net1.1-dev libsdl1.2debian-alsa libsdl-net1.2 libsdl1.2debian-arts libsdl-net1.2-dev libsdl1.2debian-esd libsdl-ocaml libsdl1.2debian-nas libsdl-ocaml-dev libsdl1.2debian-oss libsdl-pango1 libsdl1.2debian-pulseaudio libsdl-pango-dev libsdl1.2-dev libsdl-perl libsdl1.2-esd libsdl-ruby libsdl1.2-nas libsdl-ruby1.8 libsdl1.2-oss libsdl-sge libsdl-console libsdl-sge-dev libsdl-console-dev libsdl-sound1.2 libsdl-dev libsdl-sound1.2-dev libsdl-erlang libsdl-stretch-0-2 libsdl-gfx1.2 libsdl-stretch-dev libsdl-gfx1.2-4 libsdl-ttf1.2-dev libsdl-gfx1.2-dev libsdl-ttf2.0-0 libsdl-image1.0-dev libsdl-ttf2.0-dev libsdl-image1.1-dev legu@legu-laptop:~$ sudo apt-get install libsdl-gfx [tab] 1.2 [tab][tab] libsdl-gfx1.2 libsdl-gfx1.2-4 libsdl-gfx1.2-dev legu@legu-laptop:~$ sudo apt-get install libsdl-gfx1.2-dev [enter]
Niin yksinkertaista :)
ankzilla@AnkkaPC:~$ sudo apt-get install libsdl Luetaan pakettiluetteloita... Valmis Muodostetaan riippuvuussuhteiden puu Luetaan tilatiedot... Valmis E: Pakettia libsdl ei löytynyt ankzilla@AnkkaPC:~$ sudo apt-get install libsdl-gfx Luetaan pakettiluetteloita... Valmis Muodostetaan riippuvuussuhteiden puu Luetaan tilatiedot... Valmis E: Pakettia libsdl-gfx ei löytynyt
Ei niin yksinkertaista. :) SDL on jo asennettuna.
Edit: Mitä noi tabit on?
Tabulaattoreita (se näppäin Q:n vasemmalla puolella QWERTY-näppiksessä).
Kannattaa varmaan opetella sen käyttö, ihan hyödyllinen ominaisuus.
No kuitenkin, rautalangasta vääntäen SDL_gfx:n asennus onnistuu (Ubuntu 9.04:ssä):
sudo apt-get install libsdl-gfx1.2-dev
Legu kirjoitti:
No kuitenkin, rautalangasta vääntäen SDL_gfx:n asennus onnistuu (Ubuntu 9.04:ssä):
sudo apt-get install libsdl-gfx1.2-dev
Voi kiitos Legu, juuri tuota hainkin. :D
Nyt vain perspektiivejä koodailemaan.
Edit: Nyt olis tällaista kyssäriä, et miten kaksi lukua yhdistetään?
Jos on:
int i = 1; ja int ii = 2;
Niin miten tästä saadaan 12?
Kysyin ensin tätä ohjelmoijan ammattilaiselta, eikä tiennyt. :S
Muutat molemmat stringeiksi, plussaat yhteen ja sen jälkeen muutat tuloksen takaisin luvuksi.
Edit: Tässä toimiva esimerkki. Tuon tekoon meni n 5min.
#include <iostream> #include <string> #include <sstream> int strToInt(std::string str); std::string intToString(int tmp); int main() { int numero = 1; int numero2 = 2; std::string teksti = intToString(numero); std::string teksti2 = intToString(numero2); teksti += teksti2; int vastaus = strToInt(teksti); std::cout<<vastaus<<std::endl; return 0; } int strToInt(std::string str) { int tmp; tmp = atoi(str.c_str()); return tmp; } std::string intToString(int number) { std::ostringstream tmp; std::string result; tmp<<number; result = tmp.str(); return result; }
Tai sitten vähän lyhemmin tekstivirroilla:
int i = 1; int ii = 2; int iii; stringstream stream; // #include <sstream> // Varsinainen muunnos stream << i << ii; stream >> iii; // Tulostetaan vielä cout << iii << endl;
Lisää virroista ja muista standardikirjaston leluista osoitteessa http://www.cppreference.com/wiki/
Ok, kiitos.
Tämä ei siis ole mahdollista ilman stringejä?
Eihän Gaxx käyttänyt stringejä... Mun esimerkkissä käytetään.
Edit, eiku juu tarkoitit varmaan tota stringstreamia. Mikset voi käyttää noita, jos kerta c++ koodaat?
ankzilla kirjoitti:
Ok, kiitos.
Tämä ei siis ole mahdollista ilman stringejä?
Tässä on yksi ratkaisumalli:
int yhdista(int a, int b) { for(int i = 10; i <= 1000000000; i *= 10) { if(b < i) { return a*i + b; } } // Virhe, josta pitäisi ilmoittaa jotenkin return -1; }
Gaxx kirjoitti:
ankzilla kirjoitti:
Ok, kiitos.
Tämä ei siis ole mahdollista ilman stringejä?Tässä on yksi ratkaisumalli:
int yhdista(int a, int b) { for(int i = 10; i <= 1000000000; i *= 10) { if(b < i) { return a*i + b; } } // Virhe, josta pitäisi ilmoittaa jotenkin return -1; }
Olet kyllä todella taitava koodaamaan. :D
On ihan pakko kysyä, että miten tarkkaanottaen keksit moisen? ;D
Edit:
vehkis91 kirjoitti:
Edit, eiku juu tarkoitit varmaan tota stringstreamia. Mikset voi käyttää noita, jos kerta c++ koodaat?
Olenko sanonut, että en voi käyttää?
ankzilla kirjoitti:
On ihan pakko kysyä, että miten tarkkaanottaen keksit moisen? ;D
Kunhan apinoin muita. Koulussa tuo taisi tulla viimeksi vastaan — assemblyllä koodatessa.
Voi vitsi... Anteeksi, olen todella pahoillani: Unohtu sanoa että tuon a:n pitäisi olla "0.", ja b:n jotain muuta.
Onko tämä doublella mahdollista?
ainakin strinstream toimii myös doublella ja floatilla.
vehkis91 kirjoitti:
ainakin strinstream toimii myös doublella ja floatilla.
Ok, kiitos.
Edit: Sain ongelman ratkaistua aivan naurettavalla tavalla, kiitos todella paljon kaikille jelppijöille. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.