SDL移动我的角色

时间:2011-09-27 14:44:13

标签: sdl

我的源代码存在问题。基本上,我试图在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);    
        }                  
}

问题是我无法移动它,程序根本没有响应......我检查了所有的精灵图像,它运行正常。

2 个答案:

答案 0 :(得分:4)

  1. 发布你的主循环。
  2. 在代码中的各个位置添加打印件,以便您可以看到它挂起的位置。
  3. 请勿每帧调用IMG_Load。在启动时加载图像。
  4. 加载SDL_Surfaces
  5. IMG_Load必须在不再需要时使用SDL_FreeSurface释放。特别是如果你装的很多。
  6. 每次更改内容时都不必致电SDL_Flip。只要确保你在每一帧结束时都给它打电话。

答案 1 :(得分:0)

  1. 您可以在进入播放状态之前将您的精灵图像添加到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;
  2. 绘制英雄时,可以使用stringID获取纹理: SDL_RenderCopyEx(pRenderer, m_textureMap[stringID], &srcRect, &destRect, 0, 0, flip);
  3. 因为你没有发布你的主循环,你可能应该在主循环中捕获输入,如: SDL_Event event; if (SDL_PollEvent(&event)) { switch (event.type) {....} } 确保先获取输入事件,然后每帧检查绘制位置。