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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? winmain.cpp

?? 用DirectX編寫RPG游戲-Programming.Role.Playing.Games.with.DirectX
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/**************************************************
WinMain.cpp
Chapter 16 Character Controller Demo

Programming Role-Playing Games with DirectX
by Jim Adams (01 Jan 2002)

Required libraries:
  D3D8.LIB, D3DX8.LIB, and DINPUT8.LIB
**************************************************/

#include "Core_Global.h"

#include "Window.h"
#include "Chars.h"
#include "Script.h"
#include "WinMain.h"

// Global names of character meshes
char *g_CharMeshNames[] = {
    { "..\\Data\\Warrior.x" },   // Mesh # 0
    { "..\\Data\\Yodan.x"   }    // Mesh # 1
  };
sCharAnimationInfo g_CharAnimations[] = {
    { "Idle",  TRUE  },
    { "Walk",  TRUE  },
    { "Swing", FALSE },
    { "Spell", FALSE },
    { "Swing", FALSE },
    { "Hurt",  FALSE },
    { "Die",   FALSE },
    { "Idle",  TRUE  }
  };

char *g_SpellMeshNames[] = {
    { "..\\Data\\Fireball.x"   },
    { "..\\Data\\Explosion.x"  },
    { "..\\Data\\Groundball.x" },
    { "..\\Data\\ice.x" },
    { "..\\Data\\bomb.x" },
  };

///////////////////////////////////////////////////////////
// Overloaded application class functions
//////////////////////////////////////////////////////////
cApp::cApp()
{ 
  m_Width  = 640; 
  m_Height = 480;
  m_Style  = WS_BORDER|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU;
  strcpy(m_Class, "CharClass");
  strcpy(m_Caption, "Characters Demo by Jim Adams");
}

BOOL cApp::Init()
{
  long i;
  FILE *fp;

  // Initialize the graphics device and set display mode
  m_Graphics.Init();
  m_Graphics.SetMode(GethWnd(), TRUE, TRUE);
  m_Graphics.SetPerspective(D3DX_PI/4, 1.3333f, 1.0f, 10000.0f);
  ShowMouse(TRUE);

  // Create a font
  m_Font.Create(&m_Graphics, "Arial", 16, TRUE);

  // Initialize input and input devices
  m_Input.Init(GethWnd(), GethInst());
  m_Keyboard.Create(&m_Input, KEYBOARD);
  m_Mouse.Create(&m_Input, MOUSE, TRUE);

  // Load the terrain mesh and set object
  m_TerrainMesh.Load(&m_Graphics, "..\\Data\\World.x",        \
                     "..\\Data\\");
  m_TerrainObject.Create(&m_Graphics, &m_TerrainMesh);

  // Load the master item list
  for(i=0;i<1024;i++)
    ZeroMemory(&m_MIL[i], sizeof(sItem));
  if((fp=fopen("..\\Data\\Default.mil", "rb")) != NULL) {
    for(i=0;i<1024;i++)
      fread(&m_MIL[i], 1, sizeof(sItem), fp);
    fclose(fp);
  }

  // Initialize the character controller
  m_CharController.SetData(this);
  m_CharController.Init(&m_Graphics, &m_Font,                 \
      "..\\Data\\Default.mcl", (sItem*)&m_MIL,                \
      m_SpellController.GetSpell(0),                          \
      sizeof(g_CharMeshNames)/sizeof(char*), g_CharMeshNames, \
      "..\\Data\\", "..\\Data\\",                             \
      sizeof(g_CharAnimations) / sizeof(sCharAnimationInfo),  \
      (sCharAnimationInfo*)&g_CharAnimations,                 \
      &m_SpellController);

  // Initialize the spell controller
  m_SpellController.Init(&m_Graphics,                         \
     "..\\Data\\Default.msl",                                 \
     sizeof(g_SpellMeshNames)/sizeof(char*),g_SpellMeshNames, \
     "..\\Data\\", &m_CharController);

  // Add the character player
  m_CharController.Add(0, 0, CHAR_PC, CHAR_STAND,             \
                       0.0f, 0.0f, 0.0f, 3.14f);

  // Process the startup script
  m_Script.SetData(this, &m_Graphics, &m_Font, &m_Keyboard,   \
                   &m_CharController);
  m_Script.Execute("..\\Data\\Startup.mls");

  return TRUE;
}

BOOL cApp::Shutdown()
{
  // Free controllers
  m_CharController.Free();
  m_SpellController.Free();

  // Free script object
  m_Script.Free();

  // Free objects and meshes
  m_TerrainMesh.Free();
  m_TerrainObject.Free();

  // Shutdown input
  m_Keyboard.Free();
  m_Mouse.Free();
  m_Input.Shutdown();

  // Shutdown graphics
  m_Font.Free();
  m_Graphics.Shutdown();

  return TRUE;
}

BOOL cApp::Frame()
{
  static DWORD UpdateCounter = timeGetTime();
  char Stats[128];
  static sCharacter *CharPtr=m_CharController.GetCharacter(0);

  // Lock to 30 fps
  if(timeGetTime() < UpdateCounter + 33)
    return TRUE;
  UpdateCounter = timeGetTime();

  // Read in keyboard
  m_Keyboard.Acquire(TRUE);
  m_Keyboard.Read();

  // Exit if ESC pressed
  if(m_Keyboard.GetKeyState(KEY_ESC) == TRUE)
    return FALSE;

  // Update controllers
  m_CharController.Update(33);
  m_SpellController.Update(33);

  // Set the camera 
  m_Camera.Point(0.0f, 700.0f, -700.0f, 0.0f, 0.0f, 0.0f);
  m_Graphics.SetCamera(&m_Camera);

  // Render everything
  m_Graphics.Clear();
  if(m_Graphics.BeginScene() == TRUE) {

    // Render terrain
    m_Graphics.EnableZBuffer(TRUE);
    m_TerrainObject.Render();

    // Render all characters
    m_CharController.Render();

    // Render spells
    m_SpellController.Render();

    // Display stats
    sprintf(Stats, "HP: %ld / %ld\r\nMP: %ld / %ld",          \
            CharPtr->HealthPoints, CharPtr->Def.HealthPoints,
            CharPtr->ManaPoints, CharPtr->Def.ManaPoints);
    m_Font.Print(Stats, 2, 2);

    m_Graphics.EndScene();
  }
  m_Graphics.Display();

  return TRUE;
}

long cApp::GetInput()
{
  long Action = 0;

  if(m_Keyboard.GetKeyState(KEY_UP) == TRUE)
    Action |= 1;
  
  if(m_Keyboard.GetKeyState(KEY_RIGHT) == TRUE)
    Action |= 2;
  
  if(m_Keyboard.GetKeyState(KEY_DOWN) == TRUE)
    Action |= 4;
  
  if(m_Keyboard.GetKeyState(KEY_LEFT) == TRUE)
    Action |= 8;

  if(m_Keyboard.GetKeyState(KEY_SPACE) == TRUE) {
    Action |= 16;
    m_Keyboard.SetLock(KEY_SPACE, TRUE);
    m_Keyboard.SetKeyState(KEY_SPACE, FALSE);
  }

  if(m_Keyboard.GetKeyState(KEY_1) == TRUE) {
    Action |= 32;
    m_Keyboard.SetLock(KEY_1, TRUE);
    m_Keyboard.SetKeyState(KEY_1, FALSE);
  }

  if(m_Keyboard.GetKeyState(KEY_2) == TRUE) {
    Action |= 64;
    m_Keyboard.SetLock(KEY_2, TRUE);
    m_Keyboard.SetKeyState(KEY_2, FALSE);
  }

  if(m_Keyboard.GetKeyState(KEY_3) == TRUE) {
    Action |= 128;
    m_Keyboard.SetLock(KEY_3, TRUE);
    m_Keyboard.SetKeyState(KEY_3, FALSE);
  }

  return Action;
}

BOOL cApp::CheckIntersect(                                    \
                 float XStart, float YStart, float ZStart,    \
                 float XEnd,   float YEnd,   float ZEnd)
{
  sMesh *MeshPtr;
  BOOL  Hit;
  float u, v, Dist;
  float XDiff, YDiff, ZDiff, Size;
  DWORD FaceIndex;
  D3DXVECTOR3 vecDir;

  // Start with parent mesh
  if((MeshPtr = m_TerrainMesh.GetParentMesh()) == NULL)
    return FALSE;  // No polygons hit

  // Calculate ray
  XDiff = XEnd - XStart;
  YDiff = YEnd - YStart;
  ZDiff = ZEnd - ZStart;
  Size  = (float)sqrt(XDiff*XDiff+YDiff*YDiff+ZDiff*ZDiff);
  D3DXVec3Normalize(&vecDir, &D3DXVECTOR3(XDiff, YDiff, ZDiff));

  // Go through each mesh looking for intersection
  while(MeshPtr != NULL) {
    D3DXIntersect(MeshPtr->m_Mesh,                            \
                &D3DXVECTOR3(XStart,YStart,ZStart), &vecDir,  \
                &Hit, &FaceIndex, &u, &v, &Dist);

    if(Hit == TRUE) {
      if(Dist <= Size)
        return TRUE;  // Hit a polygon
    }

    MeshPtr = MeshPtr->m_Next;
  }

  return FALSE;  // No polygons hit
}

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,          \
                   LPSTR szCmdLine, int nCmdShow)
{
  cApp App;
  return App.Run();
}

///////////////////////////////////////////////////////////
// Overloaded character controller class functions
///////////////////////////////////////////////////////////
BOOL cChars::SetData(cApp *App)
{
  if((m_App = App) == FALSE)
    return FALSE;
  return TRUE;
}

BOOL cChars::PCUpdate(sCharacter *Character, long Elapsed,    \
                    float *XMove, float *YMove, float *ZMove)
{
  sCharacter *CharPtr;
  float XDiff, YDiff, ZDiff, Dist;
  long  Action = 0;
  float Speed;
  long  SpellNum;
  float SpellRadius;

  // If not PC, then let controller handle movement
  if(Character->ID != 0)
    return TRUE;

  Speed = (float)Elapsed / 1000.0f * GetSpeed(Character);
  
  // Get the input flags
  if(m_App != NULL)
    Action = m_App->GetInput();

  // Rotate character
  if(Action & 2) {
    Character->Direction += ((float)Elapsed / 1000.0f * 4);
    Character->Action = CHAR_MOVE;
  }
  if(Action & 8) {
    Character->Direction -= ((float)Elapsed / 1000.0f * 4);
    Character->Action = CHAR_MOVE;
  }

  // Walk forward
  if(Action & 1) {
    *XMove = (float)sin(Character->Direction) * Speed;
    *ZMove = (float)cos(Character->Direction) * Speed;
    Character->Action = CHAR_MOVE;
  }

  // Attack a nearby monster or process NPC script
  if(Action & 16) {
    CharPtr = GetParentCharacter();
    while(CharPtr != NULL) {

      // Only check other characters
      if(CharPtr->ID != Character->ID) {
        XDiff = (float)fabs(CharPtr->XPos - Character->XPos);
        YDiff = (float)fabs(CharPtr->YPos - Character->YPos);
        ZDiff = (float)fabs(CharPtr->ZPos - Character->ZPos);
        Dist = XDiff*XDiff+YDiff*YDiff+ZDiff*ZDiff;

        // Only check characters within 100.0 units distance
        if(Dist <= 10000.0f) {
          
          // Process script or attack?
          if(CharPtr->ScriptFilename[0])
            m_App->m_Script.Execute(CharPtr->ScriptFilename);
          else {
            // Turn toward victim
            XDiff = (CharPtr->XPos - Character->XPos);
            ZDiff = (CharPtr->ZPos - Character->ZPos);
            Character->Direction = (float)atan2(XDiff, ZDiff);

            // Set attack data
            Character->Victim = CharPtr;
            CharPtr->Attacker = Character;

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

          break;
        }
      }

      CharPtr = CharPtr->Next;
    }
  }

  // Cast spells
  if(Action & 32 || Action & 64 || Action & 128) {
    // Get spell number to cast
    if(Action & 32)
      SpellNum = 0;
    if(Action & 64)
      SpellNum = 1;
    if(Action & 128)
      SpellNum = 2;

    // Get spell distance
    SpellRadius =                                             \
        m_App->m_SpellController.GetSpell(SpellNum)->Distance;

    // Search for closest monster
    CharPtr = GetParentCharacter();
    while(CharPtr != NULL) {
      // Only check other characters
      if(CharPtr->Type == CHAR_MONSTER) {
        XDiff = (float)fabs(CharPtr->XPos - Character->XPos);
        YDiff = (float)fabs(CharPtr->YPos - Character->YPos);
        ZDiff = (float)fabs(CharPtr->ZPos - Character->ZPos);
        Dist = XDiff*XDiff+YDiff*YDiff+ZDiff*ZDiff;

        // Only check characters within 100.0 units distance
        if(Dist <= (SpellRadius * SpellRadius)) {
          Character->SpellNum = SpellNum;
          Character->SpellTarget = CHAR_MONSTER;
          Character->TargetX = CharPtr->XPos;
          Character->TargetY = CharPtr->YPos;
          Character->TargetZ = CharPtr->ZPos;

          // Turn toward victim
          XDiff = (CharPtr->XPos - Character->XPos);
          ZDiff = (CharPtr->ZPos - Character->ZPos);
          Character->Direction = (float)atan2(XDiff, ZDiff);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
看国产成人h片视频| 91麻豆精品国产综合久久久久久| 国产一区二区久久| 久久精品国产第一区二区三区| 亚洲第一av色| 视频一区视频二区中文| 天堂资源在线中文精品| 婷婷成人激情在线网| 天天色天天操综合| 日韩av网站在线观看| 蜜臀av国产精品久久久久| 蜜桃一区二区三区在线观看| 日本不卡不码高清免费观看| 蜜臀av在线播放一区二区三区| 美女一区二区视频| 国产精品18久久久久久久久| 国产高清不卡二三区| 96av麻豆蜜桃一区二区| 91美女在线看| 欧美人伦禁忌dvd放荡欲情| 91精品免费在线| 亚洲精品在线免费播放| 国产欧美一区二区精品忘忧草 | 亚洲欧美日韩一区| 玉米视频成人免费看| 性欧美疯狂xxxxbbbb| 久久精品国产精品青草| 大美女一区二区三区| 一本久久精品一区二区| 精品视频资源站| 日韩精品一区二区在线观看| 久久一二三国产| 亚洲日本在线观看| 石原莉奈在线亚洲二区| 激情文学综合插| 91麻豆123| 91精品国产高清一区二区三区蜜臀 | 婷婷综合另类小说色区| 韩日精品视频一区| 色综合天天综合色综合av| 欧美精选在线播放| 国产日产精品一区| 亚洲电影在线播放| 久久国产麻豆精品| 色94色欧美sute亚洲线路二 | 亚洲一区二区在线视频| 男女性色大片免费观看一区二区| 成人精品一区二区三区中文字幕| 欧美日韩黄色一区二区| 久久久噜噜噜久噜久久综合| 一区二区三区在线播放| 国产在线不卡视频| 欧美日韩一区二区在线观看| 久久久激情视频| 亚洲主播在线播放| 国产成人在线视频播放| 欧美精品一二三区| 亚洲欧美在线观看| 老司机免费视频一区二区三区| 91年精品国产| 久久久久久久免费视频了| 一个色妞综合视频在线观看| 国产一区二区三区香蕉| 欧美久久久久久久久| 日韩一区日韩二区| 国产精品一区二区男女羞羞无遮挡| 91看片淫黄大片一级在线观看| 精品久久久久久久久久久久久久久 | 色伊人久久综合中文字幕| 精品成人免费观看| 亚洲国产精品久久艾草纯爱| 成人免费看黄yyy456| 日韩你懂的电影在线观看| 亚洲国产综合人成综合网站| 成人av资源在线| 欧美r级在线观看| 偷拍亚洲欧洲综合| 色爱区综合激月婷婷| 国产精品麻豆久久久| 国产一区视频导航| 欧美伦理电影网| 一区二区激情小说| 91亚洲男人天堂| 国产精品欧美极品| 国产福利视频一区二区三区| 欧美不卡一二三| 日本不卡的三区四区五区| 欧美午夜精品一区二区蜜桃| 亚洲欧洲成人自拍| av一区二区三区| 日本一区二区三区视频视频| 久久99最新地址| 欧美成人午夜电影| 久久精品国产99国产| 欧美精品粉嫩高潮一区二区| 亚洲综合一区二区三区| 一本到高清视频免费精品| 1000部国产精品成人观看| 粉嫩一区二区三区性色av| 久久久久久久久久久久电影| 激情丁香综合五月| 久久综合九色综合97婷婷| 精品亚洲aⅴ乱码一区二区三区| 制服丝袜中文字幕亚洲| 午夜欧美2019年伦理| 在线播放中文字幕一区| 日韩综合小视频| 91精品国产高清一区二区三区| 偷拍自拍另类欧美| 日韩欧美国产一二三区| 精品中文av资源站在线观看| 精品国精品国产| 国产成人在线视频免费播放| 欧美激情综合五月色丁香小说| 高清不卡一区二区在线| 国产精品久久久久一区二区三区共| 成人99免费视频| 亚洲欧美国产77777| 在线一区二区观看| 婷婷中文字幕综合| 精品三级在线看| 国产精品一级在线| 亚洲人成人一区二区在线观看| 日本高清不卡在线观看| 舔着乳尖日韩一区| 欧美精品一区二区三区四区 | 国产一区欧美一区| 亚洲欧美综合在线精品| 欧洲一区二区三区在线| 调教+趴+乳夹+国产+精品| 精品入口麻豆88视频| 国产精品小仙女| 日韩美女啊v在线免费观看| 欧美性受xxxx| 久久精品国产一区二区| 国产精品三级在线观看| 欧美在线视频你懂得| 看电影不卡的网站| 最新国产の精品合集bt伙计| 欧美三级日韩在线| 国产一区二区三区av电影 | 国产精品1区2区3区| 亚洲伦理在线精品| 日韩一区二区在线免费观看| 国产乱码精品一区二区三区忘忧草 | 亚洲一卡二卡三卡四卡 | 亚洲最色的网站| 精品国精品自拍自在线| 91免费小视频| 久久电影网站中文字幕| 亚洲欧美成人一区二区三区| 日韩无一区二区| 91在线观看美女| 秋霞成人午夜伦在线观看| 国产精品天干天干在观线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 麻豆视频一区二区| 亚洲日本免费电影| 日韩欧美另类在线| 色女孩综合影院| 国产一区在线看| 亚洲福利一二三区| 国产精品剧情在线亚洲| 日韩欧美一区在线| 欧美性猛片xxxx免费看久爱| 国产成a人亚洲| 日本不卡一区二区三区高清视频| 国产精品天美传媒| 精品国产91九色蝌蚪| 欧美性大战xxxxx久久久| 成熟亚洲日本毛茸茸凸凹| 午夜久久久久久久久| 亚洲人午夜精品天堂一二香蕉| 精品sm在线观看| 欧美一区二区在线观看| 在线影院国内精品| jlzzjlzz欧美大全| 国模无码大尺度一区二区三区| 亚洲福利视频三区| 亚洲精品日产精品乱码不卡| 欧美www视频| 欧美一区二区视频在线观看| 色猫猫国产区一区二在线视频| 国产成人精品1024| 国产一区二区免费在线| 日本美女一区二区| 午夜精品在线视频一区| 亚洲一区二区三区免费视频| 亚洲日本青草视频在线怡红院| 久久久777精品电影网影网| 日韩一区二区麻豆国产| 91国偷自产一区二区开放时间 | 蜜桃视频免费观看一区| 香蕉av福利精品导航| 亚洲精选一二三| 国产精品国产馆在线真实露脸| 国产亚洲成av人在线观看导航| 精品处破学生在线二十三| 欧美成人艳星乳罩| 精品久久久久久久久久久院品网|