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--;} } } }
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.
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ä ;)
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?
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.
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.
sadasosasekunti riittää minulle! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.