Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++, SDL | Liikkumisongelmia

Touho [09.10.2004 23:31:43]

#

Tuossa on koodipätkä, joka pitäisi liikuttaa valkoista "neliötä" ruudulla. liikkuuhan se, mutta haluisin, että nappia voisi pitää pohjassa, joten neliö liikkuisi jatkuvasti eikä pelkästään yhden kerran per painallus.

tässä on looppi sekä kaksi funktiota, jota käytetään loopissa.

void Square(int cx, int cy, int width, int height, int R, int G, int B)
{
	Uint32 *bufp;
	Slock();
	for(x=cx;x<cx+width;x++)
	{
		bufp = (Uint32 *)screen->pixels + cy*screen->pitch/4 + x;
		*bufp = SDL_MapRGB(screen->format, R, G, B);
	}

	for(y=cy;y<cy+height;y++)
	{
		bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + cx;
		*bufp = SDL_MapRGB(screen->format, R, G, B);
	}
	Sulock();
}

void DrawScene(SDL_Surface *brick, int bricks[80][60], int cx, int cy)
{
	for (x=0;x<80;x++)  // Puskuriin kaikki palat
	for (y=0;y<60;y++)
	{
		switch(bricks[x][y])
		{
		case 1:
			{
				brick = SDL_LoadBMP("Bricks/1.bmp");
				break;
			}
		}
		if(bricks[x][y]>0) DrawIMG(brick, x*10, y*10);
	}

	Square(cx*10, cy*10, 10, 10, 255, 255, 255); //x, y, reunat, värit


	SDL_Flip(screen);
}

.......

	while (loop)
	{
		DrawScene(brick, bricks, cursor_x, cursor_y);


			while ( SDL_PollEvent(&event) )
			{
				if ( event.type == SDL_QUIT )  {return 0;}
				if ( event.type == SDL_KEYDOWN )
				{
					keys = SDL_GetKeyState(NULL);
					if ( keys[SDLK_RETURN]) {}
					if ( keys[SDLK_UP]) {if(cursor_y>0) cursor_y--;}
					if ( keys[SDLK_RIGHT]) {if(cursor_x<79) cursor_x++;}
					if ( keys[SDLK_DOWN]) {if(cursor_y<59) cursor_y++;}
					if ( keys[SDLK_LEFT]) {if(cursor_x>0) cursor_x--;}
				}
			}
	}

Metabolix [09.10.2004 23:41:40]

#

Mitäpä jos muuttaisit tuota viimeistä kohtaa tällaiseksi:

while (true)
{
    while (SDL_PollEvent(&event))
    {
        if ( event.type == SDL_QUIT ) break;
    }

    keys = SDL_GetKeyState(NULL);
    if ( keys[SDLK_UP]) {if(cursor_y>0) cursor_y--;}
    if ( keys[SDLK_RIGHT]) {if(cursor_x<79) cursor_x++;}
    if ( keys[SDLK_DOWN]) {if(cursor_y<59) cursor_y++;}
    if ( keys[SDLK_LEFT]) {if(cursor_x>0) cursor_x--;}

    DrawScene(brick, bricks, cursor_x, cursor_y);
}

Miksi ihmeessä tuolla alun perin edes oli tämä?

if ( keys[haka]SDLK_RETURN[/haka]) {}

Kannattaa muuten lisätä tuonne jokin aikaa laskeva ominaisuus, koska nyt silmukkaa suoritetaan jatkuvasti ja hyvin nopeasti.

Touho [09.10.2004 23:44:04]

#

minun oli tarkoitus tehä siihen ensin komento, mutta en tehnyt vielä, joten jätin sen siihen oleskelemaan :)

laitoin tuon sinun ehdotuksesi. silti liikkuu vaan yhden pykälän kerrallaan.

eikun nyt se rupes toimimaan! :D Kiitos!

sen aionkin tehdä ;)

Touho [10.10.2004 10:42:23]

#

Tuli uusi ongelma, mutta en viitsinyt tehdä uutta keskustelua.

Miten saa time.h:sta jotenkin irti sekuntien desimaaleja?

esim:

time_t counter;
counter=time(NULL);

...

if(time(0)>t_counter+0.3) liiku();

tässä if lauseke on tosi, kun sekunti on vaihtunut counterin alustamisesta, eli desimaalit eivät merkitse yhtään yhtään.

eli onko mahdollista saada time.h:sta desimaaleja?

tn [10.10.2004 11:34:04]

#

clock_t clock ( void );

Return number of clock ticks since process start.
Returns the number of clock ticks elapsed.
A macro constant called CLK_TCK defines the relation betwen clock tick and second (clock ticks per second).

Parameters.
(none)

Return Value.
The number of clock ticks elapsed since start.
clock_t type is defined by default as long int by most compilers.

Eli siis:

double ohjelmanAlustaKulunutAikaSekunteina = (double)clock() / CLK_TCK;

edit: Lisätty esimerkki.

Metabolix [10.10.2004 13:00:33]

#

Tuon tarkkuus on kaikkien muiden aikafunktioiden tavoin melkoisen alkeellinen, suunnilleen 1/100 sek, vaikka sen periaatteessa pitäisi toimia tarkimminkin. CLK_TCK saattaa kulkea nimellä CLOCKS_PER_SEC.

Touho [10.10.2004 13:25:07]

#

sadasosasekunti riittää minulle! :)

Vastaus

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

Tietoa sivustosta