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?
Tee jokaselle tilelle eriksee maski ja siitä katot mihinkä sitä ukkelia voi liikuttaa. Ainakin Jazz Jackrabbitissa on tehty näin.
Mitenkäs tämä sitten käytännössä onnistu, jos käyvän c++:aa ja sdl:ää?
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.
Joo sen tajusin, mutta en tiedä miten voi katsoa jostain kuvast minkä värinen joku tietty pikseli on. Eli kuinka se siis onnistuu?
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ä :/
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);
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. ^^
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*'
En tiedä, kun en ole kokeillut, mutta olisikohan tuo SDL_GetRGB tähän tarkoitukseen passeli:
http://docs.mandragor.org/files/
EDIT: Jos nyt oikein tajusin, niin tässä: http://docs.mandragor.org/files/
alimmaisessa esimerkissä selvitellään pikselin RGB-arvot.
Sain ton nyt toimimaan silleen että se lukee ensimmäisen pikselin värit, mutta entäs jos haluankin lukea jonkun muun pixelin?
osku91 kirjoitti:
Sain ton nyt toimimaan silleen että se lukee ensimmäisen pikselin värit, mutta entäs jos haluankin lukea jonkun muun pixelin?
Tuolla kai saa haettua pikselin "numeron".
TsaTsaTsaa kirjoitti:
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.
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.
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?
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/
Pitäisi toimia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.