Моддинг Новый тайл

Тема в разделе "Создание и управление сервером", создана пользователем TXrus, 10 авг 2015.

  1. TXrus

    TXrus Пользователь

    Создал тайл и присвоил ему флаг. Теперь пишу взаимодействие с тайлом подобно функции в Character.cpp
    Код:
    if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH ||
            GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH ||
            GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH ||
            GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH){}
        {
    Дело в том, что если я напишу ещё одну такую же ф-цию , но присвою др. флаг, выполняться будут обе. Как исправить ?
     
  2. Matodor

    Matodor Гл. Администратор Команда форума

    Чет я совсем не понял, что ты хочешь сделать. Можешь подробнее расписать?
     
  3. TXrus

    TXrus Пользователь

    в mapitems.h добавил
    Код:
        TILE_DEATH_RED,
        TILE_DEATH_BLUE,
    в collision.cpp дописал
    Код:
    case TILE_DEATH_RED:
                m_pTiles[i].m_Index = COLFLAG_DEATH_RED;
                break;
            case TILE_DEATH_BLUE:
                m_pTiles[i].m_Index = COLFLAG_DEATH_BLUE;
                break;
    Всё подобно TILE_DEATH;
    Ну и взаимодействие в character.cpp написал. В итоге , если я "докаснусь" до DEATH_RED ,например, будет и происходить взаимодействие и с DEATH и DEATH_BLUE.
     
  4. Matodor

    Matodor Гл. Администратор Команда форума

    Понял. Можешь делать проверку как в CCharacter, можно и другими методами, например в collision.cpp есть метод GetTile(int x, int y), только тебе его придется немного изменить, добавив свои флаги, либо убрать оттуда все проверки на флаги.

    Потом просто в CCharacter делаешь нужные проверки:
    Код:
    if(GameServer()->Collision()->GetTile(x,y) == COLFLAG_DEATH_RED)
      ...
    
    Вообще можно работать без создания этих флагов, просто добавляешь новый тайл в mapitems.h.
    Изменяешь Init в collision.cpp, чтобы была возможность загрузки всех тайлов.
    Код:
    void CCollision::Init(class CLayers *pLayers)
    {
        m_pLayers = pLayers;
        m_Width = m_pLayers->GameLayer()->m_Width;
        m_Height = m_pLayers->GameLayer()->m_Height;
        m_pTiles = static_cast<CTile *>(m_pLayers->Map()->GetData(m_pLayers->GameLayer()->m_Data));
     
        for(int i = 0; i < m_Width*m_Height; i++)
        {
            int Index = m_pTiles[i].m_Index;
     
            if(Index > 175)
                continue;
     
            switch(Index)
            {
                case TILE_DEATH:
                    m_pTiles[i].m_Index = COLFLAG_DEATH;
                    break;
                case TILE_SOLID:
                    m_pTiles[i].m_Index = COLFLAG_SOLID;
                    break;
                case TILE_NOHOOK:
                    m_pTiles[i].m_Index = COLFLAG_SOLID|COLFLAG_NOHOOK;
                    break;
                default:
                    m_pTiles[i].m_Index = 0;
            }
           
            // custom tiles
            if(Index > 3 && Index <= 175)
                m_pTiles[i].m_Index = Index;
        }
    }
    Ну и функция для проверки тайла по заданным координатам:
    Код:
    bool CCollision::CheckTile(vec2 Pos, int TILE_NUMB)
    {
        int x = Pos.x;
        int y = Pos.y;
        int Nx = clamp(x/32, 0, m_Width-1);
        int Ny = clamp(y/32, 0, m_Height-1);
    
        if(!m_pTiles || Ny < 0 || Nx < 0)
            return false;
            
        int Tile = m_pTiles[Ny*m_Width+Nx].m_Index;
            if(Tile == TILE_NUMB)
                return true;
        return false;
    }
    
    Пример использования:
    Код:
    if (GameServer()->Collision()->CheckTile(m_Core.m_Pos, TILE_SOMETILE))
    {
    }
    
     
  5. TXrus

    TXrus Пользователь

    Сделал по твоему коду. Срабатывает один раз, но бред какой-то. 3 тайла ( DEATH_RED , DEATH_BLUE , DEATH) есть. RED и DEATH работают , а BLUE нет. Выполняют одну ф-цию. Распробовал разные способы, а не работает... В игре такое ощущение, что тайл BLUE уже забит, чем то т.к. взаимодействует игрок с ним.
    Исправил, оказывается '5' тайл чем то занят, перенёс на 6 всё работает. Спасибо
     
    Matodor нравится это.