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

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

?? game_chars.cpp

?? 3D游戲引擎 Programming Role-Playing Games with DirectX, 2nd Edition by Jim Adams
?? CPP
字號:
#include "global.h"

// Look for PC character from WinMain.cpp
extern sCharacter *g_PCChar;

///////////////////////////////////////////////////////////
// cChars class code
///////////////////////////////////////////////////////////
BOOL cChars::PCUpdate(sCharacter *Character, long Elapsed,    \
                    float *XMove, float *YMove, float *ZMove)
{
  float Speed;
  sCharacter *TargetChar;
  float XDiff, YDiff, ZDiff;
  float Dist, Range;
  char Filename[MAX_PATH];
  long Spell = -1;

  // Don't update if no elapsed time
  if(!Elapsed)
    return TRUE;

  // Rotate character
  if(m_App->m_Keyboard.GetKeyState(KEY_LEFT) == TRUE) {
    Character->Direction -= (float)Elapsed / 1000.0f * 4.0f;
    Character->Action = CHAR_MOVE;
  }

  if(m_App->m_Keyboard.GetKeyState(KEY_RIGHT) == TRUE) {
    Character->Direction += (float)Elapsed / 1000.0f * 4.0f;
    Character->Action = CHAR_MOVE;
  }

  if(m_App->m_Keyboard.GetKeyState(KEY_UP) == TRUE) {
    Speed = (float)Elapsed / 1000.0f *                        \
                   m_App->m_CharController.GetSpeed(Character);
    *XMove = (float)sin(Character->Direction) * Speed;
    *ZMove = (float)cos(Character->Direction) * Speed;
    Character->Action = CHAR_MOVE;
  }

  // Process attack/talk action
  if(m_App->m_Mouse.GetButtonState(MOUSE_LBUTTON) == TRUE) {
    
    // See which character is being pointed at and make
    // sure it's a monster character.
    if((TargetChar = m_App->GetCharacterAt(                   \
                       m_App->m_Mouse.GetXPos(),              \
                       m_App->m_Mouse.GetYPos())) != NULL) {

      // Handle talking to NPCs
      if(TargetChar->Type == CHAR_NPC) {
        // No distance checks, just process their script
        sprintf(Filename, "..\\Data\\Char%lu.mls",            \
                TargetChar->ID);
        m_App->m_Script.Execute(Filename);

        return TRUE; // Don't process anymore
      }
                       
      // Handle attacking monsters
      if(TargetChar->Type == CHAR_MONSTER) {

        // Get distance to target
        XDiff = (float)fabs(TargetChar->XPos-Character->XPos);
        YDiff = (float)fabs(TargetChar->YPos-Character->YPos);
        ZDiff = (float)fabs(TargetChar->ZPos-Character->ZPos);
        Dist = XDiff*XDiff + YDiff*YDiff + ZDiff*ZDiff;

        // Offset dist by target's radius
        Range = GetXZRadius(TargetChar);
        Dist -= (Range * Range);
      
        // Get maximum attack range
        Range = GetXZRadius(Character);
        Range += Character->Def.Range;

        // Only perform attack if target in range
        if(Dist <= (Range * Range)) {

          // Set target/victim info
          TargetChar->Attacker = Character;
          Character->Victim    = TargetChar;

          // Face victim
          XDiff = TargetChar->XPos - Character->XPos;
          ZDiff = TargetChar->ZPos - Character->ZPos;
          Character->Direction = (float)atan2(XDiff, ZDiff);

          // Set action
          m_App->m_CharController.SetAction(Character,        \
                                            CHAR_ATTACK);
        }
      }
    }
  }

  // Cast magic spell based on # pressed
  if(m_App->m_Keyboard.GetKeyState(KEY_1) == TRUE) {
    m_App->m_Keyboard.SetLock(KEY_1, TRUE);
      Spell = 0;  // Fireball
  }
  if(m_App->m_Keyboard.GetKeyState(KEY_2) == TRUE) {
    m_App->m_Keyboard.SetLock(KEY_2, TRUE);
    Spell = 1;  // Ice
  }
  if(m_App->m_Keyboard.GetKeyState(KEY_3) == TRUE) {
    m_App->m_Keyboard.SetLock(KEY_3, TRUE);
    Spell = 2;  // Heal Self
  }
  if(m_App->m_Keyboard.GetKeyState(KEY_4) == TRUE) {
    m_App->m_Keyboard.SetLock(KEY_4, TRUE);
    Spell = 3;  // Teleport
  }
  if(m_App->m_Keyboard.GetKeyState(KEY_5) == TRUE) {
    m_App->m_Keyboard.SetLock(KEY_5, TRUE);
    Spell = 4;  // Groundball
  }

  // Cast spell if commanded
  if(Spell != -1) {

    // Only cast if spell known and has enough mana points
    if(g_PCChar->Def.MagicSpells[Spell/32]&(1<<(Spell&31)) && \
            g_PCChar->ManaPoints >=                           \
            m_App->m_SpellController.GetSpell(Spell)->Cost) {

      // See which character is being pointed
      if((TargetChar = m_App->GetCharacterAt(                 \
                       m_App->m_Mouse.GetXPos(),              \
                       m_App->m_Mouse.GetYPos())) != NULL) {

        // Don't target NPC's
        if(TargetChar->Type != CHAR_NPC) {

          // Get distance to target
          XDiff = (float)fabs(TargetChar->XPos-Character->XPos);
          YDiff = (float)fabs(TargetChar->YPos-Character->YPos);
          ZDiff = (float)fabs(TargetChar->ZPos-Character->ZPos);
          Dist = XDiff*XDiff + YDiff*YDiff + ZDiff*ZDiff;

          // Offset dist by target's radius
          Range = GetXZRadius(TargetChar);
          Dist -= (Range * Range);
      
          // Get maximum spell range
          Range = GetXZRadius(Character);
          Range +=                                            \
            m_App->m_SpellController.GetSpell(Spell)->Distance;

          // Only perform spell if target in range
          if(Dist <= (Range * Range)) {

            // Set spell data
            Character->SpellNum    = Spell;
            Character->SpellTarget = CHAR_MONSTER;
      
            // Store target coordinates
            Character->TargetX = TargetChar->XPos;
            Character->TargetY = TargetChar->YPos;
            Character->TargetZ = TargetChar->ZPos;

            // Clear movement
            (*XMove) = (*YMove) = (*ZMove) = 0.0f;
        
            // Perform spell action
            SetAction(Character, CHAR_SPELL);

            // Face victim
            XDiff = TargetChar->XPos - Character->XPos;
            ZDiff = TargetChar->ZPos - Character->ZPos;
            Character->Direction = (float)atan2(XDiff, ZDiff);

            // Set action
            m_App->m_CharController.SetAction(Character,      \
                                              CHAR_SPELL);
          }
        }
      }
    }
  }

  // Enter status frame if right mouse button pressed
  if(m_App->m_Mouse.GetButtonState(MOUSE_RBUTTON) == TRUE) {
    m_App->m_Mouse.SetLock(MOUSE_RBUTTON, TRUE);
    m_App->m_StateManager.Push(m_App->StatusFrame, m_App);
  }

  return TRUE;
}

BOOL cChars::ValidateMove(sCharacter *Character,              \
                    float *XMove, float *YMove, float *ZMove)
{
  float Height;

  // Check against terrain mesh for collision
  if(m_App != NULL) {
    if(m_App->CheckIntersect(                                 \
         Character->XPos,                                     \
         Character->YPos + 8.0f,                              \
         Character->ZPos,                                     \
         *XMove + Character->XPos,                            \
         *YMove + Character->YPos + 8.0f,                     \
         *ZMove + Character->ZPos, NULL) == TRUE)
      return FALSE;
  }

  // Get new height
  Height = m_App->GetHeightBelow(*XMove + Character->XPos,    \
                                 32.0f  + Character->YPos,  \
                                 *ZMove + Character->ZPos);
  *YMove = Height - Character->YPos;

  // Check against barriers and clear movement if any
  if(m_App->m_Barrier.GetBarrier(*XMove + Character->XPos,    \
                                 *YMove + Character->YPos,    \
                                 *ZMove + Character->ZPos)!=0)
    (*XMove) = (*YMove) = (*ZMove) = 0.0f;

  return TRUE;
}

BOOL cChars::Experience(sCharacter *Character, long Amount)
{
  m_App->m_CombatExp += Amount;

  return FALSE;  // Don't display message
}

BOOL cChars::PCTeleport(sCharacter *Character, sSpell *Spell)
{
  // Teleport player to town
  m_App->SetupTeleport(1, 100.0f, 0.0f, -170.0f);

  return TRUE;
}

BOOL cChars::ActionSound(sCharacter *Character)
{
  if(m_App == NULL || Character == NULL)
    return TRUE;

  // Play sound based on character type and action
  switch(Character->Action) {
    case CHAR_ATTACK:
      if(!Character->ID)
        m_App->PlaySound(0);
      else
        m_App->PlaySound(1);
      break;

    case CHAR_SPELL:
      m_App->PlaySound(2);
      break;

    case CHAR_HURT:
      if(!Character->ID)
        m_App->PlaySound(4);
      else
        m_App->PlaySound(5);
      break;

    case CHAR_DIE:
      if(!Character->ID)
        m_App->PlaySound(6);
      else
        m_App->PlaySound(7);
      break;
  }

  return TRUE;
}

BOOL cChars::DropMoney(float XPos, float YPos, float ZPos,    \
                       long Quantity)
{
  m_App->m_CombatMoney += Quantity;

  return TRUE;
}

BOOL cChars::DropItem(float XPos, float YPos, float ZPos,     \
                      long Item, long Quantity)
{
  m_App->m_CombatItems[Item] += Quantity;

  return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品免费| 国产精品久久久久久久久久久免费看| 欧美mv日韩mv| 一区二区三区91| 国产精品影视在线| 91麻豆精品国产自产在线| 中文字幕 久热精品 视频在线 | 国产欧美一区二区精品忘忧草| 一色屋精品亚洲香蕉网站| 国内外精品视频| 欧美日韩精品一二三区| 综合欧美亚洲日本| 国产成a人亚洲精| 精品国产91亚洲一区二区三区婷婷 | 毛片一区二区三区| 欧美视频一区在线观看| 亚洲精品欧美专区| 成人黄动漫网站免费app| 久久亚洲精精品中文字幕早川悠里| 亚洲电影在线播放| 色综合欧美在线| 成人欧美一区二区三区1314| 国产一区二区91| 精品国产一区二区三区久久影院| 亚洲一区视频在线观看视频| 91麻豆高清视频| 亚洲欧美另类小说视频| 99精品视频中文字幕| 国产精品久久影院| 成人美女视频在线看| 国产欧美1区2区3区| 国产精品一区二区免费不卡| 久久久久综合网| 国产91丝袜在线18| 国产日本欧美一区二区| 丰满亚洲少妇av| 中文字幕亚洲在| 色哟哟日韩精品| 天堂蜜桃91精品| 成人在线视频一区二区| 国产精品剧情在线亚洲| 色婷婷av一区二区三区gif| 亚洲一区在线观看网站| 91精品综合久久久久久| 久久99国内精品| 国产精品三级久久久久三级| 一本久道久久综合中文字幕| 亚洲成人中文在线| 久久这里只有精品视频网| 成人国产亚洲欧美成人综合网 | 欧美精品一区二区高清在线观看 | 国产亚洲人成网站| 成人丝袜高跟foot| 亚洲视频精选在线| 欧美性大战久久| 人禽交欧美网站| 日韩情涩欧美日韩视频| 激情五月激情综合网| 国产欧美一区二区在线观看| 懂色av中文一区二区三区 | 日韩欧美色综合| 五月天一区二区三区| 久久久亚洲国产美女国产盗摄| 国产suv精品一区二区6| 亚洲美女免费在线| 欧美三电影在线| 麻豆精品国产91久久久久久| 精品国产不卡一区二区三区| www.欧美亚洲| 亚洲黄色性网站| 日韩精品影音先锋| 成人性生交大片免费看视频在线| 国产精品久久影院| 欧美色国产精品| 亚洲综合在线视频| 久久亚洲一级片| 欧美中文字幕一区二区三区亚洲| 亚洲摸摸操操av| 欧美videos中文字幕| 国产一区二区不卡在线| 亚洲欧美日韩国产综合| 日韩欧美一级在线播放| 成人91在线观看| 麻豆国产精品777777在线| 国产精品天天摸av网| 欧美中文字幕一二三区视频| www.色综合.com| 久久国产视频网| 亚洲伦理在线精品| 欧美精品一区二区高清在线观看| 91浏览器在线视频| 韩国欧美一区二区| 亚洲一区在线视频| 精品美女一区二区| 日韩一区二区免费高清| 91女神在线视频| 国产伦精品一区二区三区在线观看| 亚洲欧美激情插| 久久精品日产第一区二区三区高清版| 欧美性淫爽ww久久久久无| 国产精品亚洲第一区在线暖暖韩国| 亚洲六月丁香色婷婷综合久久| 91精品欧美久久久久久动漫 | 一级中文字幕一区二区| 久久一二三国产| 欧美日本在线一区| 91蜜桃在线免费视频| 日韩影院在线观看| 国产精品理伦片| 日韩午夜激情视频| 欧美午夜电影网| 91国模大尺度私拍在线视频| 丁香激情综合五月| 国产一区二区三区美女| 久久99精品久久久久久久久久久久| 亚洲一区二区在线观看视频| 亚洲国产精品二十页| 亚洲精品一线二线三线| 欧美日韩精品欧美日韩精品一| 欧美日韩中文字幕精品| www.亚洲国产| 99精品偷自拍| 91小视频在线观看| a4yy欧美一区二区三区| 成人一区二区三区| 国产精品一级黄| 97久久人人超碰| 国产一区二区不卡老阿姨| 久久国产日韩欧美精品| 国精产品一区一区三区mba桃花 | 久久精品国产亚洲aⅴ| 久久国产精品一区二区| 免费av成人在线| 麻豆精品在线播放| 激情文学综合网| 国产精品91xxx| av在线不卡免费看| 欧美性猛片aaaaaaa做受| 欧美日韩aaa| 精品黑人一区二区三区久久 | 色妹子一区二区| 在线观看av一区| 精品久久免费看| 国产喷白浆一区二区三区| 中文字幕电影一区| 亚洲欧美激情在线| 亚洲成人免费av| 久久福利资源站| 久久99久久久欧美国产| www.爱久久.com| 欧美日韩国产成人在线免费| 6080午夜不卡| 国产亚洲精品资源在线26u| 欧美国产精品一区| 一区二区三区中文字幕电影| 亚洲欧洲三级电影| av在线一区二区| 在线观看一区日韩| 91精品视频网| 国产精品亲子伦对白| 夜夜嗨av一区二区三区四季av| 一区二区三区精品在线观看| 国产剧情一区二区三区| 91丝袜高跟美女视频| 91精品国产91热久久久做人人| 精品国产一区二区三区不卡| 国产精品天天看| 亚洲超碰97人人做人人爱| 极品少妇一区二区三区精品视频 | 国产精品不卡一区二区三区| 亚洲午夜私人影院| 国产一区二区三区在线观看精品| 亚洲国产cao| 99免费精品视频| 欧美一区二区三区电影| 国产欧美1区2区3区| 日韩精品电影在线| 成人污视频在线观看| 日韩一区二区在线观看| 日韩美女精品在线| 久久国产尿小便嘘嘘尿| 91久久人澡人人添人人爽欧美| 26uuu另类欧美| 午夜国产不卡在线观看视频| 国产高清在线观看免费不卡| 在线看不卡av| 中国av一区二区三区| 美女在线视频一区| 欧美艳星brazzers| 中文av一区二区| 精品一二线国产| 91精品久久久久久蜜臀| 中文字幕永久在线不卡| 日本不卡高清视频| 欧美日韩不卡在线| 日本亚洲电影天堂| 欧美日韩一级视频| 亚洲精品综合在线| 97国产精品videossex| 国产女人水真多18毛片18精品视频|