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

Biblioteka SDL - przejścia pomiędzy obrazami.

Ostatnio zmodyfikowano 2016-12-28 14:22
Autor Wiadomość
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();
}
P-155565
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_PollEvent
mamy
C/C++
while( SDL_PollEvent( & event ) ) { /* Loop until there are no events left on the queue */
    switch( event.type ) { /* Process the appropriate event type */
    case SDL_KEYDOWN: /* Handle a KEYDOWN event */
        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
P-155584
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();
}
P-155593
« 1 »
  Strona 1 z 1