SDL Перемещение моего персонажа - PullRequest
1 голос
/ 27 сентября 2011

У меня проблема с исходным кодом. в основном я пытался переместить спрайта в 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 ]

4 голосов
/ 27 сентября 2011
  1. Публикация основного цикла.
  2. Добавление распечаток в различных местах вашего кода, чтобы вы могли видеть, где он висит.
  3. Не вызывайте IMG_Load каждый кадр.Загрузите ваши изображения при запуске.
  4. SDL_Surfaces, загруженный IMG_Load, должен быть освобожден с помощью SDL_FreeSurface, когда он больше не нужен.Особенно, если вы загружаете их много.
  5. Вам не нужно звонить SDL_Flip каждый раз, когда вы что-то меняете.Просто убедитесь, что вы вызываете его в конце каждого кадра.
0 голосов
/ 14 марта 2014
  1. Вы можете добавить свое изображение Sprite на карту, например 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) {....} } Сначала убедитесь, что вы получили входное событие, а затем проверяйте позицию прорисовки в каждом кадре.
...