Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Törmäys

Sivun loppuun

mika132 [28.01.2010 01:33:07]

#

Eli jälleen tähän samaan hienoon aiheeseen, kun olen muut asetelmat saanut jo Code::Blockin kanssa tehtyä niin mistä johtuu että koodini ei toimi. Miten sen pitäisi toimia/törmäys suunnitelma:

Jos auto törmää seinään sen vauhti menee nollaan.
Tarkistus:
Katsotaan jos auto törmää tiettyyn väriin niin vauhti putoaa nollaan.

Mutta ei mene suunnitelmien mukaan vaan käytännössä vauhti putoaa kokoajan nollaan.

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 Auto::tomaako_auto_seinaan()
{
    if (getpixel(autona_oma, oma_x, oma_y) == bpp)
    {
        nopeus=0;
    }
}

sqwiik [28.01.2010 09:49:26]

#

Alustat muuttujaan bpp jonkin tietyn värin, kun siinä kuuluisi olla pinnan BytesPerPixels-arvo jonka avulla voidaan laskea pikselin sijainti.

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    Uint32 bpp = surface->format->BytesPerPixel;
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
...

Macro [28.01.2010 09:50:20]

#

Mikset käyttäisi oikeita kooditageja?

mika132 [28.01.2010 13:32:38]

#

Mistä minä tiedän mikä on sen BytesPerPixel arvo? Ja jos se pitäisi olla valmiina tuolla niin tekee samaa vieläkin.

Teuro [28.01.2010 13:53:19]

#

Lue tuo sqwiikin vastaus uudestaan, siellä on vastaus, että mistä se arvo tulee.

mika132 [28.01.2010 14:24:12]

#

No nyt on jotain hämminkiä. Seinä tulee ihan yhtäkkiä keskellä rataa kurvissa.

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    Uint32 bpp = surface->format->BytesPerPixel;
    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 Auto::tomaako_auto_seinaan()
{
    if (getpixel(autona_oma, oma_x, oma_y) != bpp)
    {
        nopeus=0;
    }
}

Ja saan ajaa seinää päin minkä tarkoitus olisi olla seinä, mutta siitä ei tapahdu mitään. Ja ns. Pääsuoran pääsen ajamaan täysillä kunnes yhtäkkiä matka pysää näkymättömään seinään.

sqwiik [28.01.2010 15:55:39]

#

Katsot pikselin värin bittikartasta 'autona_oma'. Onko tämä varmasti oikea bittikartta lukea estedataa? Ja miten olet määritellyt muuttujan 'bpp' arvon törmäysfunktiossa?

mika132 [28.01.2010 16:40:38]

#

Nyt en ymmärtänyt kun tarkoitus olisi katsoa osuuko auto seinään ja seinällä on oma värinsä. Missä tämä kohta määritellään, että jos auto osuu rata_1 kuvan väriin (182, 178, 178) eli hopeahkoon väriin niin vauhti laitetaan nollaan.

sqwiik [29.01.2010 08:46:25]

#

Eikös tällöin olisi siis hyvä katsoa sen pikselin väriarvo kyseisestä bittikartasta (rata_1) eikä muualta (autona_oma)?

Sinulla oli jo aloitusviestissä kaikki tarvittavat funktiot tiedossa (SDL_MapRGB & co.), joten nistä soveltamalla:

    if (getpixel(rata_1, oma_x, oma_y) != SDL_MapRGB(rata_1->format, 182, 178, 178))
    {
...

tkok [29.01.2010 09:01:21]

#

mika132 kirjoitti:

(182, 178, 178) eli hopeahkoon väriin niin vauhti laitetaan nollaan.

Toivottavasti tämä hopeahko alue on tarpeeksi paksu ja täsmälleen samaa väriä että törmäys ehditään huomata ennen kun mennään läpi

mika132 [29.01.2010 11:45:47]

#

No nyt kun painan kaasua niin auto pysää lähestulkoon heti. Onko muita tapoja testata törmätäänkö seinään?

User137 [29.01.2010 13:58:41]

#

Käytätkö autossasi samaa hopeahkoa väriä? (Ei pitäisi olla merkitystä jos luet pikselin oikein radasta) On muita tapoja testata törmäys mutta se ei taida olla pointti, sillä tämä on kaikista helpoin. Sulla on joku yksinkertanen typo jossakin.

Onko radassa samaa hopean väriä? Et näyttänyt vielä kuvaa tilanteesta, missä kohtaa se ensimmäisenä törmää?

mika132 [29.01.2010 14:42:12]

#

Ei tuosta voi ottaa mitään kuvaa.

Lähden lähdöstä ja ajan puolet autoni mitasta ja auto pysää ja menee pätkimällä eteenpäin koska vauhtia laitetaan koko ajan ollaan auton muka osuessa seinään. Jatkan vain eteenpäin ja yhtäkkiä auto lähtee taas liikkeelle. Pysää taas yhtäkkiä näkymättömään seinään. Jurrutan hetken eteenpäin ja taas pääsen täysillä hetken matkaa. Taas tulee näkymätön seinä. Eli käytännössä tuo rata on täynnä näkyättömiä seiniä.

Autoni on punainen. Eli ei ole samaa väriä seinän kanssa. Kuitenkin jonkilaine kuva näyttämään tilannetta. Piirsin viivoja sinne sun tänne missä auto tekee pysähtymisensä. HUOM! kaikkia kohtia ei näy tuossa, koska radasta osa on piilossa.

KUVA

Vaikuttaako se jotain kun rataa liikutetaan, jotta auto pysyisi kuvan keskellä?

sqwiik [29.01.2010 20:04:02]

#

Tarvitsemme lisää informaatiota että osaamme auttaa. Mihin sijainti (oma_x, oma_y) viittaa?

Edit: huomasinpa muuten äsken että laitat auton pysähtymään silloin kun väri _ei_ ole hopeanharmaa; vertailuoperaattorina != eli erisuuruus. Laita sen tilalle yhtäsuuruusvertailu == niin vertailu etenee suunnitellusti :)

User137 [29.01.2010 20:11:25]

#

Jos pikselin luku toimii oikein (voit tulostaa sen vaikka näytölle reaaliajassa jos tarvitset "debugata" senkin), niin vika voi olla koordinaateissa. Jos liikutat kuvaa niin matematiikan kanssa saa olla tarkkana. Käyttäisin ainakin itse kameratyylistä lähestymistapaa jolloin omaa autoa ei piirretä automaattisesti keskelle vaan:

// keskitetään kamera omaan autoon
Kamera_X = auto[0].x - Ruudun_leveys*0.5
Kamera_Y = auto[0].y - Ruudun_korkeus*0.5

PiirraKartta(0-Kamera_X, 0-Kamera_Y) // radan yläkulma on pisteessä 0,0
For jokainen auto[n]
  PiirraAuto(auto[n].x-Kamera_X, auto[n].y-Kamera_Y)

mika132 [30.01.2010 12:45:43]

#

Eikös tämä aja saman asian:

temp_2 = rotozoomSurface(autona, rad2deg(vas_1_suunta), 1, 1);
PiirraKuva(rata_1, naytto, 350-oma_x, -880-oma_y); //Piirretaan rata
PiirraKuva(temp_2, naytto, vas_x_1 / 2 - temp_2->w / 2, vas_y_1 / 2 - temp_2->h / 2);
TekstitKisa(naytto);
SDL_FreeSurface(temp_2);

Ja koodissani oli == kun huomasin itsekkin sen, mutta se ei korjannut ongelmaa vaan edelleen auto törmää näkymättömään seinään.

User137 [30.01.2010 16:39:20]

#

Ei aja samaa asiaa. Periaatteessa kyllä mutta jos teet noin niin sinun pitää ottaa se huomioon siinä vaiheessa kun kutsut getpixel(rata_1, oma_x, oma_y)

Pitäisi mennä jotenkin
getpixel(rata_1, oma_x-350+ vas_x_1 / 2, oma_y+880+vas_y_1 / 2)

En osaa äkkiseltään sanoa toimiiko noin...

Mutta jos käytät mainitsemaani kamera muuttujaa niin riittää pelkkä
getpixel(rata_1, oma_x, oma_y)

Metabolix [30.01.2010 16:47:07]

#

Kannattaisi ensin tehdä toimiva systeemi niin, että rata on paikallaan ja auto liikkuu. Se vaatisi vähemmän laskutaitoa.

mika132 [30.01.2010 23:03:42]

#

No yritinpä tehdä tuota sinun systeemiäsi kamera ominaisuudeksi, mutta ei nyt ymmärrä. Autoni on olio. Miten saan siitä tuolla tavalla taulukon, eli siis mistä tuo taulukko tietää minkä auton x ja y se ottaa ja mistä se saa arvon x ja y?

Miten annan arvon n? Ja mikä on auto[0]. Ei tuo tiedä, että se on pelaajan auto.

vehkis91 [30.01.2010 23:51:00]

#

auto autot[3];

tuo tekee taulukon, jossa on 3 auto olioo...

Metabolix [31.01.2010 00:22:31]

#

User137 oletti, että autoja on monta ja että ne ovat taulukossa siten, että ensimmäisenä on pelaajan oma auto. Voit siis jättää taulukkoasiat ja for-silmukan huomiotta. Siitä huolimatta ehdotettu toimintatapa eli kameran koordinaattien säilyttäminen erillään on hyvä ehdotus. Ensin kuitenkin suosittelen (kuten äskenkin) toteutusta niin päin, että rata pysyy paikallaan ja auto liikkuu. Älä sekoita piirtokoodia ja logiikkaa!

mika132 [31.01.2010 02:23:36]

#

Siis joo on autoja enemmän kuin yksi (6-8kpl rippuuen muutamista asioista.)

En voi mitenkään liikuttaa kameraa ilman OpenGL niin, että rata pysyy paikallaan, joten minun on pakko käyttää noita "trikki" kamera liikutuksia. Eikö? Eli mikä ohjeeksi. Tein kaiken kuten aikaisemmin, eli lisäsin if (getpixel(600 - oma_x / 2 Y:lle SAMA

niin se alkoi herjaamaan kolmos erroria eli määritettyä polkua ei löydy. Miten niin ei muka voi löytyä polkua kun kyseessä on vain koodi rivi?

User137 [31.01.2010 03:42:30]

#

Se että rata on paikallaan tarkottaa sitä että testinä unohdetaan koko kamera ja piirretään pelaaja sinne missä se on. Sinun koodipätkä muokattuna:

temp_2 = rotozoomSurface(autona, rad2deg(vas_1_suunta), 1, 1);
PiirraKuva(rata_1, naytto, 0, 0); //Piirretaan rata
PiirraKuva(temp_2, naytto, oma_x - temp_2->w / 2, oma_y - temp_2->h / 2);
TekstitKisa(naytto);
SDL_FreeSurface(temp_2);

Tuon koodin kanssa käy getpixel(rata_1, oma_x, oma_y)

Käytännössä rata siis pysyy tuossa paikallaan ja auto liikkuu. Tarkoituksena vain testata törmääkö auto.

Voi olla että tarvitset näyttää enemmän koko lähdekoodia jotta enempää voi auttaa.

mika132 [31.01.2010 14:36:51]

#

Juu se toimi sillä perjaatteella, että karttaa ei liikuteta mihinkään. Ei ole kyllä ihan pixeli tarkkaa, mutta kai tuo nyt kelpaa. =)

Jaa lähdekoodia? No laitan jotain ensimmäinen pätkä liittyy "kameran" hallitsemiseen:

void KisanPiirtaminen(SDL_Surface *naytto) {
    PiirraKuva(rata_1, naytto, 350-oma_x, -880-oma_y); //tässä piirretään siis rata. Se liikkuu siis pelaajan x,y suhteessa niin, että mennään keskellä.
    TekstitKisa(naytto);

Seuraavassa on taas kaikki liittyen autoon ja sen ajamiseen sekä muuhun. Aloitan olio hössötyksestä:

class Auto
{
public:
	void Kiihdyta();
	void Piirretaan();
	void Ohjaus();
	void Kierroslukumittari();
	void tomaako_auto_seinaan();
};

void Auto::Ohjaus() {
			Uint8 *nappi;
			nappi = SDL_GetKeyState(NULL);
			if (nappi[SDLK_LEFT])
			{
				NEWTONVOIMA=nopeus/PITO/200;
				if (nopeus >= 6)
				{
					KAANTYMINEN=0.02+suunta/4000;
				}
				if (nopeus >= 3.01 && nopeus <= 5.99)
				{
					suunta=auton_suunta;
					KAANTYMINEN=0.06;
				}
				else if (nopeus <= 3)
				{
					suunta=auton_suunta;
					KAANTYMINEN=0.1;
				}
				NEWTONVOIMAA+=0.001;
					auton_suunta+=KAANTYMINEN;
					suunta+=NEWTONVOIMA;
			}
			else
			{
					if (suunta <= -0.01)
					{
						if (suunta >= auton_suunta-3 && suunta <= auton_suunta+3)
						{
							suunta=auton_suunta;
						}
						else if (suunta < auton_suunta)
						{
							suunta+=0.1;
						}
						else if (suunta > auton_suunta)
						{
							suunta+=0.1;
						}

					}
			}
			if (nappi[SDLK_RIGHT])
			{
				NEWTONVOIMA=nopeus/PITO/200;

				if (nopeus >= 6)
				{
					KAANTYMINEN=0.02-suunta/2000;
				}
				if (nopeus >= 3.01 && nopeus <= 5.99)
				{
					suunta=auton_suunta;
					KAANTYMINEN=0.06;
				}
				else if (nopeus <= 3)
				{
					suunta=auton_suunta;
					KAANTYMINEN=0.1;
				}
				NEWTONVOIMAA+=0.001;
				auton_suunta-=KAANTYMINEN;
				suunta-=NEWTONVOIMA;
			}
			else
			{
					if (suunta <= -0.01)
					{
						if (suunta >= auton_suunta-3 && suunta <= auton_suunta+3)
						{
							suunta=auton_suunta;
						}
						else if (suunta <= auton_suunta-3.01)
						{
							suunta-=0.1;
						}
						else if (suunta >= auton_suunta+3.01)
						{
							suunta-=0.1;
						}

					}
			}
			if (nappi[SDLK_DOWN])
			{
				nopeus -= JARRUJENTEHO;
				if (nopeus < 0.0)
				{
					nopeus = 0.0;
				}
			}
			if (nappi[SDLK_UP])
			{

				KIIHTYYNYT = KIIHTYVYYS;
				if (VAIHDE <= VAIHDELAATIKKO)
				{
					KIIHTYYNYT = KIIHTYVYYS;

				}
				else if (VAIHDE >= VAIHDELAATIKKO)
				{
					KIIHTYYNYT = 0;
				}
				nopeus+=KIIHTYYNYT;
				if (nopeus > MAKSIMI_NOPEUS)
				{
					nopeus = MAKSIMI_NOPEUS;
				}
			}
			else
			{
				nopeus -= HIDASTUVUUS;
				if (nopeus < 0.0)
				{
					nopeus = 0.0;
				}
			}
}

void Auto::Kiihdyta() {
	nopeus += KIIHTYYNYT;
}

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    Uint32 bpp = surface->format->BytesPerPixel;
    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;
    }
}




void Auto::tomaako_auto_seinaan()
{
    if (getpixel(rata_1, 350-oma_x / 2, -880-oma_y / 2) == SDL_MapRGB(rata_1->format, 182, 178, 178))
    {
        nopeus=0;
    }
}


void Auto::Piirretaan(){
	temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1);
	temp_1 = rotozoomSurface(mittari_itse, rad2deg(suunta_nopeus), 1, 1);
	temp_3 = rotozoomSurface(mittari_itse, rad2deg(suunta_kierrosluku), 1, 1);
	temp_4 = rotozoomSurface(bensa_mittari_itse, rad2deg(suunta_bensa_mittari), 1, 1);
	PiirraKuva(mittari, naytto, 0, 0);
	PiirraKuva(kierrosluku_mittari, naytto, 139, 0);
	PiirraKuva(bensa_mittari, naytto, 278, 52);
	PiirraKuva(temp, naytto, 800 / 2 - temp->w / 2, 600 / 2 - temp->h / 2);
	PiirraKuva(temp_1, naytto, 67 - temp_1->w / 2, 50 - temp_1->h / 2);
	PiirraKuva(temp_3, naytto, 207 - temp_3->w / 2, 50 - temp_3->h / 2);
	PiirraKuva(temp_4, naytto, 312 - temp_4->w / 2, 78 - temp_4->h / 2);
	TekstitKisa(naytto);
	SDL_FreeSurface(temp);
	SDL_FreeSurface(temp_1);
	SDL_FreeSurface(temp_3);
	SDL_FreeSurface(temp_4);
	SDL_Flip(naytto);
}

void Auto::Kierroslukumittari() {
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;
				}
			}
}

Sitten tuo kisatilanteen omat jutut:

if (huone==4) //Eli kilpailu huone
{
	Auto OmaAuto;
	KisanPiirtaminen(naytto);
	OmaAuto.Ohjaus();
	OmaAuto.Piirretaan();
	SDL_Flip(naytto);
	oma_x += cos((float) auton_suunta) * nopeus;
	oma_y -= sin((float) auton_suunta) * nopeus;

	suunta_nopeus=-nopeus/7;
	VaihteistaTulevaPotku=nopeus/VAIHDEPAALLA;
	OmaAuto.tomaako_auto_seinaan();
	OmaAuto.Kierroslukumittari();
}

Siinä pitäisi olla kaikki tarpeellinen. Ongelma:
Törmätessäni seinään tulee errori 3 joka tarkoittaa "määritettyä polkua ei löydy" mitä ihmeen polkua? Ja se tuli lisättyäni tämän rivin peliin:

if (getpixel(rata_1, 350-oma_x / 2, -880-oma_y / 2) == SDL_MapRGB(rata_1->format, 182, 178, 178))

mika132 [31.01.2010 18:27:29]

#

Nyt minä keksein! Jos teen työkalun jolla voin tehdä ratoja eli laitan tilesettejä ohjelmassani jokapaikkaan jotta siitä tulee rata seinät yms. Sitten päätän seinien ja radan Z arvon mikä tallentuu johonkin. Eli tarkemmin suunnitelmani kun suunnittelin sitä jo hieman:

Jos tiet ehdään esim Z arvo yhteen (1) ja seinä kahteen (2). Sitten tallennan tuotokseni työkalullani johonkin formaattiin ja peliin kun se avataan se etsii kaikki Z arvot ja grafiikat. Auto olioon laitetaan, että Z=1 eli kulkeminen. Kisa engineen laitetaan, että jos auto Z=2 ni vauhti=0.

Ongelmaan:
Minulla ei ole hajuakaan miten tälläinen tuotos tallennettaisi jollakin työkalulla. Eli miten teen työkaluuni tallennuksen, että grafiikka ruoho on x,y,z arvoissa: (10, 10, 1) (20, 10, 1) (30, 10, 1)

sitten miten tuo avataan pelissä niin, että se ymmärtää sen ja mihin formaattiin tuollainen tallennetaan? Joudunko tekemään kokonaan oman formaatin esim: .rata No miten avaan sen sitten pelissäni, kun se on oma formaattinsa?

Paljon kysymyksiä, toivon, että osaisitte vastata.


E: Mitä mietein niin se voisi olla esim .rata tiedostossa näin:

0,0,1,data/grafiikat/ruoho.bmp //eli x,y,z,kuva
10,0,1,data/grafiikat/ruoho.bmp
20,0,1,data/grafiikat/ruoho.bmp
30,0,1,data/grafiikat/ruoho.bmp
0,20,2,data/grafiikat/seina.bmp
10,20,2,data/grafiikat/seina.bmp
20,20,2,data/grafiikat/seina.bmp
0,10,1,data/grafiikat/tie.bmp
10,10,1,tie.bmp
20,10,1,tie.bmp

vehkis91 [31.01.2010 19:45:23]

#

Suunnitelet oman formaatin ja koodaat lataajan, joka osaa avata sen sun formaattis, ei ole kovin monimutkaista. Itse suunnittelin formaatin yhteen tilepohjaiseen peliin, eikä siinä menny ku pari tuntia.

Mulla on tiedosto, joka sisältää kaikkien tilejen nimen ja niiden tyypin:

Tässä vähän esimerkkiä.

wall1 20
floor1 100
floor2 101

Tuon tiedostoratkaisun takana oli se, että peliin on myöhemmin helppo lisätä tilejä, suoraan lisäämällä niitä tuohon tiedostoon...

sitten karttatiedostotssa on ekalla rivillä, pelaajan alkukoordinaatit sekä kartan koko.

sitten tulee vihollisten tiedot, tyyppi, sijainti, energiat sun muut.

tämän jälkeen tulee kartta...

laitan pienen esimerkin.

//kentän koko 3x3, pelaajan alkukoordinaatit 2,2
3 3 2 2

//2 vihua ja niiden tiedot
1 272 448 20 2
1 304 448 20 2

//tilejen tyypit, jotka lukee toisessa tiedostossa.
20 20 20
20 100 20
20 101 101

Toivottavasti oli vähän apua, kuten varmaan huomaat, niin tuota formaattia ei ole suunniteltu rallipeliin, mutta voi tosta ehkä jotain vinkkejä ottaa...

Metabolix [31.01.2010 19:54:07]

#

Yksi mahdollisuus on vain tehdä kaksi kuvaa, joista toinen sisältää radan varsinaisen kuvan ja toisessa on harmaasävyinä merkitty, missä voi liikkua. Valkoinen voisi tarkoittaa rataa ja musta seinää, ja samalla vaivalla muut harmaasävyt voisivat tarkoittaa osittain hidastavia alueita (kuten mutaa tai vettä). Tällöin getpixel tästä kuvasta kertoisi, miten hyvin kyseisessä kohdassa voi liikkua.

Muista tehdä tarkistus ennen siirtymistä. Jos teet tarkistuksen vasta siirtymisen jälkeen, et ehkä ikinä pääse seinästä irti, koska auto ajaa seinän sisään ennen pysähtymistä.

mika132 [31.01.2010 20:34:24]

#

Tuo ei korjaa sitä tosi seikkaa minkä kirjoitin jo aikaisemmin. Eli saan windows 3 erroria "määritettyä polkua ei löydy" kun lisään koodirivin:

if (getpixel(rata_1_esteet, 350-oma_x / 2, -880-oma_y / 2) == SDL_MapRGB(rata_1_esteet->format, 182, 178, 178))

//toimii taas jos laitan näin:

if (getpixel(rata_1_esteet, oma_x, oma_y) == SDL_MapRGB(rata_1_esteet->format, 182, 178, 178))

//Mutta silloin x ja y on ihan päin hometta eli seinät tulee missä sattuu.

Silti tuolla koodin pätkällä se ei pysää seiniin, mutta katkaisee pelin jossain kohtaa heittäen errorin kolme. Ylempänä on enemmän noita koodeja tähän liittyen.

Metabolix [31.01.2010 20:42:29]

#

Mistä ihmeestä olet keksinyt nuo arvot ensimmäiselle riville? Jos oma_x ja oma_y ovat auton todelliset koordinaatit (ei ruudun keskellä), noista vaihtoehdoista jälkimmäinen vaikuttaisi paljon lupaavammalta.

Lisää joka tapauksessa getpixel-funktion alkuun tarkistus, että jos x tai y on kuvan ulkopuolella (x < 0 || x >= w jne.), palautetaan suoraan nolla. Muutenhan tuo voi kaatua.

mika132 [31.01.2010 22:08:28]

#

No sehän kaatuu silloinkin kun palautetaan nolla? Niinhän pelikin lopetetaan, että palautetaan nolla? Tai sitten käsitin pahasti jotain väärin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta