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

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

?? chars.cpp

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

          case CHAR_ITEM:
            if(ToProcess == TRUE)
              Item(CharPtr, CharPtr,                          \
                   CharPtr->ItemNum, CharPtr->CharItem);
            break;

          case CHAR_DIE:
            Death(CharPtr->Attacker, CharPtr);
            DeadChar = TRUE;   // Mark character as dead
            ToProcess = FALSE; // Don't allow updates
            break;
        }
      }

      // Clear movement
      XMove = YMove = ZMove = 0.0f;

      // Only continue if allowed (in case character died)
      if(ToProcess == TRUE) {

        // Only allow updates if lock/timer not in use 
        if(CharPtr->Enabled == TRUE &&                        \
           !CharPtr->ActionTimer &&                           \
           CharPtr->Locked == FALSE) {

          // Reset action
          CharPtr->Action = CHAR_IDLE;

          // Get movement
          if(CharPtr->Type == CHAR_PC)
            PCUpdate(CharPtr, Elapsed, &XMove, &YMove, &ZMove);
          else
            CharUpdate(CharPtr, Elapsed, &XMove,&YMove,&ZMove);

          // Check for validity of movement (clear if invalid)
          if(CheckMove(CharPtr,&XMove,&YMove,&ZMove)==FALSE) {
            XMove = YMove = ZMove = 0.0f;
            CharPtr->Action = CHAR_IDLE;
          }
        }

        // Process movement of character
        ProcessUpdate(CharPtr, XMove, YMove, ZMove);

        // Increase action charge of character
        CharPtr->Charge += ((float)Elapsed / 1000.0f *        \
                                   GetCharge(CharPtr));
        if(CharPtr->Charge > 100.0f)
          CharPtr->Charge = 100.0f;
      }

      // Process timed ailments (only on live characters)
      if(DeadChar == FALSE && CharPtr->Ailments) {

        // Sleeping characters have 4% to wake up
        if(CharPtr->Ailments & AILMENT_SLEEP && (rand()%100)<4)
          CharPtr->Ailments &= ~AILMENT_SLEEP;

        // Paralyzed character have 2% chance to recover
        if(CharPtr->Ailments & AILMENT_PARALYZE &&            \
                                           (rand() % 100) < 2)
            CharPtr->Ailments &= ~AILMENT_PARALYZE;

        // Posion removes 2 hp every 2 seconds
        if(CharPtr->Ailments & AILMENT_POISON &&              \
                              EffectCounter >= 4000) {
          CharPtr->HealthPoints -= 2;
          SetMessage(CharPtr, "Poison -2 HP", 500,            \
                  D3DCOLOR_RGBA(0,255,64,255));
        }
      }
    }

    // Go to next character
    CharPtr = NextChar;
  }

  // Reset effect counter (after 4 seconds)
  if(EffectCounter >= 4000) 
    EffectCounter = 0;

  return TRUE;
}

BOOL cCharacterController::Render(                            \
               long       Elapsed,                            \
               cFrustum  *Frustum,                            \
               float      ZDistance)
{
  cFrustum     ViewFrustum;  // Local viewing frustum
  float        Radius;       // Bounding radius
  sCharacter  *CharPtr; 
  DWORD        Time;

  // Variables for printing messages
  BOOL         GotMatrices = FALSE;
  D3DXMATRIX   matWorld, matView, matProj;
  D3DXVECTOR3  vecPos;
  D3DVIEWPORT9 vpScreen;
  float        MaxY;

  // Error checking
  if(m_Graphics == NULL)
    return FALSE;

  // Return success if no character to draw
  if((CharPtr = m_CharacterParent) == NULL)
    return TRUE;

  // Construct the viewing frustum (if none passed)
  if((m_Frustum = Frustum) == NULL) {
    ViewFrustum.Construct(m_Graphics, ZDistance);
    m_Frustum = &ViewFrustum;
  }

  // Get time to update animations (30fps) if
  // elapsed value passed == -1
  if(Elapsed == -1)
    Time = timeGetTime() / 30;
 
  // Loop through each character and draw
  while(CharPtr != NULL) {

    // Update animation based on elapsed time passed
    if(Elapsed != -1) {
      CharPtr->LastAnimTime += (Elapsed/30);
      Time = CharPtr->LastAnimTime;
    }

    CharPtr->Object.GetBounds(NULL,NULL,NULL,                 \
                              NULL,&MaxY,NULL,&Radius);

    // Draw character if in viewing frustum
    if(m_Frustum->CheckSphere(CharPtr->Object.GetXPos(),      \
                              CharPtr->Object.GetYPos(),      \
                              CharPtr->Object.GetZPos(),      \
                              Radius) == TRUE) {

      CharPtr->Object.UpdateAnimation(Time, TRUE);
      CharPtr->Object.Render();

      // Draw character's weapon
      if(CharPtr->Def.Weapon != -1)
        CharPtr->WeaponObject.Render();

      // Draw message if needed
      if(CharPtr->MessageTimer > 0) {

        // Get the matrices and viewport if not done already
        if(GotMatrices == FALSE) {
          GotMatrices = TRUE;

          // Get the world, projection, and view transformations
          D3DXMatrixIdentity(&matWorld);
          m_Graphics->GetDeviceCOM()->GetTransform(           \
                                  D3DTS_VIEW, &matView);
          m_Graphics->GetDeviceCOM()->GetTransform(           \
                                  D3DTS_PROJECTION, &matProj);

          // Get viewport
          m_Graphics->GetDeviceCOM()->GetViewport(&vpScreen);
        }

        // Project coordinates to screen  
        D3DXVec3Project(&vecPos,                              \
                  &D3DXVECTOR3(CharPtr->XPos,                 \
                               CharPtr->YPos+(MaxY*0.5f),     \
                               CharPtr->ZPos),                \
                  &vpScreen, &matProj, &matView, &matWorld);

        // Print message
        m_Font->Print(CharPtr->Message,                       \
                      (long)vecPos.x, (long)vecPos.y,         \
                      0, 0, CharPtr->MessageColor);
      }
    }

    // go to next character    
    CharPtr = CharPtr->Next;
  }

  return TRUE;
}

float cCharacterController::GetXZRadius(sCharacter *Character)
{
  float MinX, MaxX, MinZ, MaxZ;
  float x, z;

  // Error checking
  if(Character == NULL)
    return 0.0f;

  Character->Object.GetBounds(&MinX, NULL, &MinZ,             \
                              &MaxX, NULL, &MaxZ, NULL);
  x = (float)max(fabs(MinX), fabs(MaxX));
  z = (float)max(fabs(MinZ), fabs(MaxZ));

  return max(x, z);
}

///////////////////////////////////////////////////////////
// Set/Get Functions
///////////////////////////////////////////////////////////
sCharacter *cCharacterController::GetParentCharacter()
{
  return m_CharacterParent;
}

sCharacter *cCharacterController::GetCharacter(long IDNum)
{
  sCharacter *CharPtr;

  // Scan through all characters
  if((CharPtr = m_CharacterParent) != NULL) {
    while(CharPtr != NULL) {
    
      // Return character
      if(IDNum == CharPtr->ID)
        return CharPtr;
   
      // Go to next character
      CharPtr = CharPtr->Next;
    }
  }

  return NULL;
}

float cCharacterController::GetSpeed(sCharacter *Character)
{
  float Speed;
  
  // Error checking
  if(Character == NULL)
    return 0.0f;

  // Calculate adjusted speed
  Speed = Character->Def.Speed;

  if(Character->Ailments & AILMENT_SLOW)
    Speed *= 0.5f;
  if(Character->Ailments & AILMENT_FAST)
    Speed *= 1.5f;

  // Bounds check value
  if(Speed < 1.0f)
    Speed = 1.0f;

  return Speed;
}

long cCharacterController::GetAttack(sCharacter *Character)
{
  long Attack;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted attack
  Attack = Character->Def.Attack;

  // Adjust attack based on item value (in %(Value/100)+1)
  if(Character->Def.Weapon != -1 && m_MIL != NULL) {
    Attack = (long)((float)Attack *                           \
             (((float)m_MIL[Character->Def.Weapon].Value /    \
             100.0f) + 1.0f));
  }

  if(Character->Ailments & AILMENT_WEAK)
    Attack = (long)((float)Attack * 0.5f);
  if(Character->Ailments & AILMENT_STRONG)
    Attack = (long)((float)Attack * 1.5f);

  return Attack;
}

long cCharacterController::GetDefense(sCharacter *Character)
{
  long Defense;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted defense
  Defense = Character->Def.Defense;
  
  if(Character->Def.Armor != -1 && m_MIL != NULL)
    Defense = (long)((float)Defense *                         \
             (((float)m_MIL[Character->Def.Armor].Value /     \
             100.0f) + 1.0f));

  if(Character->Def.Shield != -1 && m_MIL != NULL)
    Defense = (long)((float)Defense *                         \
             (((float)m_MIL[Character->Def.Shield].Value /    \
             100.0f) + 1.0f));

  if(Character->Ailments & AILMENT_WEAK)
    Defense = (long)((float)Defense * 0.5f);
  if(Character->Ailments & AILMENT_STRONG)
    Defense = (long)((float)Defense * 1.5f);

  // Bounds check value
  if(Defense < 0)
    Defense = 0;

  return Defense;
}

long cCharacterController::GetAgility(sCharacter *Character)
{
  long Agility;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted agility
  Agility = Character->Def.Agility;
  
  if(Character->Ailments & AILMENT_CLUMSY)
    Agility = (long)((float)Agility * 0.75f);
  if(Character->Ailments & AILMENT_SUREFOOTED)
    Agility = (long)((float)Agility * 1.5f);

  return Agility;
}

long cCharacterController::GetResistance(sCharacter *Character)
{
  long Resistance;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted resistance
  Resistance = Character->Def.Resistance;
  
  if(Character->Ailments & AILMENT_ENCHANTED)
    Resistance = (long)((float)Resistance * 0.5f);
  if(Character->Ailments & AILMENT_BARRIER)
    Resistance = (long)((float)Resistance * 1.5f);

  return Resistance;
}

long cCharacterController::GetMental(sCharacter *Character)
{
  long Mental;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted mental
  Mental = Character->Def.Mental;
  
  if(Character->Ailments & AILMENT_DUMBFOUNDED)
    Mental = (long)((float)Mental * 0.5f);

  return Mental;
}

long cCharacterController::GetToHit(sCharacter *Character)
{
  long ToHit;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted to hit
  ToHit = Character->Def.ToHit;
  
  if(Character->Ailments & AILMENT_BLIND)
    ToHit = (long)((float)ToHit * 0.75f);
  if(Character->Ailments & AILMENT_HAWKEYE)
    ToHit = (long)((float)ToHit * 1.5f);

  return ToHit;
}

float cCharacterController::GetCharge(sCharacter *Character)
{
  float Charge;
  
  // Error checking
  if(Character == NULL)
    return 0;

  // Calculate adjusted charge
  Charge = Character->Def.ChargeRate;
  
  if(Character->Ailments & AILMENT_SLOW)
    Charge = Charge * 0.75f;
  if(Character->Ailments & AILMENT_FAST)
    Charge = Charge * 1.5f;

  return Charge;
}

cCharICS *cCharacterController::GetICS(long IDNum)
{
  sCharacter *CharPtr;

  if((CharPtr = GetCharacter(IDNum)) == NULL)
    return NULL;
  return CharPtr->CharICS;
}

BOOL cCharacterController::SetLock(long IDNum, BOOL State)
{
  sCharacter *CharPtr;

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

  // Set new value
  CharPtr->Locked = State;
  return TRUE;
}

BOOL cCharacterController::SetActionTimer(long IDNum, long Timer)
{
  sCharacter *CharPtr;

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

  // Set new value
  CharPtr->ActionTimer = Timer;
  return TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米色777欧美一区二区| 中文字幕一区二区三| 亚洲国产精品久久久久秋霞影院| 色天使色偷偷av一区二区| 亚洲精品视频免费观看| 欧美日韩国产系列| 麻豆精品一区二区av白丝在线| 欧美成人官网二区| 国产高清不卡二三区| 亚洲日本在线a| 欧美美女视频在线观看| 久久99蜜桃精品| 欧美经典一区二区| 欧美伊人久久久久久久久影院| 青青草精品视频| 中文字幕+乱码+中文字幕一区| 成人18视频日本| 五月婷婷久久综合| 久久久精品一品道一区| 91免费国产在线观看| 日韩国产欧美一区二区三区| 久久精品亚洲麻豆av一区二区| 色乱码一区二区三区88| 久久精品99国产精品日本| 中文字幕一区二区三中文字幕| 欧美羞羞免费网站| 久久超碰97中文字幕| 日韩美女精品在线| 日韩美女在线视频| 91国产视频在线观看| 国产一区二区三区蝌蚪| 香蕉成人啪国产精品视频综合网| 国产三级欧美三级日产三级99 | 一区二区在线观看免费| 在线成人高清不卡| 不卡在线视频中文字幕| 日本亚洲天堂网| 成人欧美一区二区三区小说| 欧美一区二区视频在线观看2020| 成人自拍视频在线| 麻豆精品精品国产自在97香蕉| 国产精品国产三级国产aⅴ中文 | 欧美一区二区视频在线观看| 99久久伊人久久99| 韩日精品视频一区| 亚洲成人精品在线观看| 综合欧美一区二区三区| 国产视频一区在线播放| 日韩亚洲欧美一区| 欧美日韩视频专区在线播放| 91丝袜美女网| 国产91精品精华液一区二区三区 | 成人欧美一区二区三区小说| 久久久久久久久99精品| 日韩一区国产二区欧美三区| 色国产综合视频| 成人性生交大片免费看中文| 国产自产v一区二区三区c| 亚洲国产wwwccc36天堂| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧洲无码一区二区三区| 久久久精品tv| 欧美精品一区视频| 精品成人佐山爱一区二区| 日韩欧美在线网站| 日韩一区二区视频| 日韩午夜精品视频| 91麻豆精品国产自产在线| 欧美日韩激情一区| 欧美日韩精品免费| 欧美福利一区二区| 欧美精品tushy高清| 欧美日韩激情在线| 91麻豆精品国产91久久久更新时间| 欧美三片在线视频观看| 欧美日韩国产综合一区二区三区| 91成人看片片| 欧美日韩卡一卡二| 日韩一区国产二区欧美三区| 日韩免费一区二区三区在线播放| 日韩亚洲电影在线| 久久―日本道色综合久久| 26uuu精品一区二区| 欧美高清在线视频| 中文字幕一区二区三区四区| 亚洲黄色片在线观看| 午夜精品福利在线| 奇米在线7777在线精品| 国产综合久久久久久鬼色| 国产99一区视频免费| 99精品视频免费在线观看| 欧美偷拍一区二区| 日韩一区二区三区四区| 久久久久久久网| 亚洲欧洲日韩女同| 午夜不卡在线视频| 国产毛片精品视频| 91在线免费播放| 欧美美女一区二区在线观看| 亚洲精品在线电影| 中文字幕欧美三区| 一区二区三区在线观看动漫| 亚洲6080在线| 国产成人精品综合在线观看 | 欧美电影在哪看比较好| 久久综合久久综合亚洲| 最新国产成人在线观看| 亚洲aⅴ怡春院| 国产a精品视频| 欧美日韩夫妻久久| 久久精品亚洲国产奇米99| 亚洲欧美日韩综合aⅴ视频| 日韩中文字幕91| 国产高清不卡二三区| 欧美色视频在线| 国产欧美综合在线| 日韩精品电影一区亚洲| 国产成人a级片| 欧美精品欧美精品系列| 国产精品久久久久久久蜜臀| 日韩精品一级中文字幕精品视频免费观看 | 久久久777精品电影网影网| 亚洲品质自拍视频| 久久99久久99| 欧美日韩一二三| 亚洲国产精品二十页| 奇米色一区二区| 在线亚洲人成电影网站色www| 精品国产乱码久久久久久久 | 久久精品视频一区二区| 性做久久久久久久免费看| 成人久久久精品乱码一区二区三区| 欧美精品在线观看一区二区| 中文字幕亚洲精品在线观看| 国产一区二区美女诱惑| 欧美日韩高清影院| 亚洲美女视频在线| 成人免费看的视频| 久久亚洲欧美国产精品乐播 | 极品美女销魂一区二区三区| 色婷婷一区二区| 国产精品日韩成人| 精品亚洲成a人| 日韩欧美一区二区免费| 亚洲一区成人在线| 91丨porny丨国产| 亚洲国产精品99久久久久久久久| 青青草精品视频| 91精品在线麻豆| 午夜久久电影网| 欧美揉bbbbb揉bbbbb| 一二三区精品视频| 91美女视频网站| 亚洲人成伊人成综合网小说| 成人午夜碰碰视频| 国产日韩精品视频一区| 国产二区国产一区在线观看| 2欧美一区二区三区在线观看视频| 日韩高清不卡一区二区三区| 欧美日韩中文一区| 午夜精品久久久久久久99樱桃| 欧美日韩在线一区二区| 亚洲美女视频在线| 91黄色免费版| 香蕉乱码成人久久天堂爱免费| 欧美天堂亚洲电影院在线播放| 亚洲自拍另类综合| 欧美性猛片xxxx免费看久爱| 亚洲国产一区视频| 欧美日韩亚洲综合| 亚洲成人精品一区二区| 欧美一区二区福利在线| 久久99久久99小草精品免视看| 精品国产乱子伦一区| 国产综合色精品一区二区三区| 久久综合给合久久狠狠狠97色69| 狠狠色狠狠色综合日日91app| 久久久九九九九| 972aa.com艺术欧美| 一个色综合网站| 91精品国产色综合久久不卡电影| 另类小说色综合网站| 久久精品视频在线免费观看| 99免费精品视频| 亚洲1区2区3区4区| 精品久久久久久久久久久久久久久 | 久久狠狠亚洲综合| 国产欧美一区二区精品仙草咪| yourporn久久国产精品| 一区2区3区在线看| 日韩欧美国产wwwww| 国产成人免费在线观看不卡| 亚洲精品免费在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 麻豆免费看一区二区三区| 精品国产制服丝袜高跟| 91丨porny丨中文| 免费在线观看不卡| 中文字幕精品在线不卡| 在线观看日韩电影|