亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chars.cpp

?? 3D游戲引擎 Programming Role-Playing Games with DirectX, 2nd Edition by Jim Adams
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
#include "Core_Global.h"
#include "Frustum.h"

#include "MCL.h"
#include "MIL.h"
#include "MSL.h"

#include "Chars.h"
#include "Spell.h"

cCharacterController::cCharacterController()
{
  m_Graphics          = NULL;  // Clear cGraphics pointer
  m_Font              = NULL;  // Clear cFont pointer
  m_Frustum           = NULL;  // Clear frustum pointer

  m_MIL               = NULL;  // Clear MIL pointer
  m_MSL               = NULL;  // Clear MSL pointer

  m_CharacterParent   = NULL;  // Clear character list
  m_NumCharacters     = 0;

  m_DefinitionFile[0] = 0;     // Clear definition filename

  m_NumMeshes         = 0;     // Clear mesh data
  m_Meshes            = NULL;
  m_TexturePath[0]    = 0;

  m_NumAnimations     = 0;     // Clear animation data
  m_Animations        = NULL;

  m_SpellController   = NULL;  // Clear spell controller
}

cCharacterController::~cCharacterController()
{
  Shutdown();
}

BOOL cCharacterController::Init(                              \
                          cGraphics *Graphics,                \
                          cFont *Font, char *DefinitionFile,  \
                          sItem *MIL, sSpell *MSL,            \
                          long NumCharacterMeshes,            \
                          char **MeshNames,                   \
                          char *MeshPath, char *TexturePath,  \
                          long NumAnimations,                 \
                          sCharAnimationInfo *Anims,          \
                          cSpellController *SpellController)
{
  long i;

  Free();  // Free prior init

  // Get parent graphics object and error checking
  if((m_Graphics = Graphics) == NULL || MeshNames == NULL ||  \
     DefinitionFile == NULL)
    return FALSE;

  // Get font object pointer
  m_Font = Font;

  // Copy definition file name
  strcpy(m_DefinitionFile, DefinitionFile);

  // Store MIL and MSL pointer
  m_MIL = MIL;
  m_MSL = MSL;

  // Copy over mesh path (or set default)
  if(MeshPath != NULL)
    strcpy(m_MeshPath, MeshPath);
  else
    strcpy(m_MeshPath, ".\\");

  // Copy over texture path (or set default)
  if(TexturePath != NULL)
    strcpy(m_TexturePath, TexturePath);
  else
    strcpy(m_TexturePath, ".\\");

  // Get mesh names
  if((m_NumMeshes = NumCharacterMeshes)) {
    m_Meshes = new sCharacterMeshList[NumCharacterMeshes]();
    for(i=0;i<m_NumMeshes;i++)
      strcpy(m_Meshes[i].Filename, MeshNames[i]);
  }

  // Get animation data
  if((m_NumAnimations = NumAnimations)) {
    m_Animations = new sCharAnimationInfo[m_NumAnimations]();
    for(i=0;i<m_NumAnimations;i++) {
      memcpy(&m_Animations[i], &Anims[i],                     \
             sizeof(sCharAnimationInfo));
    }
  }

  // Store spell controller pointer
  m_SpellController = SpellController;

  return TRUE;
}

BOOL cCharacterController::Shutdown()
{
  Free();

  // Release mesh list
  delete [] m_Meshes;
  m_Meshes = NULL;
  m_NumMeshes = 0;

  // Release animation data
  m_NumAnimations = 0;
  delete [] m_Animations;
  m_Animations = NULL;

  // Clear graphics object
  m_Graphics = NULL;

  // Clear paths
  m_DefinitionFile[0] = 0;
  m_MeshPath[0] = 0;
  m_TexturePath[0] = 0;

  // Clear spell controller
  m_SpellController = NULL;

  return TRUE;
}

BOOL cCharacterController::Free()
{
  // Release character structures
  delete m_CharacterParent;
  m_CharacterParent = NULL;
  m_NumCharacters = 0;

  return TRUE;
}

BOOL cCharacterController::Add(                               \
             long IDNum, long Definition,                     \
             long Type, long AI,                              \
             float XPos, float YPos, float ZPos,              \
             float Direction)
{
  sCharacter *CharPtr;
  FILE *fp;
  char Path[MAX_PATH];
  long i;

  // Error checking
  if(m_Graphics==NULL || m_Meshes==NULL || !m_DefinitionFile[0])
    return FALSE;

  // Allocate a new structure
  CharPtr = new sCharacter();

  // Assign data
  CharPtr->Definition = Definition;
  CharPtr->ID         = IDNum;
  CharPtr->Type       = Type;
  CharPtr->AI         = AI;
  CharPtr->XPos       = XPos;
  CharPtr->YPos       = YPos;
  CharPtr->ZPos       = ZPos;
  CharPtr->Direction  = Direction;
  CharPtr->Enabled    = TRUE;

  // Set a random charge amount
  CharPtr->Charge = (float)(rand() % 101);

  // Load character definition
  if((fp=fopen(m_DefinitionFile, "rb"))==NULL) {
    delete CharPtr;
    return FALSE;
  }
  fseek(fp, sizeof(sCharacterDefinition)*Definition, SEEK_SET);
  fread(&CharPtr->Def, 1, sizeof(sCharacterDefinition), fp);
  fclose(fp);

  // Load character ICS
  if(CharPtr->Def.ItemFilename[0]) {
    CharPtr->CharICS = new cCharICS();
    CharPtr->CharICS->Load(CharPtr->Def.ItemFilename);
  }

  // Set character stats
  CharPtr->HealthPoints = CharPtr->Def.HealthPoints;
  CharPtr->ManaPoints   = CharPtr->Def.ManaPoints;

  // Load mesh and animation if needed
  if(!m_Meshes[CharPtr->Def.MeshNum].Count) {
    m_Meshes[CharPtr->Def.MeshNum].Mesh.Load(m_Graphics,      \
                   m_Meshes[CharPtr->Def.MeshNum].Filename,   \
                   m_TexturePath);

    m_Meshes[CharPtr->Def.MeshNum].Animation.Load(            \
                   m_Meshes[CharPtr->Def.MeshNum].Filename,   \
                   &m_Meshes[CharPtr->Def.MeshNum].Mesh);

    // Set animation loops
    if(m_NumAnimations) {
      for(i=0;i<m_NumAnimations;i++)
        m_Meshes[CharPtr->Def.MeshNum].Animation.SetLoop(     \
                                      m_Animations[i].Loop,   \
                                      m_Animations[i].Name);
    }
  }

  // Configure graphics object
  CharPtr->Object.Create(m_Graphics,                          \
                        &m_Meshes[CharPtr->Def.MeshNum].Mesh);
  m_Meshes[CharPtr->Def.MeshNum].Count++;

  // Load and configure weapon (if any)
  if(m_MIL != NULL && CharPtr->Def.Weapon != -1 &&            \
     m_MIL[CharPtr->Def.Weapon].MeshFilename[0]) {

    // Build the mesh path
    sprintf(Path, "%s%s", m_MeshPath,                         \
            m_MIL[CharPtr->Def.Weapon].MeshFilename);

    // Load the weapon mesh
    CharPtr->WeaponMesh.Load(m_Graphics, Path, m_TexturePath);

    // Create the weapon object
    CharPtr->WeaponObject.Create(m_Graphics,                  \
                                 &CharPtr->WeaponMesh);

    // Orient and attach the weapon
    CharPtr->WeaponObject.Move(0.0f, 0.0f, 0.0f);
    CharPtr->WeaponObject.Rotate(0.0f, 0.0f, 0.0f);
    CharPtr->WeaponObject.AttachToObject(&CharPtr->Object,    \
                                         "WeaponHand");
  }

  // Link in to head of list
  if(m_CharacterParent != NULL)
    m_CharacterParent->Prev = CharPtr;
  CharPtr->Next = m_CharacterParent;
  m_CharacterParent = CharPtr;

  return TRUE;
}

BOOL cCharacterController::Remove(long IDNum)
{
  return Remove(GetCharacter(IDNum));
}
 
BOOL cCharacterController::Remove(sCharacter *Character)
{
  // Error checking
  if(Character == NULL)
    return FALSE;

  // Decrease mesh count and release if no more
  m_Meshes[Character->Def.MeshNum].Count--;
  if(!m_Meshes[Character->Def.MeshNum].Count) {
    m_Meshes[Character->Def.MeshNum].Mesh.Free();
    m_Meshes[Character->Def.MeshNum].Animation.Free();
  }

  // Remove from list and free resource
  if(Character->Prev != NULL)
    Character->Prev->Next = Character->Next;
  else
    m_CharacterParent = Character->Next;

  if(Character->Next != NULL)
    Character->Next->Prev = Character->Prev;

  if(Character->Prev == NULL && Character->Next == NULL)
    m_CharacterParent = NULL;

  Character->Prev = Character->Next = NULL;
  delete Character;

  return TRUE;
}

BOOL cCharacterController::Save(long IDNum, char *Filename)
{
  char ICSFilename[MAX_PATH];
  sCharacter *CharPtr;
  FILE *fp;

  // Get pointer to character in list
  if((CharPtr = GetCharacter(IDNum)) == NULL)
    return FALSE;

  // Open file
  if((fp=fopen(Filename, "wb"))==NULL)
    return FALSE;

  // Output character data
  fwrite(&CharPtr->Def, 1, sizeof(sCharacterDefinition), fp);
  fwrite(&CharPtr->HealthPoints, 1, sizeof(long), fp);
  fwrite(&CharPtr->ManaPoints, 1, sizeof(long), fp);
  fwrite(&CharPtr->Ailments, 1, sizeof(long), fp);
  fwrite(&CharPtr->XPos, 1, sizeof(float), fp);
  fwrite(&CharPtr->YPos, 1, sizeof(float), fp);
  fwrite(&CharPtr->ZPos, 1, sizeof(float), fp);
  fwrite(&CharPtr->Direction, 1, sizeof(float), fp);

  // Close file
  fclose(fp);

  // Save inventory
  if(CharPtr->CharICS != NULL) {
    sprintf(ICSFilename, "ICS%s", Filename);
    CharPtr->CharICS->Save(ICSFilename);
  }

  return TRUE;
}

BOOL cCharacterController::Load(long IDNum, char *Filename)
{
  char ICSFilename[MAX_PATH];
  sCharacter *CharPtr;
  FILE *fp;

  // Get pointer to character in list
  if((CharPtr = GetCharacter(IDNum)) == NULL)
    return FALSE;

  // Open file
  if((fp=fopen(Filename, "rb"))==NULL)
    return FALSE;

  // Read in character data
  fread(&CharPtr->Def, 1, sizeof(sCharacterDefinition), fp);
  fread(&CharPtr->HealthPoints, 1, sizeof(long), fp);
  fread(&CharPtr->ManaPoints, 1, sizeof(long), fp);
  fread(&CharPtr->Ailments, 1, sizeof(long), fp);
  fread(&CharPtr->XPos, 1, sizeof(float), fp);
  fread(&CharPtr->YPos, 1, sizeof(float), fp);
  fread(&CharPtr->ZPos, 1, sizeof(float), fp);
  fread(&CharPtr->Direction, 1, sizeof(float), fp);

  // Close file
  fclose(fp);

  // Load inventory
  if(CharPtr->CharICS != NULL) {
    sprintf(ICSFilename, "ICS%s", Filename);
    CharPtr->CharICS->Load(ICSFilename);
  }

  return TRUE;
}

BOOL cCharacterController::Update(long Elapsed)
{
  sCharacter *CharPtr, *NextChar;
  float XMove, YMove, ZMove;
  static long EffectCounter = 0;
  BOOL ToProcess, DeadChar;

  // Return success if no characters to update
  if((CharPtr = m_CharacterParent) == NULL)
    return TRUE;

  // Update effect counter
  EffectCounter += Elapsed;

  // Loop through all characters
  while(CharPtr != NULL) {

    // Remember next character
    NextChar = CharPtr->Next;

    // Only update if enabled, not asleep or paralyzed
    if(CharPtr->Enabled == TRUE) {

      // Update action timer if in use
      if(CharPtr->ActionTimer != 0) {
        CharPtr->ActionTimer -= Elapsed;
        if(CharPtr->ActionTimer < 0)
          CharPtr->ActionTimer = 0;
      }

      // Update text message timer
      if(CharPtr->MessageTimer > 0)
        CharPtr->MessageTimer -= Elapsed;

      // Reset charge counter if attacking, spell, or item
      if(CharPtr->Action == CHAR_ATTACK ||                    \
         CharPtr->Action == CHAR_SPELL  ||                    \
         CharPtr->Action == CHAR_ITEM)
        CharPtr->Charge = 0.0f;

      // Kill character if no health left
      if(CharPtr->HealthPoints <= 0 &&                        \
         CharPtr->Action != CHAR_DIE) {
        SetAction(CharPtr, CHAR_DIE, 2000);
      }

      // Mark that processing can continue later on
      ToProcess = TRUE;

      // Mark character as still alive
      DeadChar = FALSE;

      // Don't allow an update if asleep or paralyzed
      if((CharPtr->Ailments & AILMENT_SLEEP) ||               \
         (CharPtr->Ailments & AILMENT_PARALYZE))
        ToProcess = FALSE;
       
      // Process non-idle, non-walk actions
      if(CharPtr->Action != CHAR_IDLE &&                      \
         CharPtr->Action != CHAR_MOVE &&                      \
         !CharPtr->ActionTimer) {
         
        switch(CharPtr->Action) {
          case CHAR_ATTACK:
            // Process attack
            if(ToProcess == TRUE)
              Attack(CharPtr, CharPtr->Victim);
            break;

          case CHAR_SPELL:
            // Manually cast a spell
            if(m_SpellController != NULL && m_MSL != NULL &&  \
               ToProcess == TRUE) {
              m_SpellController->Add(CharPtr->SpellNum,       \
                           CharPtr, CharPtr->SpellTarget,     \
                           CharPtr->XPos,                     \
                           CharPtr->YPos,                     \
                           CharPtr->ZPos,                     \
                           CharPtr->TargetX,                  \
                           CharPtr->TargetY,                  \
                           CharPtr->TargetZ);
            }
            break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米色一区二区三区四区| 成人97人人超碰人人99| 成人av网站免费观看| 欧美疯狂做受xxxx富婆| 中文字幕一区二区三区乱码在线| 天天免费综合色| 99视频一区二区| 久久久亚洲国产美女国产盗摄 | 日本丰满少妇一区二区三区| 日韩一区二区精品| 亚洲最色的网站| 97se亚洲国产综合在线| 中文字幕久久午夜不卡| 国内国产精品久久| 日韩视频中午一区| 亚洲丰满少妇videoshd| 欧美自拍偷拍一区| 亚洲蜜臀av乱码久久精品| 99久久婷婷国产综合精品 | 国产麻豆精品在线| 日韩精品一区二区在线观看| 日韩黄色片在线观看| 欧美性猛交xxxxxx富婆| 亚洲人成精品久久久久久 | 国产成人自拍在线| 精品日韩av一区二区| 日本美女一区二区| 日韩情涩欧美日韩视频| 奇米色777欧美一区二区| 欧美精品电影在线播放| 五月天中文字幕一区二区| 欧美性三三影院| 亚洲影视资源网| 欧美伊人久久大香线蕉综合69 | 中文字幕av资源一区| 大桥未久av一区二区三区中文| 国产亚洲成aⅴ人片在线观看 | 久久99国产精品麻豆| 日韩欧美国产不卡| 国产一区二区三区精品视频| 国产偷v国产偷v亚洲高清| 国产成人av福利| 国产精品美女久久久久久久| av电影在线观看一区| 亚洲精品乱码久久久久| 欧美三级电影网站| 蜜臀a∨国产成人精品| 精品理论电影在线| 成人h动漫精品| 亚洲午夜久久久| 日韩一区二区三区电影在线观看| 黄色日韩网站视频| 国产精品色眯眯| 色综合久久久久综合| 婷婷成人激情在线网| 精品伦理精品一区| 99久久伊人精品| 天使萌一区二区三区免费观看| 日韩三级视频中文字幕| 国产伦精品一区二区三区免费| 亚洲色图视频网| 欧美日韩免费电影| 国产激情偷乱视频一区二区三区| 亚洲精品v日韩精品| 欧美一级在线观看| av欧美精品.com| 日本91福利区| 综合色天天鬼久久鬼色| 91麻豆精品久久久久蜜臀| 国产.精品.日韩.另类.中文.在线.播放| 亚洲免费资源在线播放| 精品欧美久久久| 欧美影院一区二区| 国产风韵犹存在线视精品| 亚洲一区中文在线| 久久精品人人做人人综合| 欧洲精品一区二区三区在线观看| 国内精品自线一区二区三区视频| 亚洲天堂网中文字| 欧美v日韩v国产v| 欧洲亚洲国产日韩| 国产99久久久国产精品潘金| 日日摸夜夜添夜夜添精品视频| 国产精品午夜电影| 日韩欧美一区二区不卡| 欧亚洲嫩模精品一区三区| 国产精品夜夜嗨| 日韩电影在线免费看| 亚洲色欲色欲www| 久久久精品国产免费观看同学| 欧美肥胖老妇做爰| 91成人网在线| 99国产欧美久久久精品| 狠狠久久亚洲欧美| 日韩电影一区二区三区四区| 一区二区在线免费| 国产精品麻豆视频| 久久久www免费人成精品| 91精品国产乱码| 欧美少妇xxx| 色婷婷综合久色| eeuss国产一区二区三区| 黄色日韩网站视频| 精品一区二区久久| 麻豆精品一二三| 日韩电影免费在线看| 偷拍一区二区三区四区| 亚洲综合成人网| 17c精品麻豆一区二区免费| 国产精品女同互慰在线看 | 日韩欧美一区二区久久婷婷| 欧美日韩精品一区二区天天拍小说 | 成人免费毛片嘿嘿连载视频| 经典三级一区二区| 精品亚洲porn| 久久福利视频一区二区| 久久国产剧场电影| 美腿丝袜在线亚洲一区| 奇米影视一区二区三区| 男人的j进女人的j一区| 美女尤物国产一区| 激情综合色播激情啊| 国产精品一区二区你懂的| 国产一区二区三区电影在线观看| 国产乱码精品一区二区三区忘忧草| 久久99国产乱子伦精品免费| 国产精品综合网| jlzzjlzz亚洲女人18| 91香蕉视频污在线| 欧美性xxxxxxxx| 欧美一区二区性放荡片| 26uuu精品一区二区在线观看| 久久午夜免费电影| 国产精品美女久久久久久2018| 中文字幕五月欧美| 亚洲一区视频在线| 日产国产高清一区二区三区| 精久久久久久久久久久| 成人黄色在线看| 欧美亚洲综合另类| 日韩色视频在线观看| 国产精品午夜免费| 亚洲午夜精品久久久久久久久| 久久精品国产一区二区三区免费看| 韩国av一区二区三区| 99精品一区二区三区| 欧美日韩大陆在线| 国产欧美一区二区精品久导航| 国产精品国产自产拍高清av| 亚洲一区二区三区四区不卡| 精品亚洲成a人| 92精品国产成人观看免费| 91精品欧美久久久久久动漫| 久久精品亚洲乱码伦伦中文| 亚洲日本乱码在线观看| 青青草伊人久久| 99久久99久久精品国产片果冻| 7777精品伊人久久久大香线蕉超级流畅| 欧美不卡一区二区三区四区| 国产精品乱子久久久久| 日本欧洲一区二区| 日本伦理一区二区| 久久嫩草精品久久久精品| 一区二区三区日韩精品视频| 美腿丝袜一区二区三区| 色婷婷国产精品久久包臀| 久久蜜臀精品av| 视频一区中文字幕| av在线免费不卡| 久久综合久久综合久久综合| 一区二区在线看| 波多野结衣的一区二区三区| 精品久久免费看| 亚洲va国产va欧美va观看| 成人99免费视频| 久久久亚洲精品石原莉奈| 日产精品久久久久久久性色| 欧美最猛黑人xxxxx猛交| 国产精品大尺度| 国产美女视频91| 欧美一级一区二区| 天天爽夜夜爽夜夜爽精品视频| 成人高清伦理免费影院在线观看| 日韩美女主播在线视频一区二区三区| 一区二区免费看| 色婷婷av一区| 亚洲乱码国产乱码精品精可以看 | 91网页版在线| 久久精品男人天堂av| 麻豆91精品视频| 欧美日韩不卡一区| 亚洲国产综合91精品麻豆| 色综合天天在线| 亚洲欧洲精品天堂一级| 粉嫩aⅴ一区二区三区四区| 久久久www免费人成精品| 精品制服美女丁香| 精品99久久久久久| 极品少妇xxxx精品少妇| 日韩精品一区二区三区三区免费 |