2014-04-08 8 views
0

나는 SDL2.0과 C++를 사용하여이 게임을하고 있으며 걸림돌을 친다. 나는 이동 함수를 만들고 오른쪽 직사각형을 호출하고있다. 그리고 메인 루프에서 이동 기능을 호출했으며 움직이지 않습니다.SDL2.0 moving 키보드로 스프라이트

다음은 코드입니다. 여기

// 
// Window.cpp 
// Galaxy Shooter 
// 
// Created by Samrith on 02/03/14. 
// Copyright (c) 2014 Sam Shankar. All rights reserved. 
// 

#include "Window.h" 

void Window::create() { 
    Resources r; 

    SDL_Init(SDL_INIT_EVERYTHING); 

    window = SDL_CreateWindow("Galaxy Shooter", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 
    screen = SDL_GetWindowSurface(window); 

    if(window == NULL) 
     std::cout << " Window cannot be created. Error: " << SDL_GetError(); 

    else { 
     r.load(); 
     SDL_UpdateWindowSurface(window); 
    } 
} 

void Window::destroy() { 
    Resources r; 
    SDL_DestroyWindow(window); 
    r.free(); 
    SDL_Quit(); 
} 

void Window::run() { 
    bool done = false; 
    Resources r; 
    create(); 
    while(!done) 
    { 
     while(SDL_PollEvent(&event) != 0) 
     { 
      if(event.type == SDL_QUIT) 
      { 
       done = true; 
       destroy(); 
      } 
      r.move(event); //This is the move function 
      SDL_UpdateWindowSurface(window); 
     } 
     r.projectile(); 
     SDL_UpdateWindowSurface(window); 
    } 
} 

SDL_Window * Window::getWindow() { 
    return window; 
} 

SDL_Surface * Window::getSurface() { 
    return screen; 
} 

그리고

가 이동 기능이 들어있는 자원의 소스 파일입니다 또한

// 
// Resources.cpp 
// Galaxy Shooter 
// 
// Created by Samrith on 06/03/14. 
// Copyright (c) 2014 Sam Shankar. All rights reserved. 
// 

#include "Resources.h" 

bool b[4] = {0, 0, 0, 0}; 

void Resources::load() { 

    background(); 
    rocket(); 
    //r.create(); 
} 

void Resources::free() { 
    Sound s; 

    SDL_FreeSurface(bgimage); 
    SDL_FreeSurface(rimage); 
    //SDL_FreeSurface(screen); 
    s.destroy(); 
} 

//void Resources::run() { 
// Window w; 
// w.run(); 
//} 

void Resources::background() { 
    Window w; 
    Sound s; 

    //Load screen 
    screen = SDL_GetWindowSurface(w.getWindow()); 

    if(screen == NULL) 
     std::cout << "Surface (background) error: " << SDL_GetError(); 

    //Load image 
    bgimage = IMG_Load("bg2.jpg"); 

    if(bgimage == NULL) 
     std::cout << "Image (background) error: " << SDL_GetError(); 

    //Load rectangle and set values 
    bgrect.x = 0; 
    bgrect.y = 0; 
    bgrect.h = w.screenH(); 
    bgrect.w = w.screenW(); 

    //Blit image to screen 
    SDL_BlitScaled(bgimage, NULL, screen, &bgrect); 
    s.init(1); 
} 

void Resources::rocket() { 
    Window w; 
    Sound s; 

    //Load screen 
    screen = SDL_GetWindowSurface(w.getWindow()); 

    if(screen == NULL) 
     std::cout << "Surface (rocket) error: " << SDL_GetError(); 

    //Load image 
    rimage = IMG_Load("rocket.png"); 

    if(rimage == NULL) 
     std::cout << "Image (rocket) error: " << SDL_GetError(); 

    //Load rectangle and set values 
    rrect.x = 15; 
    rrect.y = w.screenH()/2; 
    rrect.h = 75; 
    rrect.w = 75; 

    //Blit image to screen 
    SDL_BlitScaled(rimage, NULL, screen, &rrect); 
    //s.init(2); 
} 

void Resources::move(SDL_Event event) { 
    //bool done = false; 
    Window w; 

    switch(event.type) 
    { 
     case SDL_KEYDOWN: 
      switch(event.key.keysym.sym) 
      { 
       case SDLK_UP: 
        b[0] = 1; break; 

       case SDLK_DOWN: 
        b[1] = 1; break; 

       case SDLK_RIGHT: 
        b[2] = 1; break; 

       case SDLK_LEFT: 
        b[3] = 1; break; 
      } 
      break; 

     case SDL_KEYUP: 
      switch(event.key.keysym.sym) 
      { 
       case SDLK_UP: 
        b[0] = 0; break; 

       case SDLK_DOWN: 
        b[1] = 0; break; 

       case SDLK_RIGHT: 
        b[2] = 0; break; 

       case SDLK_LEFT: 
        b[3] = 0; break; 
      } 
      break; 
    } 

    if(b[0]==true) 
     rrect.y += 10; 
    if(b[1]==true) 
     rrect.y -= 10; 
    if(b[2]==true) 
     rrect.x += 10; 
    if(b[3]==true) 
     rrect.x -= 10; 
} 

void Resources::projectile() { 
    Window w; 
    SDL_PumpEvents(); 
    int x, y; 
    SDL_GetMouseState(&x, &y); 
    if(SDL_GetMouseState(&x, &y) & SDL_BUTTON(1)) 
    { 
     rrect.x = x; 
     rrect.y = y; 
     SDL_BlitScaled(rimage, NULL, screen, &rrect); 
     for(int i=rrect.x; i<=w.screenW(); i++) 
      rrect.x+=2; 

    } 
} 

, 나는이 문제를 봤 다양한 튜토리얼과 문서를 시도했습니다. 이것은 나의 최후의 수단이며이 문제에 대해 내가 처음으로 생각한 것이 아니다. 그러니 친절하게 대해주십시오. :)

+0

당신의 문제는 당신이 자원 r을 선언한다는 것입니다; 각 함수의 스택에. 예를 들어'void Window :: create()'를 호출하면 r을 선언하고로드하는 모든 것을로드하지만 함수가 반환하면 r이 소멸됩니다. 따라서 run에서 선언 한 r에는 load() 함수가 호출되지 않습니다. – Hjorthenify

+0

@Hjorthenify 나는 당신이 의미하는 것을 얻는다. 그래서 나는 이상적인 글로벌 r을 만들어 모든 기능에 걸쳐 사용하여 범위를 벗어나지 않도록해야합니다. – Sam

+0

전역 변수는 나쁜 연습으로 간주되므로 오히려이를 윈도우 클래스의 멤버 변수로 지정해야합니다. – Hjorthenify

답변

1

모든 함수에 Resource r을 선언하면 매번 Resource 클래스의 새 인스턴스가 만들어져 많은 다른 Resource 개체가 만들어집니다.

Resource 클래스의 모든 함수에서 선언 한 변수 Window w도 마찬가지입니다. 각 함수를 호출하면 새 창이 생성됩니다.

개체 지향 프로그래밍 및 변수 범위 지정에 대해 읽어 보시기 바랍니다.

또한 C++은 객체 지향 프로그래밍에 대해 배우기 시작하는 데 가장 친숙한 언어가 아닙니다.

시작하려는 경우 Java 또는 C#과 같은 간단한 언어로 전환하는 것이 좋습니다.

행운을 빈다.