Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL heittää errorii

Sivun loppuun

ankzilla [25.09.2009 21:59:09]

#

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

Metabolix [25.09.2009 22:06:32]

#

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.

ankzilla [25.09.2009 22:16:05]

#

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

ankzilla [26.09.2009 12:30:47]

#

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

Metabolix [26.09.2009 13:07:56]

#

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

ankzilla [26.09.2009 13:48:18]

#

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

Metabolix [26.09.2009 13:53:02]

#

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.

ankzilla [26.09.2009 13:59:26]

#

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/17452-sdl-png-kuvan-lataus

ankzilla [27.09.2009 18:32:51]

#

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;
	}
}

Metabolix [27.09.2009 19:31:44]

#

Silmukassa täytyy olla SDL_PumpEvents(), jotta jonossa olevat näppäimenpainallukset käsiteltäisiin.

ankzilla [27.09.2009 19:51:47]

#

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

ankzilla [28.09.2009 20:10:55]

#

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;
		}
	}
}

Metabolix [28.09.2009 21:10:51]

#

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.

ankzilla [29.09.2009 15:45:58]

#

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?

Metabolix [29.09.2009 15:49:56]

#

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

ankzilla [29.09.2009 16:19:48]

#

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

Metabolix [29.09.2009 16:48:25]

#

Voi, mutta ei tietueen sisään. Ja tuossahan x jää alustamatta, kun nolla sijoitetaan vain y:hyn.

Macro [29.09.2009 16:49:47]

#

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.

ankzilla [29.09.2009 16:49:50]

#

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?

Metabolix [29.09.2009 16:58:08]

#

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.

ankzilla [29.09.2009 17:00:01]

#

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

ankzilla [30.09.2009 17:28:10]

#

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

Legu [30.09.2009 17:54:16]

#

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

os [30.09.2009 17:58:50]

#

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.

ankzilla [30.09.2009 18:12:26]

#

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

ankzilla [01.10.2009 17:04:04]

#

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*ö

Grez [01.10.2009 17:08:30]

#

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.

ankzilla [01.10.2009 17:11:27]

#

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.

vehkis91 [01.10.2009 17:11:49]

#

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;
}

ankzilla [01.10.2009 17:15:46]

#

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.

Grez [01.10.2009 17:24:16]

#

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.

ankzilla [01.10.2009 17:32:25]

#

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?

Grez [01.10.2009 17:40:12]

#

Esim TTF_RenderText_Solid

tgunner [01.10.2009 17:41:12]

#

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

ankzilla [01.10.2009 18:12:37]

#

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?

MIB [01.10.2009 19:20:40]

#

On, mutta toimii eritavalla.

Macro kirjoittikin oman funktionsa tätä tulostusta varten.

Metabolix [01.10.2009 19:49:09]

#

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

ankzilla [02.10.2009 16:10:56]

#

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

vehkis91 [02.10.2009 16:14:21]

#

Et pelkällä SDL:lä voi 3d:tä koodata... Sun pitää ottaa OpenGL mukaan, että tuo onnistuu.

Grez [02.10.2009 16:32:25]

#

Miten niin ei voi? Toki järkevämpää varmaan pistää homma näyttiksen huoleksi.

Metabolix [02.10.2009 16:41:45]

#

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.

ankzilla [02.10.2009 16:59:20]

#

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

Metabolix [02.10.2009 17:48:11]

#

SDL_FillRect(ruutu, 0, 0);

ankzilla [02.10.2009 18:08:17]

#

Metabolix kirjoitti:

SDL_FillRect(ruutu, 0, 0);

Toimiiko tuo jos käyttää kaksoispuskurointia?

Metabolix [02.10.2009 18:20:00]

#

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.

ankzilla [02.10.2009 18:21:45]

#

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?

ankzilla [03.10.2009 12:29:27]

#

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

Metabolix [03.10.2009 13:39:21]

#

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.

vehkis91 [03.10.2009 13:57:17]

#

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.

ankzilla [03.10.2009 16:15:55]

#

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

Metabolix [03.10.2009 16:30:38]

#

Puuttuu =-merkki. Lukisit C++-oppaita, niin osaisit tuollaiset perusasiat. Tuo ei ole kovin hyvä lähtökohta 3d-pelin tekemiselle.

ankzilla [03.10.2009 17:13:51]

#

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?

Grez [03.10.2009 18:51:48]

#

Loopissa.

Blaze [03.10.2009 19:25:13]

#

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

ankzilla [03.10.2009 19:30:07]

#

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

hunajavohveli [03.10.2009 19:46:27]

#

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/2.14.html#memcpy

ankzilla [03.10.2009 20:13:05]

#

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?

Metabolix [03.10.2009 20:15:52]

#

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.

ankzilla [03.10.2009 23:17:23]

#

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?

Metabolix [03.10.2009 23:23:15]

#

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.

ankzilla [04.10.2009 12:37:53]

#

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.

Metabolix [04.10.2009 13:05:31]

#

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.

Legu [04.10.2009 13:31:45]

#

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;
}

ankzilla [04.10.2009 13:32:17]

#

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

Metabolix [04.10.2009 13:37:21]

#

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.

Grez [04.10.2009 13:42:25]

#

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.

ankzilla [04.10.2009 13:43:55]

#

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

Metabolix [04.10.2009 13:52:12]

#

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

ankzilla [04.10.2009 14:04:48]

#

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

ankzilla [06.10.2009 22:22:48]

#

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

Metabolix [06.10.2009 22:30:12]

#

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.

ankzilla [06.10.2009 22:35:36]

#

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 [06.10.2009 22:56:46]

#

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 [07.10.2009 14:40:27]

#

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?

Legu [07.10.2009 16:28:09]

#

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

ankzilla [07.10.2009 18:31:03]

#

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

vehkis91 [07.10.2009 20:29:34]

#

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;
}

Gaxx [07.10.2009 20:53:12]

#

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/

ankzilla [07.10.2009 21:17:12]

#

Ok, kiitos.
Tämä ei siis ole mahdollista ilman stringejä?

vehkis91 [07.10.2009 21:22:31]

#

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?

Gaxx [07.10.2009 21:40:28]

#

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;
}

ankzilla [07.10.2009 21:45:10]

#

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

Gaxx [07.10.2009 21:46:58]

#

ankzilla kirjoitti:

On ihan pakko kysyä, että miten tarkkaanottaen keksit moisen? ;D

Kunhan apinoin muita. Koulussa tuo taisi tulla viimeksi vastaan — assemblyllä koodatessa.

ankzilla [07.10.2009 22:25:38]

#

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?

vehkis91 [07.10.2009 22:29:55]

#

ainakin strinstream toimii myös doublella ja floatilla.

ankzilla [07.10.2009 22:31:00]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta