Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje > Pravljenje igara

Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 7.11.2010, 17:25   #1
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom Allegro bug, draw_sprite i show_mouse

Napravio sam igricu u C jeziku, koristeci Allegro biblioteke. Igrica savrseno radi medjutim postoji jedan bug.

Prvo: Koristim double buffer tehniku (mislim da je to to: kada napravim bitmap buffer pa na njega stavljam sprites i onda ga takvog iscrtavam na screen, umjesto so bih sprites direktno iscrtavao na screen). Na ekranu se pojavi tabla sa 15x15 polja. Ucestvuju 4 igraca. Igrac treba da klikne na polje, da bi se na tom polju ucrtalo njegovo slovo. Pobjednik je onaj koji prvi sklopi cetiri ista slova. Igrica je slicna Iks-Oks igrici. (to je igrica)

Drugo(bug): Kada ja kliknem na polje, i ostavim kursor misa tu gde jeste, slovo se ne isrcta cijelo, nego samo onaj dio koji nije prekriven misom :/. A ako kliknem na polje i brzo pomerim misa slovo se citavo iscrta

SS:
http://img838.imageshack.us/f/bugze.png/ (samo nema misa, nmg njega da uhvatim xD)

Petlju koju koristim za iscrtavanje
Kod:
while (!close_button_pressed) // Ako je pritisnuto close dugme u titlebar-u zavrsi while petlju
    {    
        show_mouse(buffer);
        blit(buffer, screen, 0,0,0,0,WINDOW_X, WINDOW_Y);
   	    CheckWinner(); // Provjerava pobjednika, ako ima pobjednika winner = 1
        if (mouse_b & 1 ) 
        {           
            mx = mouse_x; 
            my = mouse_y; 
            
            if ( (mx >= 268 && mx <= 611) && (my >=16 && my <= 360) )  // Dio table na koji moze da se klikce, sve ostalo se ne prihvata
            { 
                Koordinate(mx, my);   // dodjeljivanje koordinata slovu koje treba da se isrcta  kao i odredjivanje broja polja koje je kliknuto i u koje treba da se ucrta slovo
                sleep(200); // Kada kliknem na polje, program ucita da sam vise puta pritisnuo klik, zato koristim sleep(200)l, da program ucita samo 1 klik.

                if(polje[p] == 0) // Ako je polje prazno, upisi slovo, ako nije, ne radi nista
                {
                    if(i == 1) polje[p] = 'P'; // popunjava polje za kasniju provjeru pobjednika
                    if(i == 2) polje[p] = 'M'; 
                    if(i == 3) polje[p] = 'N'; 
                    if(i == 4) polje[p] = 'L';
                            
                    draw_sprite(buffer, data[i++].dat, koordinata_x, koordinata_y);
                    printf("Slovo: %c\n", polje[p]);
                    }   
                
                show_mouse(buffer);
                }
             } 
                 
               
           if(i == 5) i = 1;  //  igraci su definisani promenjljivom i, ako je i = 5,(peti igrac ne postoji) vrati i na 1 (igrac 1 je ponovo na potezu)
           if (winner == 1 ) // Ako ima pobjednika, obrisi tablu za novu rundu
           {
               NewRound(); // Ako ima pobjednika izvrzava se ovo. Ovo cisti citavu tablu, i namjesta sve opcije za novu partiju
           }
evo i .zip fajl od igrice da vidite kako izgleda to:
http://www.sendspace.com/file/k1ctjw
(Mislim da su to svi potrebni fajlovi, da se igrica startuje na bilo kom racunaru, ako nesto fali, napomenite)

Primjeticete da postoji konzola. Na pocetku startovanja programa, pali se konzola i u njoj kucate nikove za igrace P, M, N i L. Zatim se pali igrica. Konzola i dalje ostaje i u njoj ce se ispisivati koordinate i broj polja.

Poslednja ispravka: clzola (7.11.2010 u 17:43)
clzola je offline   Odgovor sa citatom ove poruke
Stara 7.11.2010, 21:14   #2
clzola
Član
 
Član od: 14.4.2010.
Lokacija: Podgorica
Poruke: 332
Zahvalnice: 61
Zahvaljeno 11 puta na 11 poruka
Određen forumom Re: Allegro bug, draw_sprite i show_mouse

Uspio sam da rijesim problem:

"Description

void show_mouse(BITMAP *bmp);
Tells Allegro to display a mouse pointer on the screen. This will only work if the timer module has been installed. The mouse pointer will be drawn onto the specified bitmap, which should normally be `screen' (see later for information about bitmaps). To hide the mouse pointer, call show_mouse(NULL).

Warning: if you draw anything onto the screen while the pointer is visible, a mouse movement interrupt could occur in the middle of your drawing operation. If this happens the mouse buffering and graphics drawing code will get confused and will leave 'mouse droppings' all over the screen. To prevent this, you must make sure you turn off the mouse pointer whenever you draw onto the screen. This is not needed if you are using a hardware cursor.

Note: you must not be showing a mouse pointer on a bitmap at the time that the bitmap is destroyed with destroy_bitmap(), e.g. call show_mouse(NULL); before destroying the bitmap. This does not apply to `screen' since you never destroy `screen' with destroy_bitmap()."

Tako da sam u gornjem kodu prije linije:
draw_sprite(buffer, data[i++].dat, koordinata_x, koordinata_y);
stavio show_mouse(NULL); tako da program makne kursor prije crtanja a zatim ga ponovo vrati.

Poslednja ispravka: clzola (7.11.2010 u 22:08)
clzola je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Allegro clzola Programiranje 0 1.11.2010 18:09


Sva vremena su po Griniču +2 h. Sada je 10:23.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com