Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] Miganie mapy kafelkowej

Ostatnio zmodyfikowano 2013-08-03 13:21
Autor Wiadomość
bbcodepl
Temat założony przez niniejszego użytkownika
[SFML] Miganie mapy kafelkowej
» 2013-08-03 11:07:30
Witam. Napotkałem się na dziwny problem. Po otworzeniu aplikacji mapa kafelkowa jest w dobrym miejscu, wszystko pięknie, ładnie, ale strasznie miga (pojawiają się obrazki i znikają - tak jakby nie było podwójnego buforowania). Prosiłbym o odpowiedź.

C/C++
#include <SFML/Graphics.hpp>
#include <string>

using namespace sf;
using namespace std;

const int siatkaGry = 40, szerokoscAplikacji = siatkaGry * 20, wysokoscAplikacji = siatkaGry * 15, glebiaKolorow = 32;
const double wersjaGry = 1.0, szybkoscAplikacji = 1.0;
const string tytulAplikacji = "Gra";
const int szerokoscMap = 20, wysokoscMap = 15;
int aktualnaMapa[ wysokoscMap ][ szerokoscMap ], lokacjaPostaci = 1;
int R = 0, G = 0, B = 255;

Image obrazekPierwszy;
Sprite spritePierwszy;
RenderWindow oknoAplikacji;

int main()
{
    obrazekPierwszy.LoadFromFile( "obrazek.png" );
    obrazekPierwszy.SetSmooth( false );
    spritePierwszy.SetImage( obrazekPierwszy );
    RenderWindow oknoAplikacji( VideoMode( szerokoscAplikacji, wysokoscAplikacji, glebiaKolorow ), tytulAplikacji );
   
    if( lokacjaPostaci == 1 )
    {
        int aktualnaMapa[ wysokoscMap ][ szerokoscMap ] =
        {
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
        };
       
        for( int y = 0; y < wysokoscMap; y++ )
        {
            for( int x = 0; x < szerokoscMap; x++ )
            {
                if( aktualnaMapa[ y ][ x ] == 1 )
                {
                    spritePierwszy.SetPosition( x * siatkaGry, y * siatkaGry );
                    oknoAplikacji.Draw( spritePierwszy );
                }
            }
        }
    }
   
    while( oknoAplikacji.IsOpened() )
    {
        Event zdarzenieAplikacji;
        while( oknoAplikacji.GetEvent( zdarzenieAplikacji ) )
        {
            if( zdarzenieAplikacji.Type == Event::Closed )
                 oknoAplikacji.Close();
           
        }
        //oknoAplikacji.Clear(Color(R, G, B));
        oknoAplikacji.Display();
    } //PETLA GRY
}
P-89360
MrPoxipol
» 2013-08-03 11:09:32
Nie na tym polega rysowanie. Musisz utworzyć dla każdego kafelka sprajt, ustawić mu położenie i w pętli rysować wszystkie kafle. Jeden obieg pętli to jedna klatka.
P-89362
bbcodepl
Temat założony przez niniejszego użytkownika
» 2013-08-03 11:25:08
Czyli, miałbym napisać 300 sprite'ów, które przyjmują ten sam obrazek?
P-89363
pjpeg_objected
» 2013-08-03 11:31:52
Musisz rysować kafle w pętli gry. Czyli wrzuć tą funkcję do rysowania mapy pomiędzy Clear(), a Display().
P-89364
bbcodepl
Temat założony przez niniejszego użytkownika
» 2013-08-03 11:46:24
Dzięki za pomoc - działa ;). Ale mam jeszcze jeden problem.
Zrobiłem funkcje 'rysujMape' w pętli gry, żeby nie było potem bałaganu w kodzie:
C/C++
while( oknoAplikacji.IsOpened() )
{
    Event zdarzenieAplikacji;
    while( oknoAplikacji.GetEvent( zdarzenieAplikacji ) )
    {
        if( zdarzenieAplikacji.Type == Event::Closed )
             oknoAplikacji.Close();
       
    }
    rysujMape();
    oknoAplikacji.Display();
} //PETLA GRY

I tym razem mam czarny ekran - nie pojawiają się w ogóle obrazki.

C/C++
void rysujMape()
{
    if( lokacjaPostaci == 1 )
    {
        int aktualnaMapa[ wysokoscMap ][ szerokoscMap ] =
        {
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
        };
       
        for( int y = 0; y < wysokoscMap; y++ )
        {
            for( int x = 0; x < szerokoscMap; x++ )
            {
                if( aktualnaMapa[ y ][ x ] == 1 )
                {
                    spritePierwszy.SetPosition( x * siatkaGry, y * siatkaGry );
                    oknoAplikacji.Draw( spritePierwszy );
                }
            }
        }
    }
}

Od wczoraj dopiero się zaczynam uczyć SFML, więc nie bijcie :D
P-89365
pjpeg_objected
» 2013-08-03 11:49:05
Nie czyścisz ekranu. Wstaw przed rysujMape: oknoAplikacji.Clear().
P-89366
bbcodepl
Temat założony przez niniejszego użytkownika
» 2013-08-03 11:51:10
Już próbowałem tego wcześniej - nie działa :/
P-89368
pjpeg_objected
» 2013-08-03 12:09:52
Zauważ gdzie definiujesz zmienną aktualnaMapa. Znajduje się ona w ifie czyli jest tylko w tym ifie dostępna.
P-89370
« 1 » 2 3
  Strona 1 z 3 Następna strona