⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map.cpp

📁 [游戏开发参考书-用DirectX编写RPG游戏]这是一个系列的丛书如果你都看并且懂的话你就可以你工作啦!
💻 CPP
字号:
#include "Core_Global.h"
#include "Tile.h"
#include "Map.h"

cMap::cMap()
{
  m_Map   = NULL;
  m_Tiles = NULL;
  m_NumObjectsToDraw = 0;
  m_Width = m_Height = 0;
}

cMap::~cMap()
{
  Free();
}

BOOL cMap::Create(long NumLayers, long Width, long Height)
{
  // Free a prior map
  Free();

  // Save # layers, width, and height
  m_NumLayers = NumLayers;
  m_Width     = Width;
  m_Height    = Height;

  // Allocate map data memory
  if((m_Map = new char[m_NumLayers*m_Width*m_Height]) == NULL)
    return FALSE;

  // Clear it out
  ZeroMemory(m_Map, m_NumLayers*m_Width*m_Height);

  // Reset # objects to draw
  m_NumObjectsToDraw = 0;

  return TRUE;
}

BOOL cMap::Free()
{
  // Free map array
  delete [] m_Map;
  m_Map = NULL;
  m_Width = m_Height = 0;
  m_NumLayers = 0;

  return TRUE;
}

BOOL cMap::SetMapData(long Layer, char *Data)
{
  // Error checking
  if(Layer >= m_NumLayers)
    return FALSE;

  // Copy over data
  memcpy(&m_Map[Layer*m_Width*m_Height],Data,m_Width*m_Height);

  return TRUE;
}

void cMap::ClearObjectList()
{
  m_NumObjectsToDraw = 0;
}

BOOL cMap::AddObject(long XPos, long YPos, char Tile)
{
  if(m_NumObjectsToDraw < MAX_OBJECTS) {
    m_Objects[m_NumObjectsToDraw].XPos = XPos;
    m_Objects[m_NumObjectsToDraw].YPos = XPos;
    m_Objects[m_NumObjectsToDraw].Tile = Tile;
    m_NumObjectsToDraw++; 

    return TRUE;
  }

  return FALSE;
}

char *cMap::GetPtr(long Layer)
{
  if(Layer >= m_NumLayers)
    return NULL;

  return &m_Map[Layer*m_Width*m_Height];
}

long cMap::GetWidth()
{
  return m_Width;
}

long cMap::GetHeight()
{
  return m_Height;
}

BOOL cMap::UseTiles(cTiles *Tiles)
{
  if((m_Tiles = Tiles) == NULL)
    return FALSE;

  return TRUE;
}

BOOL cMap::Render(long XPos, long YPos, 
                  long NumRows, long NumColumns,
                  long ObjectLayer)
{
  long MapX, MapY; 
  long XOff, YOff;
  long Layer, Row, Column, i;
  char TileNum;
  char *MapPtr;

  // Error checking
  if(m_Map == NULL || m_Tiles == NULL)
    return FALSE;

  // Calculate smooth scrolling variables
  MapX = XPos / m_Tiles->GetWidth(0);
  MapY = YPos / m_Tiles->GetHeight(0);
  XOff = XPos % m_Tiles->GetWidth(0);
  YOff = YPos % m_Tiles->GetHeight(0);

  // Loop through each layer
  for(Layer=0;Layer<m_NumLayers;Layer++) {
    MapPtr = &m_Map[Layer*m_Width*m_Height];

    // Loop for each row and column
    for(Row=0;Row<NumRows;Row++) {
      for(Column=0;Column<NumColumns;Column++) {
        TileNum = MapPtr[(Column + YPos)*m_Width+Row+XPos];
        m_Tiles->Draw(0, TileNum,                             \
                      Row    * m_Tiles->GetWidth(0) - XOff,   \
                      Column * m_Tiles->GetHeight(0) - YOff);
      }
    }

    // Draw objects if on object layer
    if(Layer == ObjectLayer) {
      for(i=0;i<m_NumObjectsToDraw;i++)
        m_Tiles->Draw(0, m_Objects[i].Tile,                   \
                         m_Objects[i].XPos - XOff,            \
                         m_Objects[i].YPos - YOff);
    }
  }

  return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -