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

[SDL] Poruszanie się po planszy

Ostatnio zmodyfikowano 2020-04-21 16:54
Autor Wiadomość
01101101
Temat założony przez niniejszego użytkownika
[SDL] Poruszanie się po planszy
» 2020-04-12 20:16:10
Witam serdecznie. Napisałem funkcję która ma za zadanie poruszać się po planszy i pobierać cyfry od użytkownika , póki co pracuje nad tym pierwszym

void wczytaj()
{
SDL_Rect Frame;
    Frame.h = 50;
    Frame.w = 50;
    Frame.x = 50;
    Frame.y = 50; 
    SDL_Surface *frame = NULL;
     frame = SDL_LoadBMP("Frame.bmp");

     if(frame==NULL)
     {
         printf("error");
     }
              
        if(SDLK_LEFT)
        {
            Frame.x+=50;
            SDL_BlitSurface(frame,NULL,renderer,&Frame);

        }

        if(SDLK_RIGHT)
        {

            Frame.x-=50;
            SDL_BlitSurface(frame,NULL,renderer,&Frame);
        }

        if(SDLK_UP)
        {

            Frame.y+=50;
            SDL_BlitSurface(frame,NULL,renderer,&Frame);
        }

        if(SDLK_DOWN)
        {
              Frame.y-=50;
              SDL_BlitSurface(frame,NULL,renderer,&Frame);
        }


      SDL_RenderPresent(renderer);

      SDL_FreeSurface(frame);
}
Po wywyołaniu funkcji w main w pętli event SDLK_KEYDOWN niestety nic specjalnego się nie pojawia, może ktoś wie dlaczego mój obrazek nie chce się przemieszczać?
P-176638
pekfos
» 2020-04-13 12:18:18
Jedna szybka rada: jeśli twój kod nie ma sensu czytając go dosłownie, to nie ma sensu w ogóle.
C/C++
if( SDLK_LEFT )
Jeśli SDLK_LEFT (jest prawdziwe). Całkiem możliwe że jest, ale wynik jest tu zawsze taki sam, więc kod pod warunkiem się albo zawsze wykonuje, albo nigdy.
C/C++
void wczytaj()
{
    SDL_Rect Frame;
    Frame.h = 50;
    Frame.w = 50;
    Frame.x = 50;
    Frame.y = 50;
Pozycję ustawiasz na 50,50. Nic się nie przemieszcza, bo pozycja jest stała - plus minus efekt tych warunków, których równie dobrze mogłoby nie być.

Po wywyołaniu funkcji w main w pętli event SDLK_KEYDOWN
To nie jest poprawne miejsce na rysowanie rzeczy.
P-176639
01101101
Temat założony przez niniejszego użytkownika
» 2020-04-15 23:17:19
A jeśli użyłbym keyState[SDLK_LEFT] zamiast if(SDLK_LEFT) ?
P-176669
pekfos
» 2020-04-16 16:11:51
Czego oczekujesz? Wróżby? Nawet gdybyś opisał kompletne rozwiązanie wszystkich problemów, nie tu żadnych przesłanek by ci uwierzyć na słowo, że zastosowałeś je poprawnie. W przeciwnym razie czemu byś teraz pytał, czy dobrze myślisz..? Bez kodu nie ma o czym rozmawiać.
P-176672
01101101
Temat założony przez niniejszego użytkownika
» 2020-04-16 18:57:10
Przepraszam za naiwne pytania ale ciężko coś znaleźć odnoście SDL w C. Mam taki kod:

void wczytaj()
{
// Stworzenie kwadratu Frame  oraz przypisaniu mu współrzędnych itp
if(keystate[SDL_SCANCODE_LEFT])
         {
             Frame.x-=50;
             SDL_RenderCopy(renderer, texture1, NULL, &Frame);
             SDL_RenderPresent(renderer);
         }
     else if(keystate[SDL_SCANCODE_RIGHT])
         {
            Frame.x+=50;
            SDL_RenderCopy(renderer, texture1, NULL, &Frame);
            SDL_RenderPresent(renderer);
         }
     else   if(keystate[SDL_SCANCODE_UP])
         {
             Frame.y-=50;
            SDL_RenderCopy(renderer, texture1, NULL, &Frame);
            SDL_RenderPresent(renderer);
         }
      else  if(keystate[SDL_SCANCODE_DOWN])
         {
             Frame.y+=50;
            SDL_RenderCopy(renderer, texture1, NULL, &Frame);
            SDL_RenderPresent(renderer);
         }

      SDL_Delay(200);



}

int main ()
{
..
//
..
while(run)
    {
     while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
           case SDL_QUIT:
            run = false;
            break;
           case SDL_KEYDOWN:
             wczytaj(x,y);     // poruszanie się po planszy
            break;
            }
           utworz_palnsze(); //rysowanie planszy
        }
     }



}

Ogólnie próbuję zrobić funckję która będzie poruszała się po planszy 9x9 i wczytwała liczby na ekran(narazie poruszam się kwadratem aby ogarnąć samo poruszanie się). To mi umożliwia poruszanie się tylko w czterech kierunkach(prawo itp) właśnie dlatego że są nadpisywane współrzędne ale cieżko ich tutaj nie nadpisać bo funkcja nie zwróci mi dwóch wartości a globalnie też nie utworzę kwadratu. Myślałem by wewnątrz tej funkcji zrobić to w pętli lub stworzyć dwie funkcje(Jedna by zwracała lokalizacje x a druga y wewnątrz wczytaj()).
P-176673
pekfos
» 2020-04-16 20:22:39
Wywal funkcję wczytaj(), praktycznie wszystko co w niej robisz jest błędne w tym kontekście. Pod SDL_KEYDOWN powinno być wyłącznie sprawdzenie sprawdzenie jaki klawisz został naciśnięty (zapisane w event) i odpowiednia reakcja. Nie powinno być tam żadnego rysowania i tym bardziej żadnego czekania. Zapoznaj się z https://wiki.libsdl.org​/SDL_Event​?highlight=(SDL_KEYDOWN).
Nie rób, na razie, z tego osobnej funkcji, skoro masz z tym problem.
P-176674
01101101
Temat założony przez niniejszego użytkownika
» 2020-04-17 14:56:39
Wywaliłem tą funkcję i teraz mój kod wygląda tak. Poruszanie się po planszy działa jak należy. Mam pytanie odnośnie wprowadzania tekstu, do tego służy jakieś osobne zdarzenie?

while(run)
    {
           SDL_RenderCopy(renderer, texture1, NULL, &Frame);
           SDL_RenderPresent(renderer);
           create_grid();
     while(SDL_PollEvent(&event))
        {
            if(event.type==SDL_QUIT)
            {
            run = false;
            }
           else if(event.type==SDL_KEYDOWN)
                 {
                     switch(event.key.keysym.sym)
                     {
                    case SDLK_LEFT:
                     if(Frame.x>50)
                         Frame.x-=50;
                      break;
                    case SDLK_RIGHT:
                     if(Frame.x<450)
                          Frame.x+=50;
                      break;
                    case SDLK_UP:
                     if(Frame.y>50)
                         Frame.y-=50;
                      break;
                    case SDLK_DOWN:
                      if(Frame.y<450)
                          Frame.y+=50;
                      break;

                     }
                     SDL_Delay(200);
                 }
                 else if(event.type==SDL_TEXTINPUT)
                 {

                 }
              }
        }
P-176675
pekfos
» 2020-04-17 16:12:26
Mam pytanie odnośnie wprowadzania tekstu, do tego służy jakieś osobne zdarzenie?
Czy to kolejne naiwne pytanie, widząc po kodzie że już znalazłeś gdzieś SDL_TEXTINPUT..? Czemu by nie kliknąć drugi raz w link, który podałem, i nie zobaczyć jakie informacje niesie ze sobą te zdarzenie?
P-176676
« 1 » 2 3
  Strona 1 z 3 Następna strona