程序立即在SDL中关闭

猎人瓦列霍斯

我试图在SDL 1.2中构建我的第一个程序只是为了熟悉SDL。我很头疼,想了解为什么我的程序立即关闭。

这和我的编译方式有关吗?

这是我所有的代码,不必担心尝试查找与手头的错误无关的逻辑错误。我只是想找出为什么程序在启动时立即关闭。

Guy.h:

#ifndef GUY_H
#define GUY_H

class Guy{
    public:
        Guy(int, int);
        void move();
        void adjustVelocity(int, int);
        int getX();
        int getY();
        int getXVel();
        int getYVel();
    private:
        int xPos, yPos, xVel, yVel;
};
#endif

Guy.cpp:

#include "Guy.h"

Guy::Guy(int x, int y){
    xPos = x;
    yPos = y;
}
void Guy::move(){
    xPos += xVel;
    yPos += yVel;
}
void Guy::adjustVelocity(int x, int y){
    xVel += x;
    yVel += y;
}
int Guy::getX(){
    return xPos;
}
int Guy::getY(){
        return yPos;
}
int Guy::getXVel(){
    return xVel;
}
int Guy::getYVel(){
    return yVel;
}

main.cpp:

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "Guy.h"
#include <string>
#include <iostream>

bool init();
bool loadAllFiles();
void paintScreen();
void update();
bool handle();
void cleanUp();

void addSurface(int, int, SDL_Surface*, SDL_Surface*, SDL_Rect* clip = NULL);
SDL_Surface* loadFile(std::string);
SDL_Surface* Screen;
SDL_Surface* BackgroundIMG;
SDL_Surface* GuyIMG;
Guy* Hunter;


int main(int argc, char* args[]){
    std::cout << "Why won't it even cout this?? :(" << endl;
    if(!init()){
        return 1;
    }
    if(!loadAllFiles()){
        return 2;
    }
    Hunter = new Guy(0,0);
    paintScreen();
    while(handle()){
        update();
    }

    cleanUp();
    return 0;

    SDL_Init(SDL_INIT_EVERYTHING);
    Screen = SDL_SetDisplayMode(640, 480, 32, SDL_SWSURFACE);
    SDL_Flip(Screen);
    SDL_Delay(1000);
}

bool init(){
    if(SDL_Init(SDL_INIT_EVERYTHING)==-1){
        return false;
    }
    Screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
    if(Screen==NULL){
        return false;
    }
    SDL_WM_SetCaption("First SDL Test On Own", NULL);
    return true;
}

bool loadAllFiles(){
    BackgroundIMG = loadFile("Background.png");
    GuyIMG = loadFile("Guy.png");
    if(BackgroundIMG==NULL || GuyIMG==NULL){
        return false;
    }
    else{
        return true;
    }
}

void paintScreen(){
    addSurface(0, 0, BackgroundIMG, Screen);
    addSurface(Hunter->getX(), Hunter->getY(), GuyIMG, Screen);
    SDL_Flip(Screen);
}

void update(){
    Hunter->move();
    addSurface(Hunter->getX(), Hunter->getY(), GuyIMG, Screen);
    SDL_Flip(Screen);
}

bool handle(){ 
    SDL_Event event;
    while(SDL_PollEvent(&event)){
        if(event.type==SDL_QUIT){
            return false;
        }
        else if(event.type==SDL_KEYDOWN){
            switch(event.key.keysym.sym){
                case SDLK_UP:
                    Hunter->adjustVelocity(0, -1);
                    break;
                case SDLK_DOWN:
                    Hunter->adjustVelocity(0, 1);
                    break;
                case SDLK_RIGHT:
                    Hunter->adjustVelocity(1, 0);
                    break;
                case SDLK_LEFT:
                    Hunter->adjustVelocity(-1, 0);
                    break;
            }
        }
    }
    return true;
}

void cleanUp(){
    SDL_FreeSurface(GuyIMG);
    SDL_FreeSurface(BackgroundIMG);
    SDL_Quit();
    delete Hunter;
}



void addSurface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip){
    SDL_Rect offset;
    offset.x = x;
    offset.y = y;
    SDL_BlitSurface(source, clip, destination, &offset);
}

SDL_Surface* loadFile(std::string s){
    SDL_Surface* surface = IMG_Load(s.c_str());
    if(surface==NULL){
        return NULL;
    }
    else{
        SDL_Surface* opsurface = SDL_DisplayFormat(surface);
        SDL_FreeSurface(surface);
        return opsurface;
    }
}

我的makefile:

all: main.o
        g++ -o run main.o Guy.o -lSDL -lSDL_image
main.o: Guy.o
        g++ -c main.cpp
Guy.o:
        g++ -c Guy.cpp

每当使用此makefile对其进行编译时,都不会出错。

一笔贿赂

由于使用,您的程序立即关闭SDL_PollEvent(&event)如果没有要处理的事件(在您的情况下是在程序启动时发生),则此函数将返回false。如果用户必须提供窗口输入,则没有规则要处理,而不是例外。

您有2种选择:

  1. 切换到SDL_WaitEvent它确实类似于SDL_PollEvent,但不同之处在于它是一个阻塞调用,它的优点是可以很容易地从应用程序中获得所需的行为。
  2. SDL_PollEvent坚持使用,并添加一种机制来在没有事件要处理时推迟执行。通常,人们使用延迟为0或10的SDL_Delay。优点是您可以控制无事件时应用程序的操作。

过程循环方案的示例。

SDL_Event event;
bool stop = false;
while(!stop){
    bool got_event = SDL_PollEvent(&event) > 0;
    if(got_event){
       stop = processEvent(event);
    }
    else {
        if(backGroundWorkTodo()){
           doBackGroundWork();
        }
        else{
          //may defer execution
          SDL_Delay(0);
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

关闭android程序立即在json中运行该应用

来自分类Dev

SDL OpenGL窗口立即关闭

来自分类Dev

jQuery立即在CoffeeScript中调用函数?

来自分类Dev

立即在AngularJS中启动$ interval

来自分类Dev

立即在Ember.js中渲染

来自分类Dev

立即在Ruby中创建哈希

来自分类Dev

立即在Qt <= 5.12中清除`QGraphicsView`

来自分类Dev

doRedis工人立即在窗户上关闭

来自分类Dev

doRedis工人立即在窗户上关闭

来自分类Dev

wxPython窗口立即在Mac上使用Komodo崩溃/关闭

来自分类Dev

SDL2 OpenGL 窗口立即关闭

来自分类Dev

应用程序启动地图活动后,如何立即在android中的地图中显示我当前的位置

来自分类Dev

.pyw tk程序立即关闭?

来自分类Dev

简单的桌面程序立即关闭

来自分类Dev

Excel中的超时,立即在SSMS中执行

来自分类Dev

立即在ContinueWith块中构造的呼叫的任务?

来自分类Dev

为什么printfn立即在f#中打印?

来自分类Dev

TabBarItem图标不会立即在iOS 8中显示

来自分类Dev

运行后,Python输出窗口立即在eclipse中消失

来自分类Dev

如何立即在PyQt的textEdit小部件中获取更改?

来自分类Dev

立即在Objective-C iOS中查找EST日期

来自分类Dev

MIPS鼓音序器立即在MARS环境中结束

来自分类Dev

jQuery立即在CoffeeScript中调用函数吗?

来自分类Dev

是否fork()立即在Linux中复制整个进程堆?

来自分类Dev

立即在定义为文字的哈希表中查找值

来自分类Dev

插入顶点后立即在orientjs中创建边

来自分类Dev

如何立即在日志文件中获取stdout / stderr?

来自分类Dev

v-for 循环项不会立即在 Vue 中更新

来自分类Dev

如何优化单个查询以立即在 LINQ 中多次调用?

Related 相关文章

热门标签

归档