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()
中失败了答案 0 :(得分:1)
至少这部分代码已损坏:
string ImagePath;
char * writable = new char[ImagePath.size() + 1];
copy(ImagePath.begin(), ImagePath.end(), writable);
writable[ImagePath.size()] = '\0';
您正在创建本地ImagePath变量,而不是使用类成员变量。局部变量 shadow 成员变量。删除局部变量(上面代码段中的第一行)。
另外,你可能(我对SDL不是很熟悉)加载就像这样:
temp = SDL_LoadBMP(ImagePath.c_str());
然后,只是猜测,但图像加载可能会失败,并且该函数返回NULL指针。因此,检查返回值,然后检查错误(可以调用一些SDL错误函数,或者需要检查标准的errno全局变量。
进一步的建议:打开编译器警告(对于gcc:-W -Wall)并学会理解(将警告复制到谷歌是一个好的开始),然后修复警告。大多数时候它们都是真正的错误(因此警告!),即使它们不是,修复警告也会使你的代码变得更好。
答案 1 :(得分:0)
我很明显你刚刚开始使用C ++编程,也许你有一个javascript背景,因此你试图将函数声明放入构造函数中。这是一个错误的想法。 (#pragma
通常有一些明确的含义,你也在这里滥用它们。see eg. #pragma GCC poison
)
我在这段代码中看到很多混淆。
我建议你先拿一个great quality beginner C++ book,然后再继续这段代码。在这一点上,我认为没有理由试图从这段代码中敲定一些合理的东西。
答案 2 :(得分:0)
我的实现存在一些问题,但最终我必须构建在发布模式而不是调试模式。