Onko mahdollista tehdä sellaista, että jos kuva "Auto" osuu johonkin tiettyyn väriin esim. #B6B2B2 niin tapahtuu jotain? EN löytänyt googlella ainakaan tälläistä tai sitten etsein väärillä hakusanoilla tai sitten huono enklantini livisti enkä ymmärtänyt. Eli miten tuollainen tehdään jos se on mahdollista?
Aikaisempien viestiesi perusteella oletan että käytät SDL kirjastoa. Sen avulla tuo onnistuu kyllä. Tässä ohjeet:
http://www.libsdl.org/cgi/docwiki.cgi/
Siis haluaisit tehdä vaikka räjähdyksen, kun auto osuu seinään?
Mielestäni ihan hyvä idea tehdä tuolla taktiikalla, niin ei tarvi kaikkien seinien/objektien kanssa säätää.
Itse tekisin getpixel funktiolla tämän, jotain tähän tyyliin:
int auto_x; int auto_y; Uint32 seinan_vari; if(getpixel(screen, auto_x - 1, auto_y - 1) == seinan_vari) { /*KUOLIT!*/ return 0; }
Tuo ei sinänsä toimi, koska en tiedä millä systeemillä oot tehny tuon et mihin suuntaan auto liikkuu... mutta eikös se jotenkin tuolla tavalla pitäisi toimia?
Edit: Jaa, kirjoitin näköjään viestiäni hieman liian pitkään. ;D
En luultavasti osaa käyttää nyt tuota oikein koska saan erroreita, mutta siis se väittää ettei getpixel löydä jotain.
Uint32 SDL_MapRGB(SDL_PixelFormat *seinan_vari, Uint8 182, Uint8 178, Uint8 178); if(getpixel(naytto, oma_x - 1, oma_y - 1) == seinan_vari) { nopeus=0; }
Mikä toi funktion esittely toss on?
varmaa auttais jos niiden muuttujien nimet ois jotain muuta, kuin lukuja...
Ja miks oot määritelly noin ton? Toihan on SDL:n oma funktio, et sää sitä saa mennä sorkkimaan, varsinkaan ku et näytä tietävän mitä pitäis tehdä.
Tossa ylhäällähän on hyvä esimerkki, siitä, että miten tuota käytetään.
int auto_x; int auto_y; Uint32 seinan_vari; if(getpixel(screen, auto_x - 1, auto_y - 1) == seinan_vari) { /*KUOLIT!*/ return 0; }
Tuo?
Se varmaan olisikin hyvä, mutta sekin heittää getpixel erroria ja toisekseen mistä se tietää mikä on seinan_vari kun sille ei anneta arvoja missään vaiheessa?
Toimisikohan seuraava. Huom en oo testannu koodia, joten pieniä virheitä voi olla.
//Kuva sisältää esteet ja taustan. SDL_Surface *kuva = SDL_LoadBMP("kuva.bmp"); //Tähän laitetaan r, g. b arvojen tilalle seinän väri. // tässä tapauksessa kirkkaan punainen. Uint32 seinan_vari = SDL_MapRGB(kuva->format, 255, 0, 0); int auto_x; int auto_y; if(getPixel(kuva, auto_x - 1, auto_y - 1) == seinan_vari) { /*KUOLIT!*/ return 0; }
Sama errori.
HUOM! Tässä on vain tuohon liittyvät koodit. Alhaalla on errori
SDL_Surface *rata_1; float oma_x=5; float oma_y=575; rata_1=SDL_LoadBMP("data/grafiikka/Radat/rata_1.bmp"); Uint32 seinan_vari = SDL_MapRGB(rata_1->format, 182, 178, 178); if(getPixel(rata_1, oma_x - 1, oma_y - 1) == seinan_vari) { nopeus=0; }
1>c:\documents and settings\mika.koti-8fec3c6ef1\omat tiedostot\visual studio 2008\projects\racer 2010\racer 2010\racer 2010.cpp(169) : error C3861: 'getPixel': identifier not found
Eli se ei löydä tuollaista kun getpixel. Miksi? Olen linkittänyt mielestän ikaiken tarpeellisen
#include "stdafx.h" #include <iostream> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include "windows.h" #include <cmath> #include <io.h> #include <SDL.h> #include <SDL_rotozoom.h> #include "SDL_ttf.h" #pragma comment(lib, "SDL_ttf.lib") #pragma comment(lib, "SDLmain.lib") #pragma comment(lib, "SDL.lib") #pragma comment(lib, "SDL_gfx.lib") #include "data/start.lu" #include "data/tekstit.lu" #include "data/functions.lu" #include "data/tekoaly.lu"
SDL:ssä ei ole getpixel-funktiota. Se löytyy tuolta ylhäällä olevasta linkistä.
Nytten satelee sitten noita erroreita joista en ymmärrä hölkäsen pöläystä.
>Racer 2010.exe!`dynamic initializer for 'seinan_vari''() Line 250 + 0x32 bytes C++
ja keltainen nuoli osoittaa riviä:
Uint32 seinan_vari = SDL_MapRGB(rata_1->format, 182, 178, 178);
Laittappas tosta ympäriltä vähän koodia...
Ois helpompi sanoo, että missä kusee.
Se on functions.lu kansiossa viimeisenä eli:
Uint32 getpixel(SDL_Surface *surface, int x, int y) { int bpp = surface->format->BytesPerPixel; /* Here p is the address to the pixel we want to retrieve */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch (bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; case 4: return *(Uint32 *)p; default: return 0; /* shouldn't happen, but avoids warnings */ } // switch } Uint32 seinan_vari = SDL_MapRGB(rata_1->format, 182, 178, 178);
hmm. Ja missäköhän rata_1 on määrritelty? BTW, etkö voi käyttää ihan c++ "omia" tiedostopäätteitä eli, h, hpp, c tai cpp?
Alustapa tuo seinän väri ihan funktion sisällä. Dynaaminen alustus globaalisti pistää kääntäjälle sormen suuhun, kun se ei tiedä mitä sinne pitäis tunkea.
Juu sain toimimaan (tai siis melkein) ongelma on vain siinä, että nyt auto on koko ajan kosketuksissa seinän kanssa vaikka en osu seinään? Joku mättää, mutta mikä.
Tiedän osuman siitä, kun laitoin nopeuden 10 jos osuu seinään. Minun ei tarvitse edes painaa kaasua vaan auto menee koko ajan tuolla nopeudella. Koitin tehdä jopa radasta "kopio" kuvaa jossa on pelkät seinät, mutta sama ongelma edelleen.
SDL_Surface *rata_1; SDL_Surface *rata_1_esteet; Uint32 bpp; rata_1=SDL_LoadBMP("data/grafiikka/Radat/rata_1.bmp"); rata_1_esteet=SDL_LoadBMP("data/grafiikka/Radat/rata_1_esteet.bmp"); Uint32 getpixel(SDL_Surface *surface, int x, int y) { Uint32 bpp = SDL_MapRGB(rata_1_esteet->format, 182, 178, 178); /* Here p is the address to the pixel we want to retrieve */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch (bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; case 4: return *(Uint32 *)p; default: return 0; /* shouldn't happen, but avoids warnings */ } // switch } PiirraKuva(rata_1, naytto, 500-oma_x, -580-oma_y); PiirraKuva(rata_1_esteet, naytto, 500-oma_x, -580-oma_y); if(getpixel(rata_1_esteet, oma_x - 1, oma_y - 1) == bpp) { nopeus=10; }
No tuossa taas oo mitää hyötyä... Jos tarkistat väristä, seinien pitäisi käsittääkseni olla samassa kuvassa, mitä muutkin kamat.
mika132: Suosittelisin nyt vähän hidastamaan vauhtia. Graafinen peliprojekti & C(++) ei selvästikkään ole sinun tämänhetkiselle taitotasollesi sopiva yhdistelmä. Palaa siis taaksepäin, joko tekemään jotakin yksinkertaista C-kielellä tai aloita peliohjelmointi jollakin pelinteko-ohjelmatyyppisellä järjestelmällä, kuten CoolBasic. Nykyiseen malliin jatkamalla et saa aikaan mitään kovin järkevää.
Olen käyttänyt PHP:Tä tehnyt sillä selainpelejä.
3v uotta sitten aloitin HTML opettelun kiinnostuin koodaamisesta ja opiskelin PHP:n. Sitten aloin kiinnostumaan selainpeleistä, mutta jräki ei tuohon aikaan minulla luistanut lainkaan, joten päätin tehdä ladattavia pelejä GameMakerillä. Ahneus kasvoi kun GameMakerillä oli liian "helppo" tehdä pelejä joten opiskelin CoolBasicin. Tein silläkin muutaman pelin. noin 1v sitten sain ensimmäisen selainpelini valmiiksi PHP:llä. Kiinnostuin laajemmista selainpeleistä ja aloitin Javascriptin opiskelun. Tein kaikennäköistä jokalähtöön Javascriptillä ja kun ymmärsin tarkoituksen tein PHP:n ja Javan sekoituksen yhteen selainpeliin. n.8kk sitten aloitin C++ kielen opiskelun, koska se vaikutti ainoalta jossa on vain taivas rajana jos osaa. Muutaman kuukauden sitä käytin enkä päässyt jyvälle, joten siirryin takaisin CoolBasiciin ja PHP:hen. Nyt noin 4kk sitten aloitin C++ uudestaan luettuani erillaisia C++ oppaita 1kk verran. Tein ensimmäisen oman pelin "Jörö seikkailee" peli oli tekstipohjainen ja olin tyytyväinen siihen ja teinkin jatko-osan "Jörö seikkailee 2" kaverini pitivät pelistä vaikka olikin vain tekstipohjainen.
Sitten siirryinkin SDL kirjastoiden pariin ja loput tiedättekin.
Eli oletan, että minulla on kokemusta jo eri kielistä, mutta minulla kestää äkkiä n. 6kk riippuu kuinka pian ymmärrän eri asioiden perusteet täysin (Yleensä opin kysymällä ja saamalla valmiita koodeja) palaset loksahtavat paikalleen ja alan käyttämään omaa logiikkaa ohjelmointiin, mutta ne palaset eivät ole vielä täysin loksahtaneet kohdilleen C++ parissa.
VASTAUS:
Minulla oli nuo samassakin, mutta se teki samaa. Eli olin muka koko ajan seinän kanssa kosketuksissa.
Oikeassa elämässä merkitsee lopputulos enemmän, kuin sen tekemiseen käytetty aika. Palatakseni itse ongelmaasi, niin kokeile ensin vaikka paperilla ratkaista tuo törmääminen ja käännä se sitten ohjelmaksi. Törmäämisen ei pitäisi olla riippuvainen pelin muusta logiikasta.
Otetaan esimerkiksi vaikka yksinkertaisuuden vuoksi kahden ympyrän törmääminen. Milloin ympyrät törmäävät?
Sillonku ympyröiden keskipisteiden etäisyys on ympyröiden säteiden summa! :D
Juu tiedän miten ympyrät törmäävät, mutta kyseessä on rata ja kaiteet. Eli ei lähellekkään ympyrää. Siksi olisi kaikista parhain, että saisin tehtyä väri törmäyksen.
No, kai nyt suorakulmioihinkin voi määrittää keskipisteen?
Pistetäänpä kuva helpoittamaan tilannetta.
Eli se kirkkaampi harmaa siinä on ns. Seinää. (Nuo ovat vasta alustavia grafiikoita, koska teen fysiikoita yms) mutta ei siitä sen enempää. Miten tuollaiseen seinään voin mitata osumisen jos en muuta kuin väreillä? Ja mahdollisimman helposti?
Laita tuolla getpixelillä tunnistus auton jokaiseen kulmaan. Jos sen alla on tietty väri (harmaa), niin peli loppuu. Eikös se jo kerrottu?
Macro kirjoitti:
No, kai nyt suorakulmioihinkin voi määrittää keskipisteen?
No voi, mutta ei kai suorakulmion törmäystarkistukseen keskipistettä tarvitse määrittää. Suorakulmionhan voi määrittää neljällä, tai kahdella pisteellä. Tarkistuksen voi tehdä pisteitä apuna käyttäen.
Pelihahmo on harvoin suorakulmion muotoinen ja halutessa saada tarkempi lopputulos, niin spritelle voi määrittää törmäyspisteet (collision box, collision points). Esim. neljä pistettä: vasen, oikea, ylä ja ala.
No ei vaikuta kovin helpolta kun löysin googlesta oppaan tuohon ja vielä hieman heikko enklanti vaikeuttaa asiaa eli..
Jos olen ladannut nyt SDL omalla tavalla kuvan
autona_oma=SDL_LoadBMP("data/grafiikka/auto_1.
Ja sitten laitan
CL_CollisionOutline generated(autona_oma, accuracy_high); //sitten löysin oppaasta tälläisen: if( outline.collide(outline2) ) //Mikä outline2? { //tehdään jotan? }
Voisiko joku antaa hieman suomenkielistä neuvoa?
http://clanlib.org/docs/clanlib-2.1/overview/collision_detection.html
Sain oikein mahti idean, mutta toteutuksesta en ole varma.
Eli jos lataan kaksi kuvaa liittyen rataan.
rata_1
rata_1_seinat
Piirrän ensin rata_1 ja sitten rata_1_seinat. Piirrän vaikka paintilla rata_1_seinat kuvasta tien valkoiseksi ja sitten transparent valkoiseksi.
Pointti/tietämättömyys:
Silloinhan käytännössä tietä ei ole rata_1_seinat kuvassa vaan on vain ne seinät. Sitten vain tarkistetaan, että jos auto osuu kuvaan rata_1_seinat niin tapahtuu jotain, mutta en ole lainkaan varma miten voin tarkistaa osuuko kaksi kuvaa? Enkä tarkoita siis nyt pyöreitä palloja vaan muistatte miten ratani kaiteet meni. Kuva on neljä viestiä ylempänä.
Eli miten tarkistetaan suoraan osuuko pelaaja kuvaa rata_1_seinat?
Et sinä maskia (eli tuota rata_1_seinat) tarvitse, jos se ne seinät ovat yksiväriset. Eikä se muutenkaan tuota ongelmaasi poista, koska ongelmasihan nimenomaan oli se, että miten tiedetään "osuuko kaksi kuvaa".
Tuo pikselitarkistus menee tällä idealla:
bool tomaako_auto_seinaan() { for (int x = 0; x < autokuvan_leveys; ++x) { for (int y = 0; y < autokuvan_korkeus; ++y) { if (getpixel(autokuva, x, y) != läpinäkyvä) { if (onko_seinaa_kohdassa(auto_x - autokuvan_leveys / 2 + x, auto_y - autokuvan_korkeus / 2 + y)) { return true; } } } } return false; }
Ymmärsin idean, mutta en tarkistusta, nimittäin siinä on asia mitä en ole aikaisemmin tehnyt. Nimittäin funktio tarkistuksessa. Yritin:
int onko_seinaa_kohdassa(float tulos1, float tulos2) { return tulos1; return tulos2; }
Mutta ei ainakaan törmännyt seiniin. Varmuuden vuoksi olennaiset koodit, jos mokasin jossain, mutta en vain näe missä.
Uint32 bpp; int autokuvan_leveys=80; int autokuvan_korkeus=25; Uint32 getpixel(SDL_Surface *surface, int x, int y) { Uint32 bpp = SDL_MapRGB(rata_1->format, 182, 178, 178); /* Here p is the address to the pixel we want to retrieve */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch (bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; case 4: return *(Uint32 *)p; default: return 0; /* shouldn't happen, but avoids warnings */ } // switch } int onko_seinaa_kohdassa(float tulos1, float tulos2) { return tulos1; return tulos2; } bool tomaako_auto_seinaan() { for (int x = 0; x < autokuvan_leveys; ++x) { for (int y = 0; y < autokuvan_korkeus; ++y) { if (getpixel(autona_oma, x, y) != bpp) { if (onko_seinaa_kohdassa(oma_x - autokuvan_leveys / 2 + x, oma_y - autokuvan_korkeus / 2 + y)) { nopeus=0; } } } } return false; } if (huone==4) { KisanPiirtaminen(naytto);//Ei niinkään olennainen AutonOhjaus(nappi);//Ei niinkään olennainen oma_x += cos((float) auton_suunta) * nopeus; //Ei niinkään olennainen oma_y -= sin((float) auton_suunta) * nopeus;//Ei niinkään olennainen vas_x_1 += cos((float) vas_1_suunta) * vas_1_nopeus; //Ei niinkään olennainen vas_y_1 -= sin((float) vas_1_suunta) * vas_1_nopeus;//Ei niinkään olennainen suunta_nopeus=-nopeus/7;//Ei niinkään olennainen VaihteistaTulevaPotku=nopeus/VAIHDEPAALLA;//Ei niinkään olennainen tomaako_auto_seinaan();//Tästä törmäystä. Väärä paikka kenties? suunta_kierrosluku=-nopeus/VAIHDEPAALLA;//Ei niinkään olennainen mikään tästä alaspäin if (rad2deg(suunta_kierrosluku) <= -180) { VAIHDEPAALLA+=1.5; VAIHDE+=1; nopeus-=0.5; } if (rad2deg(suunta_kierrosluku) >= -60) { if (VAIHDEPAALLA >= 1.5) { VAIHDEPAALLA-=1.5; VAIHDE-=1; nopeus-=0.5; } } }
int onko_seinaa_kohdassa(float tulos1, float tulos2) { return tulos1; return tulos2; }
Miksi palautat tuossa aina vain muuttujan tulos1? Eikös noiden muuttujien avulla pitäisi tehdäkin jotain tarkistuksia tuohon seinän tarkisteluun?
AIVAN! :D
Taas oli sytytys kympillä, mutta mutta... Miten tiedän seinän x, y:n?
if (tulos1>=tulos2) { return true; }
jos teen noin niin niin se vain tarkistaa mielestäni, että jos auton leveys on suurempi kuin pituus? Ei nyt aivan mielestäni ole logiikkaa tai sitten en taaskaan ymmärrä jotain. :O
Et tarvitse sitä seinän x ja y:t, jos tarkistat vaan suoraan siitä väristä, että milloin törmää.
En ole tuollaistakaan ennen tehnyt ymmärsin (ilmeisesti) mitä nyt tarkoitat, mutta:
int onko_seinaa_kohdassa(float tulos1 + int xxx, float tulos2, + int yyy) //Miten saan int xxx ja yyy:n asetettua tuohon niin, että tulosta ei lasketa, mutta ne tuodaan mukana? Yritin myös: int onko_seinaa_kohdassa(float tulos1 + ,int xxx, float tulos2, + ,int yyy)
koko tuo kohta:
Uint32 getpixel(SDL_Surface *surface, int x, int y) { Uint32 bpp = SDL_MapRGB(rata_1->format, 182, 178, 178); Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch (bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; case 4: return *(Uint32 *)p; default: return 0; } } int onko_seinaa_kohdassa(float tulos1 + int xxx, float tulos2, + int yyy) { if (tulos1>=xxx) { nopeus=0; } if (tulos2>=yyy) { nopeus=0; } } bool tomaako_auto_seinaan() { for (int x = 0; x < autokuvan_leveys; ++x) { for (int y = 0; y < autokuvan_korkeus; ++y) { if (getpixel(autona_oma, x, y) != bpp) { if (onko_seinaa_kohdassa(oma_x - autokuvan_leveys / 2 + x, oma_y - autokuvan_korkeus / 2 + y)) { nopeus=0; } } } } return false; } //Nuo ylemmät on siis functions-lu tiedostossa ja tämä seuraava pää funktiossa main.cpp:ssä. if (huone==4) { KisanPiirtaminen(naytto); AutonOhjaus(nappi); oma_x += cos((float) auton_suunta) * nopeus; oma_y -= sin((float) auton_suunta) * nopeus; vas_x_1 += cos((float) vas_1_suunta) * vas_1_nopeus; vas_y_1 -= sin((float) vas_1_suunta) * vas_1_nopeus; suunta_nopeus=-nopeus/7; VaihteistaTulevaPotku=nopeus/VAIHDEPAALLA; tomaako_auto_seinaan(); //TÄÄLTÄ LÄHTEE KUTSU. suunta_kierrosluku=-nopeus/VAIHDEPAALLA; if (rad2deg(suunta_kierrosluku) <= -180) { VAIHDEPAALLA+=1.5; VAIHDE+=1; nopeus-=0.5; } if (rad2deg(suunta_kierrosluku) >= -60) { if (VAIHDEPAALLA >= 1.5) { VAIHDEPAALLA-=1.5; VAIHDE-=1; nopeus-=0.5; } } }
En kyllä oikeen tiedä mitä tähän sanois >_< Kantsis suosiolla tehdä ja harjoitella jotain yksinkertaisempaa.
Minulla on jo auto fysiikat yms tehtynä/loput suunniteltu ja tehty luonnokisa vain törmäystä vaille. Joten pyydän, että auttaisitte.
WTF???!!!!
Edit: tosin, en edelleenkään nää mitään järkeä koko funktiossa...
//EI NÄIN!!!!!!!!!!!!! int onko_seinaa_kohdassa(float tulos1 + int xxx, float tulos2, + int yyy) //VAAN NÄIN int onko_seinaa_kohdassa(float tulos1, int xxx, float tulos2, int yyy) { tulos1 += xxx; tulos2 += yyy; if (tulos1>=xxx) { nopeus=0; } if (tulos2>=yyy) { nopeus=0; } }
Sitten tämä:
bool tomaako_auto_seinaan() { for (int x = 0; x < autokuvan_leveys; ++x) { for (int y = 0; y < autokuvan_korkeus; ++y) { //GetPixel tarkistaa, että onko auto seinän päällä, joten miks alat //sitä erikeen tarkistaa jollain ihme funkioilla??? if (getpixel(autona_oma, x, y) != bpp) { //Eli mielestäni tämä on turha! if (onko_seinaa_kohdassa(oma_x - autokuvan_leveys / 2 + x, oma_y - autokuvan_korkeus / 2 + y)) { nopeus=0; } } } } return false; }
Ei edelleenkään osu mihinkään vaikka poistin niitä mitä käskit. Joten sitten päätin poistaa kaikki, mutta ei sekään korjannut ongelmaa. Nykyinen koodini:
Uint32 getpixel(SDL_Surface *surface, int x, int y) { Uint32 bpp = SDL_MapRGB(rata_1->format, 182, 178, 178); /* Here p is the address to the pixel we want to retrieve */ Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp; switch (bpp) { case 1: return *p; case 2: return *(Uint16 *)p; case 3: if (SDL_BYTEORDER == SDL_BIG_ENDIAN) return p[0] << 16 | p[1] << 8 | p[2]; else return p[0] | p[1] << 8 | p[2] << 16; case 4: return *(Uint32 *)p; default: return 0; /* shouldn't happen, but avoids warnings */ } // switch } void tomaako_auto_seinaan() { if (getpixel(autona_oma, oma_x, oma_y) != bpp) { nopeus=0; } }
if (getpixel(autona_oma, oma_x, oma_y) != bpp)
Eikös tarkoituksena ollut tarkistaa, että törmääkö. Tuo laittaa nopeuden nollaan jos se ei ole osunut? (Päätellen !=)
Unohdin sen siihen. Se oli ensin == mutta auto ei kulkenut mihinkään. Aivan kuin se olisi ollut seinässä koko ajan, vaikka ei ollut.
Voisit opetella käyttämään luokkia (class) tai tietueita (struct), niin saisit koodista paljon selkeämmän näköistä.
Eikö sitä saa muilla tehtyä, kun en viitsisi tällä hetkellä vaivata päätä luokilla? Olen kyllä niihin tutustunut, mutta ei toistaiseksi mahdu aivokapasiiteettiin.
No siis saa, mutta ois selkeempää, jos jotkin jutut toteuttaisi olioilla...
No päätin hieman lukaista noita olioita kun pyysit.
class Auto { public: void Kiihdyta(); void Jarruta(); void Piirretaan(); void Kaantyminen(); void Ohjaus(); //VOiko tähän laittaa siis auton tehoihin liittyviä asioita esim: int Hevosvoimat=alakerran_tehot+kannen_tehot; int pito=etucamper+takacamper+renkaanpito+renkaslampo; };
Ja sitten se otetaan pihalle miten, kun noita funktioita opin jo käyttämään, mutta en ole täysin varma miten muuttujat otetaan pihalle oliosta?
E: Olen nyt hieman enemmän lukaissut vielä olioita, mutta en mistään löytänyt sitä, että miten voin liittää kuvan olioon? Ominaisuudet osaan liittää, mutta en ymmärtänyt täysin voinko jotenkin oliolla tarkastaa tuon get pixelin?
#include <iostream> class Auto{ private: int x, y; int xvel, yvel; public: void set_vel(int, int); void set_pos(int, int); int get_xvel(){return xvel;} int get_yvel(){return yvel;} int get_x(){return x;} int get_y(){return y;} }; void Auto::set_vel(int xvel, int yvel){ this->xvel = xvel; this->yvel = yvel; } void Auto::set_pos(int x, int y){ this->x = x; this->y = y; } int main(int argc, char *argv[]){ // luodaan automobiili Auto automobiili; // alustetaan sen koordinaatit automobiili.set_pos(13, 13); std::cout << "Auton x: " << automobiili.get_x(); << " y: " << automobiili.get_y(); // auton kiihtyvyys vaakatasossa 13 automobiili.set_vel(13, 0); // auton uusi kohta automobiili.set_pos(automobiili.get_x() + automobiili.get_xvel(), automobiili.get_y() + automobiili.get_yvel()); std::cout << "Auton x: " << automobiili.get_x(); << " y: " << automobiili.get_y(); // dynaaminen Auto *automobiili2 = new Auto; automobiili2->set_xvel(13,13); // .. delete automobiili2; return 0; }
Juu. Kiitos tuo opetti jo paljon olioista, mutta ei sitä mitä yritän tällä hetkellä.
Miten voin getpixelin (Eli törmäyksen) tehdä olion avulla tiettyyn väriin? Vai teenkö olion rata ja olion radan_seinat ja jos olio Auto törmää olioon radan_seinat niin tapahtuu jotain? No ok. Miten sitten saan tehtyä siihen olioon sen kuvan, että mihin se tarkistaa törmäyksen?
Samalla tavalla niitä tuonne luokan sisällekkin laitetaan.
class Auto { private: SDL_Surface *kuva; public: Auto(); ~Auto(); void AsetaKuva(SDL_Surface *uus_kuva); bool Tormaako(SDL_Surface *toinenkuva); }; /* Konstruktori on metodi, joka suoritetaan luodessa. Eli... asetetaan arvot oletuksille. */ Auto::Auto() { kuva = 0; } /* Destruktori on metodi, joka suoritetaan tuhottaessa. Eli... vapautetaan muistit, jos sellasia on dynaamisesti varattu. */ Auto::~Auto() { if(kuva) SDL_FreeSurface(kuva); } void Auto::AsetaKuva(SDL_Surface *uus_kuva) { kuva = uus_kuva; } bool Auto::Tormaako(SDL_Surface *toinenkuva) { /* Vertaile auton kuvaa ja parametrina annettua toista kuvaa käymällä pikselit läpi. */ }
Collision Detection
Per-pixel Collision Detection
Circular Collision Detection
Lue edellä annetut ohjeet, sekä linkkien takana olevat oppaat. Suosittelen muutenkin lukemaan lazyfoon oppaat ja artikkelit. Edellisten lisäksi suosittelen hankkimaan käsiisi Päivi Hietasen kirjan 'C++ ja olio-ohjelmointi'. Tämän jälkeen (jos vielä jotain kysyttävää on) voit tulla kysymään lisää ohjeita. Ilman kirjan lukemistakin kysymäsi asia selviää.
Ehkä olisi myös hyvä sisäistää mitä tuo rivi itseasiassa tekee:
if(getpixel(screen, auto_x - 1, auto_y - 1) == seinan_vari)
Ensinnäkin, mitä parametreja funktio getpixel ottaa sisään, ja mitä se palauttaa? screen on kuva josta pikseli luetaan
auto_x - 1 vaakasuuntainen koordinaatti auton piirtopisteestä yhden vasemmalle
auto_y - 1 pystysuuntainen koordinaatti auton piirtopisteestä yhden ylöspäin
Jos auton kulma on 45 astetta ja auton kuvan leveys 50 pikseliä, kuinka lasket paljonko lisätään auton X ja Y koordinaatteihin jotta tiedät mistä kohtaa pikseli pitää oikeasti lukea?
Siihen tarvitset todennäköisesti hitusen matematiikan taitoja ja sin,cos,arccos laskentaa. Yllä mainituissa linkeissä on todennäköisesti valmista koodia.
getpixel()-funktio palauttaa yhden lukuarvon joka tarkoittaa väriä joka siinä kohdassa kuvaa on. Mitä ne luvut sitten käytännössä tarkoittavat ja kuinka RGB niihin liittyy sinun tulee ottaa selvää SDL:n oppaista. Voit esimerkiksi laittaa ohjelman kirjoittamaan näytölle mitä funktio kulloinkin numerona palauttaa ja päätellä siitä mikä "seinan_vari" on.
Aihe on jo aika vanha, joten et voi enää vastata siihen.