SDL移动我的角色
问题描述:
我的源代码出现问题。基本上,我试图在2D地图SDL移动我的角色
,这里是我的武士阶层移动精灵性格:
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);
}
}
的问题是我不能移动它,程序完全没有响应......我已经检查过所有的精灵图像,它工作正常。
答
- 发布您的主循环。
- 在您的代码的各个位置添加打印件,以便您可以看到它挂起的位置。
- 每帧不要调用
IMG_Load
。在启动时加载你的图像。 -
SDL_Surfaces
装有IMG_Load
必须在不再需要时用SDL_FreeSurface
释放。特别是如果你加载了很多。 - 您不必每次更改内容时都请致电
SDL_Flip
。只要确保在每帧结束时调用它。
答
- 您可以将您的雪碧图像添加到地图一样
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;
- 当绘制英雄,你可以使用的StringID获得质地:
SDL_RenderCopyEx(pRenderer, m_textureMap[stringID], &srcRect, &destRect, 0, 0, flip);
- 对于你不会发布你的主循环,你可能应该在主循环中捕获输入,例如:
SDL_Event event; if (SDL_PollEvent(&event)) { switch (event.type) {....} }
确保你先输入事件,然后检查每帧的绘制位置。