我的源代码存在问题。基本上,我试图在2D地图中移动一个精灵字符
这是我的战士班:
class Warrior
{
private :
int HP, SP;
int xPos, yPos;
int status;
char *name;
SDL_Surface *warrior;
Map m;
public :
int atk, def, matk, mdef;
Warrior(int, int, int, Map);
int getHP();
bool isAlive();
int getSP();
int getX();
int getY();
void setX(int);
void setY(int);
void changeStatus(int);
void drawChar();
void move();
void deleteChar();
};
//constructor buat warrior
Warrior::Warrior(int pos, int x, int y, Map _m)
{
HP = 250;
SP = 50;
atk = 75;
def = 20;
matk = 15;
mdef = 5;
warrior = NULL;
m = _m;
status = pos;
xPos = x;
yPos = y;
}
bool Warrior::isAlive()
{
if (HP > 0) return true;
return false;
}
//buat ngilangin character warrior-nya...
//timpa ama sprite rumput di coord char-nya
void Warrior::deleteChar()
{
char path = '0';
m.drawTile(xPos, yPos, path);
m.drawTile(xPos, yPos+20, path);
SDL_Flip (SDL_SCREEN);
}
//buat gambar character
void Warrior::drawChar ()
{
switch (status)
{
case WARRIOR_LEFT :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_LEFT.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_RIGHT :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_RIGHT.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_UP :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_UP.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_DOWN :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_DOWN.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_MOVE_LEFT :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_MOVE_LEFT.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
SDL_Flip(SDL_SCREEN);
SDL_Delay (100);
deleteChar();
status = WARRIOR_LEFT;
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_LEFT.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_MOVE_RIGHT :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_MOVE_RIGHT.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
SDL_Flip(SDL_SCREEN);
SDL_Delay (100);
deleteChar();
status = WARRIOR_RIGHT;
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_RIGHT.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_MOVE_UP :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_MOVE_UP.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
SDL_Flip(SDL_SCREEN);
SDL_Delay (100);
deleteChar();
status = WARRIOR_UP;
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_UP.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
case WARRIOR_MOVE_DOWN :
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_MOVE_DOWN.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
SDL_Flip(SDL_SCREEN);
SDL_Delay (100);
deleteChar();
status = WARRIOR_DOWN;
warrior = IMG_Load ("Sprites/Warrior/WARRIOR_DOWN.png");
applySurface (xPos, yPos, warrior, SDL_SCREEN);
break;
}
SDL_Flip(SDL_SCREEN);
}
int Warrior::getX()
{
return xPos;
}
int Warrior::getY()
{
return yPos;
}
void Warrior::setX(int x)
{
xPos = x;
}
void Warrior::setY(int y)
{
yPos = y;
}
int Warrior::getHP()
{
return HP;
}
int Warrior::getSP()
{
return SP;
}
void Warrior::changeStatus(int _status)
{
status = _status;
}
//jalannya karakter
void Warrior::move()
{
if (event.type == SDL_KEYDOWN)
{
//hilangkan char-nya dolo
deleteChar();
switch (event.key.keysym.sym)
{
case SDLK_UP :
// nge-cek collision dari coord peta-nya (Map m)
if (m.map[m.getLevel()][(yPos/20)-1][xPos] == '0')
{
yPos -= 20;
status = WARRIOR_MOVE_UP;
}
break;
case SDLK_DOWN :
if (m.map[m.getLevel()][(yPos/20)+1][xPos/20] == '0')
{
yPos += 20;
status = WARRIOR_MOVE_DOWN;
}
case SDLK_LEFT :
if (m.map[m.getLevel()][yPos/20][(xPos/20)-1] == '0')
{
xPos -= 20;
status = WARRIOR_MOVE_LEFT;
}
case SDLK_RIGHT :
if (m.map[m.getLevel()][yPos/20][(xPos/20)+1] == '0')
{
xPos += 20;
status = WARRIOR_MOVE_RIGHT;
}
}
//bru di-gambar
drawChar();
SDL_Delay (100);
}
}
问题是我无法移动它,程序根本没有响应......我检查了所有的精灵图像,它运行正常。
答案 0 :(得分:4)
IMG_Load
。在启动时加载图像。SDL_Surfaces
的IMG_Load
必须在不再需要时使用SDL_FreeSurface
释放。特别是如果你装的很多。SDL_Flip
。只要确保你在每一帧结束时都给它打电话。答案 1 :(得分:0)
textureMap(stringID, pTexture)
等地图:
SDL_Surface* pTempSurface = IMG_Load(fileName.c_str());
SDL_Texture* pTexture = SDL_CreateTextureFromSurface(pRenderer, pTempSurface);
SDL_FreeSurface(pTempSurface);
m_textureMap[id] = pTexture;
SDL_RenderCopyEx(pRenderer, m_textureMap[stringID], &srcRect, &destRect, 0, 0, flip);
SDL_Event event;
if (SDL_PollEvent(&event))
{
switch (event.type)
{....}
}
确保先获取输入事件,然后每帧检查绘制位置。