2014-04-08 77 views
0

我一直在使用SDL2.0和C++進行這個遊戲,並且遇到了麻煩。我創建了移動功能並調用了正確的矩形。並且已經在主循環中調用移動功能,並且它不移動。SDL2.0移動雪碧鍵盤

這是代碼。

// 
// 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; 

    } 
} 

另外,我用Google搜索這個問題,並嘗試了各種教程和文檔。這是我最後的選擇,而不是我轉向這個問題的第一位。所以請善待。 :)

+0

在我看來,你的問題是你聲明資源r;在每個函數的堆棧中。例如,當你調用'void Window :: create()'時,你聲明r並加載它加載的任何東西,但是一旦函數返回r就會被銷燬。所以你在運行時聲明的r永遠不會調用它的load()函數。 – Hjorthenify

+0

@Hjorthenify我明白你的意思。所以我應該理想地創建一個全局函數並在整個函數中使用它,以確保它不會超出範圍? – Sam

+0

全局變量被認爲是不好的做法,你應該把它變成你的窗口類的成員變量。 – Hjorthenify

回答

1

通過在每個函數中聲明Resource r您每次創建Resource類的新實例因此創建許多不同的Resource對象。

對於Resource的每個函數中聲明的Window w變量也是如此:每個函數調用都會創建一個新窗口。

我建議您閱讀面向對象編程和變量範圍。

此外,C++不是開始學習面向對象編程的最友好的語言。

如果您剛開始,我建議您切換到更簡單的語言,如Java或C#。

祝你好運。