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ć? |
|
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. 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. 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. |
|
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) ? |
|
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ć. |
|
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()). |
|
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. |
|
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) {
} } } |
|
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? |
|
« 1 » 2 3 |