• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            Controlling Players and Characters(12)

             

            Following Another Character
             

            Although following another character might seem complicated at first, don’t worry
            too much. Remember that keeping it simple is the solution. Following a character
            is as easy as walking a route. Because a character already knows its own coordinates
            and the coordinates of the character it is following, you can use previously seen
            functions to move the character toward another one.
             

            The only difference at this point is that you might want a character to get within a
            specific distance from the followed character, as illustrated in Figure 16.5.

            Knowing each character’s coordinates (the character being followed and the character
            doing the following), you can construct a single function that determines
            which direction the “following” character should move:

            void CalculateFollowMovement(
              float CharXPos, float CharZPos, // Coordinate of character
              float WalkSpeed, // Walking speed of char.
              float FollowXPos, float FollowZPos, // Coords of followed char.
              float FollowDistance, // Distance to follow at
              float *MoveX, float *MoveZ) // Variables for movement
            {
              // Fix for faster distance checking
              FollowDistance *= FollowDistance;

              // Get distance between characters
              float XDiff = (float)fabs(FollowXPos - CharXPos);
              float ZDiff = (float)fabs(FollowZPos - CharZPos);
              float Length = XDiff*XDiff + ZDiff*ZDiff;

              // If distance between characters is less than allowed,
              // then just stand still.
              if(Length < FollowDistance) {
                *MoveX = *MoveZ = 0.0f;
                return;
              }

              // Calculate rate to move based on character walking speed
              Length = sqrt(Length);
              *MoveX = (CharXPos - FollowXPos) / Length * WalkSpeed;
              *MoveZ = (CharZPos - FollowZPos) / Length * WalkSpeed;
            }

            Whenever you want to update a character that is following another one, you merely
            pass along the required data and move the character using the returned movement
            variables.

             

            Evading Another Character
             

            Evading means to move a character away from another one. If the character to be
            avoided is closer than the minimum set distance, the evading character moves in
            the opposite direction through the use of the CalculateEvadeMovement function:

            void CalculateEvadeMovement(
              float CharXPos, float CharZPos, // Coordinate of character
              float WalkSpeed, // Walking speed of char.
              float FollowXPos, float FollowZPos, // Coords of evaded char.
              float EvadeDistance, // Distance to evade
              float *MoveX, float *MoveZ) // Variables for movement
            {
              // Fix for faster distance checking
              FollowDistance *= FollowDistance;

              // Get distance between characters
              float XDiff = (float)fabs(FollowXPos - CharXPos);
              float ZDiff = (float)fabs(FollowZPos - CharZPos);
              float Length = XDiff*XDiff + ZDiff*ZDiff;

              // If distance between characters is more than allowed,
              // then just stand still.
              if(Length > EvadeDistance) {
                *MoveX = *MoveZ = 0.0f;
                return;
              }

              // Calculate rate to move based on character walking speed
              Length = sqrt(Length);
              *MoveX = -((CharXPos - FollowXPos) / Length * WalkSpeed);
              *MoveZ = -((CharZPos - FollowZPos) / Length * WalkSpeed);
            }


            posted on 2007-11-14 15:56 lovedday 閱讀(186) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            无码任你躁久久久久久| 99久久99久久久精品齐齐| 国内精品伊人久久久久网站| 久久精品国产亚洲精品| 久久综合九色综合久99| 久久久久久久久久久久久久| 2022年国产精品久久久久| 国产福利电影一区二区三区,免费久久久久久久精 | 久久99热这里只有精品国产| 人妻精品久久久久中文字幕69 | 久久91这里精品国产2020| 思思久久99热只有频精品66| 国产精品久久影院| 伊人久久亚洲综合影院| 日本一区精品久久久久影院| 久久亚洲sm情趣捆绑调教 | 久久久久久国产精品美女| 18禁黄久久久AAA片| 久久亚洲精品视频| 久久夜色精品国产欧美乱| 亚洲精品tv久久久久久久久久| 国产人久久人人人人爽| 伊人久久精品无码二区麻豆| 久久久久亚洲AV成人网| 色偷偷888欧美精品久久久| 久久66热人妻偷产精品9| 伊人久久大香线蕉AV一区二区| 很黄很污的网站久久mimi色| 久久99国产精品久久99果冻传媒| 精品国产乱码久久久久软件| 久久亚洲精品国产亚洲老地址 | 女人香蕉久久**毛片精品| 久久久国产乱子伦精品作者| 伊人久久大香线蕉亚洲| 久久精品一本到99热免费| 久久亚洲AV无码精品色午夜| 亚洲国产精品无码久久青草| 久久无码精品一区二区三区| 伊人久久大香线蕉精品不卡 | 国产成人精品三上悠亚久久 | 国产成人精品久久一区二区三区 |