2014-04-08 78 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#。

祝你好运。