0
Sprite1 *test = new Sprite1(450, 450, "enemy.bmp", *screen);
    test->DrawJon();
    SDL_Delay(1000);
    test->MoveJon(20,20);

我在第 2 行遇到运行时错误。它说在 0x0 的访问冲突

Sprite1 是我定义的一个类和类中的 DrawJon() 和 MoneJon()。这种语法在编译器中是可以的,但在运行时失败。

Sprite1.cpp

#include "Sprite1.h"

Sprite1::Sprite1(int posX, int posY, std::string imagePath, SDL_Surface screen) :     PosX(posX), PosY(posY), ImagePath(imagePath), Screen(screen)
{
void DrawSprite1Jon( int x, int y, SDL_Surface *sprite, SDL_Surface *screen );
void DrawJon();
void MoveJon(int xDist, int yDist);
}

void Sprite1::DrawSprite1Jon( int x, int y, SDL_Surface *sprite, SDL_Surface *screen )
{
//Make a temporary rectangle to hold the offsets
SDL_Rect offset;

//Give the offsets to the rectangle
offset.x = x;
offset.y = y;

//Blit the surface
SDL_BlitSurface( sprite, NULL, screen, &offset );

SDL_UpdateRect(screen, 0, 0, 0, 0);
}

void Sprite1::DrawJon()
{
#pragma region Char to String Conversion

string ImagePath;
char * writable = new char[ImagePath.size() + 1];
copy(ImagePath.begin(), ImagePath.end(), writable);
writable[ImagePath.size()] = '\0';

#pragma endregion

temp = SDL_LoadBMP(writable);
sprite = SDL_DisplayFormat(temp);
SDL_FreeSurface(temp);

// free the string after using it
delete[] writable;

DrawSprite1Jon(PosX, PosY, sprite, screen);
}

Sprite1.h

#include <string>
#include <SDL.h>
#include "Functions.h"

using namespace std;

class Sprite1
{
private:
    int PosX;
    int PosY;
    int xDist;
    int yDist;
    string ImagePath;
    SDL_Surface Screen;
    SDL_Surface *temp, *sprite, *screen;

public:
    Sprite1(int PosX, int PosY, string ImagePath, SDL_Surface Screen );
    void DrawSprite1Jon( int x, int y, SDL_Surface *sprite, SDL_Surface *screen);
    void DrawJon();
    void MoveJon(int xDist, int yDist);
};

编辑:

经过进一步调查,是这条线

DrawSprite1Jon(PosX, PosY, sprite, screen);

这在 DrawJon() 中失败了

4

3 回答 3

1

至少你的这段代码被破坏了:

string ImagePath;
char * writable = new char[ImagePath.size() + 1];
copy(ImagePath.begin(), ImagePath.end(), writable);
writable[ImagePath.size()] = '\0';

您正在创建本地 ImagePath 变量,而不是使用类成员变量。局部变量隐藏成员变量。删除局部变量(上面代码段中的第一行)。

此外,您可能(我对 SDL 不是很熟悉)可以像这样简单地进行加载:

temp = SDL_LoadBMP(ImagePath.c_str());

然后,只是猜测,但图像加载可能会失败,并且该函数返回 NULL 指针。所以检查返回值然后检查错误(要么有一些 SDL 错误函数你可以调用,或者你需要检查标准 errno 全局变量。

进一步建议:打开编译器警告(对于 gcc:-W -Wall)并学习理解(将警告复制到 google 是一个好的开始),然后修复警告。大多数时候它们是真正的错误(因此警告!),即使它们不是,修复警告也会使您的代码更好。

于 2012-12-16T13:49:06.757 回答
0

我的实现存在一些问题,但最后我不得不在发布模式而不是调试模式下构建。

于 2012-12-17T12:47:37.607 回答
0

我很明显你刚刚开始用 C++ 编程,也许你有 javascript 背景,因此你试图将函数声明放入构造函数中。这是一个错误的想法。( #pragma's 通常有一些明确的含义,你也在这里误用它们。参见例如。#pragma GCC poison )

我在这段代码中看到了很多混乱。

我建议,在继续编写这段代码之前,你先拿一本高质量的初学者 C++ 书。在这一点上,我认为没有理由试图从这段代码中找出一些合理的东西。

于 2012-12-16T13:34:12.813 回答