Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tasohyppelypeli

Sivun loppuun

osku91 [06.03.2007 16:08:45]

#

Aloitinpa tässä tekemään pientä tile pohjaista tasohyppelypeliä. Ja siinnä ukon törmäys tarkistetaan vain katsomalla että onko ukon vieressä oleva tile tyhjä, mutta ongelmaksi tuli, että en keksi miten saisi tehtyä niin että maasto voi olla vino. Eli miten voin siis tarkistaa törmäyksen vinossa maastossa?

crafn [06.03.2007 16:37:50]

#

Tee jokaselle tilelle eriksee maski ja siitä katot mihinkä sitä ukkelia voi liikuttaa. Ainakin Jazz Jackrabbitissa on tehty näin.

osku91 [07.03.2007 23:52:02]

#

Mitenkäs tämä sitten käytännössä onnistu, jos käyvän c++:aa ja sdl:ää?

crafn [08.03.2007 17:03:59]

#

Vaikka sillee et teet paintilla mustavalkokuvat jokaisesta tilestä (musta seinää/maata, valkoinen ilmaa). Sitte latailet ne sdl:llä. Pelaamisvaiheessa pelin pitäis kattoo että minkä tilen/tilejen alueella ukkeli on, ja tarkistaa mustavalkokuvasta saako liikuttaa hahmoa haluttuun suuntaan.

osku91 [08.03.2007 17:34:51]

#

Joo sen tajusin, mutta en tiedä miten voi katsoa jostain kuvast minkä värinen joku tietty pikseli on. Eli kuinka se siis onnistuu?

crafn [08.03.2007 19:58:14]

#

Hmm.. Veikkaan et ois hyvä iskee ne maskit omalle surfacelle et siin on koko kentästä se maski. Pikseleitten lukuu en osaa neuvoo, koska ite en oo koskaa koittanu lueskella niitä :/

hunajavohveli [08.03.2007 22:48:31]

#

SDL:llä joutuu käytännössä (ilman lisäkirjastoja) lukemaan pikseleitä suoraan muistista osoitinmuuttujien avulla. Hatusta vedettynä kutakuinkin näin 32-bittisessä surfacessa:

unsigned char *p;           // Osoitin
p = surface->pixels;        // Osoittamaan surfacen pikseleihin

p += (y * surface_width + x) * 4;      // Siirrytään pikseliin (x, y)

b = *p; p++;  // Luetaan sininen komponentti ja hypätään seuraavaan tavuun
g = *p; p++;  // Luetaan vihreä komponentti ja hypätään seuraavaan tavuun
r = *p;       // Luetaan punainen komponentti

Ikkunoidussa tilassa pikselit ovat muistaakseni peräkkäin muistissa.

Edit: Muistelisin myös, että surface pitää lukita ennen pointtereilla lukemista.

SDL_LockSurface(surface);

Metabolix [08.03.2007 22:52:55]

#

Minusta järkevämpää olisi tehdä tarkistus matemaattisesti ja tehdä joka tilelle matemaattinen rajaus. Silloin olisi liukumiset sun muut ehkä helpompi toteuttaa. Mutta kukin tavallaan. ^^

osku91 [10.03.2007 10:00:21]

#

Mitens nyt kun yritin tehdä hunajavohvelin esimerkin mukaan funktion, joka hakee pikselin värin, mutta nyt dev-c++ vain valittaa:
invalid conversion from `void*' to `unsigned char*'

TsaTsaTsaa [10.03.2007 10:06:08]

#

En tiedä, kun en ole kokeillut, mutta olisikohan tuo SDL_GetRGB tähän tarkoitukseen passeli:
http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlgetrgb.html

EDIT: Jos nyt oikein tajusin, niin tässä: http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/sdlpixelformat.html
alimmaisessa esimerkissä selvitellään pikselin RGB-arvot.

osku91 [10.03.2007 10:25:16]

#

Sain ton nyt toimimaan silleen että se lukee ensimmäisen pikselin värit, mutta entäs jos haluankin lukea jonkun muun pixelin?

TsaTsaTsaa [10.03.2007 10:34:14]

#

osku91 kirjoitti:

Sain ton nyt toimimaan silleen että se lukee ensimmäisen pikselin värit, mutta entäs jos haluankin lukea jonkun muun pixelin?

http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/guidevideo.html­#AEN90

Tuolla kai saa haettua pikselin "numeron".

hunajavohveli [10.03.2007 16:48:19]

#

TsaTsaTsaa kirjoitti:

http://docs.mandragor.org/files/Common_libs_documentation/SDL/SDL_Documentation_project_en/guidevideo.html­#AEN90

Tuolla kai saa haettua pikselin "numeron".

Tuossa haetaan väriarvot pointtereilla kuten minunkin esimerkissäni, paitsi että tuohon on sisällytetty erikseen käsittely useammalle bittimäärälle. Kannattaa tietysti poistaa tuosta kaikki ylimääräinen ja jättää käsittely ainoastaan sille bittimäärällä, jota itse käyttää. Virheilmoituksesta en osaa sanoa mitään ilman tarkempaa tietoa, millaisesta koodista ja mistä kohdasta kääntäjä valittaa.

Metabolix [10.03.2007 23:02:28]

#

Koska käytät C++:aa etkä C:tä, muunnos void*-tyypistä char*-tyyppiin ei mene virheettä läpi noin.

unsigned char *p = ruutu->pixels; // C:ssä menee, C++:ssa ei
unsigned char *p = (unsigned char *) ruutu->pixels; // Toimii kummassakin

Muuten tuo hunajavohvelin koodi näyttäisi olevan kunnossa.

osku91 [11.03.2007 22:32:34]

#

Nyt ilmestyi uusi ongelma. Nimittäin kun yritin tehdä tekstin kirjoitus funktiota joka kirjoittaa tekstin niin että kirjaimet otetaan kuvasta, niin ilmaantuu ongelma. Koska siis kuvassani on ensin välilyönti, sitten numerot 0-9 ja sitten kirjaimet A-Z, niin minun pitää vähentää char:ista (kai)57, jos pitäisi piirtää kirjain väliltä A-Z, mutta sitten se piirtää vain kirjaimet C-K oikein, mutta kaikki muut kirjaimet väärin. Esim A=7 ja P=S. Mistäköhän tämä johtuu?

TsaTsaTsaa [11.03.2007 22:36:06]

#

osku91 kirjoitti:

Nyt ilmestyi uusi ongelma. Nimittäin kun yritin tehdä tekstin kirjoitus funktiota joka kirjoittaa tekstin niin että kirjaimet otetaan kuvasta, niin ilmaantuu ongelma. Koska siis kuvassani on ensin välilyönti, sitten numerot 0-9 ja sitten kirjaimet A-Z, niin minun pitää vähentää char:ista (kai)57, jos pitäisi piirtää kirjain väliltä A-Z, mutta sitten se piirtää vain kirjaimet C-K oikein, mutta kaikki muut kirjaimet väärin. Esim A=7 ja P=S. Mistäköhän tämä johtuu?

Tuolta löytyy minun tekemä funktio tuohon tarkoitukseen:
https://www.ohjelmointiputka.net/keskustelu/14483-sdl-png-n-tietty-väri-näkymättömäksi

Pitäisi toimia.


Sivun alkuun

Vastaus

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

Tietoa sivustosta