Biblioteka SDL - przejścia pomiędzy obrazami.
Ostatnio zmodyfikowano 2016-12-28 14:22
therus Temat założony przez niniejszego użytkownika |
Biblioteka SDL - przejścia pomiędzy obrazami. » 2016-12-27 19:23:57 Mój pierwszy post, więc wszystkim serdecznie witam!
Jestem początkujący w C, ale mam do zrobienia program zaliczeniowy. Pomysł jest prosty. Gra obrazkowa tak lub nie. Zaimplementowałem początek programu, tak że wyświetla mi jeden obrazek, ale nie potrafię zrobić, żeby po naciśnięciu klawiszy zmienił się w następny.
Podaję program:
#include <stdio.h> #include <SDL2/SDL.h> #include <SDL_keycode.h> #include <SDL2/SDL_image.h>
#define WINDOW_WIDTH (600) #define WINDOW_HEIGHT (600)
int main() {
SDL_Window* window = SDL_CreateWindow("Zaliczenie", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT,0); Uint32 render_flags = SDL_RENDERER_ACCELERATED; SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, render_flags); SDL_Surface* surface = IMG_Load("dark-souls-bonfire_small.jpg"); SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); // clear the window SDL_RenderClear(renderer);
// draw the image to the window SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer);
int q = 0; int close_request = 0;
while(!close_request) { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: close_request = 1; break;
case SDL_KEYDOWN: switch (event.key.keysym.scancode) { case SDL_SCANCODE_RIGHT: q = 1; break; } } } }
if(q==1) { surface = IMG_Load("15-02-05-14-31_0_large_photo.jpg"); texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); }
// clean up resources before exiting SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); }
|
|
darko202 |
» 2016-12-28 08:22:14 1. odpowiedz na proste pytanie * wchodzisz w pętlę * a gdzie realizujesz oczekiwane przez Ciebie zdarzenie. np. na http://sdl.beuc.net/sdl.wiki/SDL_PollEventmamy while( SDL_PollEvent( & event ) ) { switch( event.type ) { case SDL_KEYDOWN: printf( "Oh! Key press\n" ); break; ...
i po naciśnieci klawisz wyświetla się napis a w prezentowanym kodzie nie widać, gdzie miałoby się zdarzyć to o czym piszesz (niezależnie od tego, że słabo się znam na SLD) 2. zapoznaj się z techniką debugowania kodu przyda Ci się możliwość zatrzymania kodu "ustawiane breakpoint'y" linia po linii |
|
therus Temat założony przez niniejszego użytkownika |
» 2016-12-28 14:22:04 Dobre, ogarnąłem jak to zmieniać. I wszystko fajnie działa :) Teraz kolejne pytanie. Jak zrobić tak, żeby po naciśnięciu np. strzałki w prawo kończyło działanie. Tzn. żeby zapamiętywało, że to jest kolejny krok z dwóch możliwych, a ten drugi już nie będzie dostępny. Teraz działa w prawo i lewo i się przełącza pomiędzy tymi dwoma.
KOD:
#include <stdio.h> #include <SDL2/SDL.h> #include <SDL_keycode.h> #include <SDL2/SDL_image.h>
#define WINDOW_WIDTH (600) #define WINDOW_HEIGHT (600)
int main(void) { SDL_Window* window; SDL_Renderer* renderer; SDL_Texture* texture; SDL_Surface* surface; SDL_Event event; // int close_request = 0; // Uint32 rmask, gmask, bmask, amask;
// inicjializacja SDL if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) != 0) { printf("error initializing SDL: %s\n", SDL_GetError()); return 1; }
window = SDL_CreateWindow("Zaliczenie", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT,0); if (!window) { printf("error creating window: %s\n", SDL_GetError()); SDL_Quit(); return 1; } // ustawiamy renderer renderer = SDL_CreateRenderer(window, -1, 0); if (!renderer) { printf("error creating renderer: %s\n", SDL_GetError()); SDL_DestroyWindow(window); SDL_Quit(); return 1; } // wczytywanie obrazka surface = IMG_Load("15698157_1389057541145276_7390616878122569444_n.png");
if (!surface) { printf("error creating surface\n"); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 1; }
// wczytywanie obrazka do pamięci texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); if (!texture) { printf("error creating texture: %s\n", SDL_GetError()); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 1; }
while (1) { SDL_PollEvent(&event); if (event.type == SDL_QUIT) { break; } if(event.type == SDL_KEYDOWN) { switch(event.key.keysym.sym) { case SDLK_RIGHT: surface = IMG_Load("darksouls1280jpg-98f75c_1280w.jpg"); texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); break; case SDLK_LEFT: surface = IMG_Load("15-02-05-14-31_0_large_photo.jpg"); texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_FreeSurface(surface); break; } }
SDL_RenderClear(renderer); // czyszczenie okna SDL_RenderCopy(renderer, texture, NULL, NULL); // wczytywanie okna SDL_RenderPresent(renderer); }
// czyszczenie źródeł SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); }
|
|
« 1 » |