• <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>

            天行健 君子當(dāng)自強而不息

            Timing in Animation and Movement(3)

            Moving with Time

            Time−based motion doesn't just apply to animation. Movement is also a major part of your game, and basing movement on time guarantees that all systems will run your game consistently, regardless of how fast or how slow they are.

            The most common use for time−based movement is when you want to move an object a set distance over a period of time. For example, suppose a player moves his joystick to the right, so your game responds by moving the on−screen game character to the right a little bit−let's say 64 units over a period of one second, which equates to 0.064 units of movement per millisecond.

            Using a small function, you can calculate the number of units (as a floating−point value) to move an object based on the elapsed time between frames.

            float CalcMovement(DWORD ElapsedTime, float PixelsPerSec)
            {
              return (PixelsPerSec / 1000.0f * (float)ElapsedTime);
            }

            As you can see in the CalculateMovement function, you are using the following calculation:

            PixelsPerSec / 1000.0f * ElapsedTime;

            The PixelsPerSec variable contains the number of units you want to move over the period of a second. The 1000.0 value means 1000 milliseconds. Basically, you're breaking down the number of units to move per millisecond. Finally, you need to multiply by ElapsedTime to calculate the total movement to apply.

            This sort of movement based on time is very basic, but it should not be overlooked. Knowledge of this function of time−based movement is essential to using more advanced features, such as smoothly moving objects along a pre−determined path.

             

            Moving along Paths

            As you read in the previous section, time−based movement is determined by taking the distance to travel, dividing it by 1,000, and multiplying the result by the elapsed time. In that section, I used an example in which a player pressed right on the joystick, and his character moved right a set amount of units. But what about those times when you want an object to move without user intervention? For instance, suppose a player pushes a button and bullets fly out of the big gun he is carrying. Those bullets travel along a set path at a set speed. You can set a velocity for each of those bullets, negating the need to use paths, but what about those super−bullets in your game that can swoop through parts of your level, perhaps along a pre−set path?

            Those special instances require you to set up the coordinates of the travel paths in advance, and to do some quick calculations to determine where an object can be placed inside those paths. And what about moving objects such as characters, power−ups, and platforms? You guessed it−using paths is the perfect solution for all your movement needs!

            I am going to discuss two of the most frequently used types of paths−straight and curved. I will start by explaining how to use straight paths.

             

            Following Straight Paths

            A straight path is just that−straight. The path moves from the starting point to the ending point with no breaks or turns. Generally, you define a straight line using a pair of coordinates−the starting point and the ending point. To follow a straight path, you only need to walk along the line from Point A to Point B.

            To move an object along a straight path, you must calculate the coordinates of a point along the line using some simple formulas. For instance, as Figure 2.2 illustrates, to calculate a point at the midpoint of the line using a scalar value (ranging from 0 to 1), you calculate the difference in the endpoint's coordinates, multiply by the scalar value, and add the result to the starting point's coordinates.

            // Define starting and ending points of straight path
            // Scalar = position to calculate (0 to 1)
            D3DXVECTOR3 vecStart = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
            D3DXVECTOR3 vecEnd = D3DXVECTOR3(10.0f, 20.0f, 30.0f);
            D3DXVECTOR3 vecPos = (vecEnd − vecStart) * Scalar + vecStart;

            If you were to set Scalar to 0.5, then vecPos would contain the coordinates 5.0, 10.0, 15.0, which happen to be the midpoint of the path. Now suppose you don't want to use a scalar value. What about using 3D units instead? For example, instead of using a scalar value of 0.5, suppose you want to know the coordinates of a point that is 32 units from the starting coordinates.

            To calculate the coordinates using 3D units as a measurement, calculate the length of the path using the D3DXVec3Length function, and then divide the position you want to use by the resulting value to obtain a scalar value to use in the previous calculations.

            For example, to find the coordinates of the point that is 32 units into the path defined previously, you can use the following code:

            // Pos = position (in 3−D units) of point in path to calculate
            // Define starting and ending points of straight path
            D3DXVECTOR3 vecStart = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
            D3DXVECTOR3 vecEnd = D3DXVECTOR3(10.0f, 20.0f, 30.0f);

            // Get the length of the path
            float Length = D3DXVec3Length(&(vecEnd−vecStart));

            // Calculate the scalar by dividing pos by length
            float Scalar = Pos / Length;

            // Use scalar to calculate coordinates
            D3DXVECTOR3 vecPos = (vecEnd − vecStart) * Scalar + vecStart;

            Now that you can calculate the exact position of any point along the path, you can use this knowledge to move an object along the path. Following the time−based theory of movement, suppose you want to move an object from one point to another over a period of 1,000 milliseconds. The following code (processed once per frame) will accomplish this, continuously looping back from the end to the start of the path in an endless cycle.

            // vecPoints[2] = path's starting and ending coordinate vectors
            // Every frame, use the following code to position an object along the straight path based on the current time.
            float Scalar = (float)(timeGetTime() % 1001) / 1000.0f;

            D3DXVECTOR3 vecPos = (vecPoints[1] − vecPoints[0]) * Scalar + vecPoints[0];

            // Use vecPos.x, vecPos.y, and vecPos.z coordinates for object


            posted on 2008-04-16 14:16 lovedday 閱讀(409) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            久久婷婷成人综合色综合| 国产精品免费看久久久| 天天久久狠狠色综合| 久久狠狠高潮亚洲精品| 午夜人妻久久久久久久久| 日产精品久久久久久久性色| 精品久久久久成人码免费动漫 | 国产L精品国产亚洲区久久| 99久久99久久精品免费看蜜桃| 少妇高潮惨叫久久久久久| 久久99国产综合精品女同| 蜜臀av性久久久久蜜臀aⅴ| 久久国产欧美日韩精品| 欧美久久综合性欧美| 99久久无码一区人妻| 久久精品国产99久久香蕉| 久久久久久久99精品免费观看| 国产精品美女久久久| 精品一区二区久久| 精品久久久久久久中文字幕| 久久久久亚洲AV成人网人人网站| 久久午夜综合久久| 亚洲国产精品一区二区久久hs| 久久夜色精品国产噜噜亚洲AV| 久久精品中文字幕久久| 激情综合色综合久久综合| 漂亮人妻被中出中文字幕久久| 婷婷久久香蕉五月综合加勒比 | 伊人久久免费视频| 欧美大战日韩91综合一区婷婷久久青草| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲国产精品无码久久一区二区| 久久国产欧美日韩精品| 久久毛片免费看一区二区三区| 亚洲国产精品无码久久一区二区| 久久99免费视频| 性做久久久久久久久浪潮| 精品九九久久国内精品| 久久99精品久久久大学生| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久久久亚洲AV无码去区首|