• <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)自強(qiáng)而不息

            Controlling Players and Characters(23)

             

            Creating a Spell Controller

            Controlling spells is a matter of tracking the meshes and animations that represent
            the spell and then processing the spell’s effects on their intended targets. Because
            the spell’s effects are really related to the characters, it’s best to let the engine that
            controls the characters handle the spell effects and leave the spell animation up to
            a spell controller class object.

            You want to create a spell controller class that maintains a list of currently cast spells
            and displays them onscreen. When a spell is complete, this controller class calls an outside
            function to process the spell’s effects. This spell controller class, cSpellController,
            uses supportive structures that make tracking the spell meshes and animation
            easier. These structures are sMeshAnim and sSpellTracker.

             

            Meshes with sMeshAnim

            Reviewing the sSpell spell structure, you can see that meshes are referenced by
            number rather than by name. That mesh reference number is actually the index to
            an array of meshes. You store this array of meshes in a collection of sMeshAnim
            structures:

            typedef struct sMeshAnim
            {
                
            char        filename[MAX_PATH];     // filename of mesh/anim
                long        count;                  // number of characters using mesh
                cMesh       mesh;
                cAnimation  anim;    

                sMeshAnim() { count = 0; }
            } *sCharMeshListPtr;

            For each mesh in use in your engine, you have a matching sMeshAnim structure.
            Each structure instance stores the filename of the mesh to use, a cMesh and a
            cAnimation object for the mesh, and a variable (Count) that keeps count of how many
            instances of the mesh are currently in use.

            For each spell that needs a mesh, the appropriate .X file is loaded into the mesh
            and animation objects (both using the same filename and the animation using a
            single animation set called anim).

            Meshes are only loaded from disk whenever the spell controller requires them, and
            because the structure maintains a count of the times the mesh is in use, the spell
            controller can quickly determine whether the mesh is loaded.

            As spells complete their animation cycle, the appropriate mesh count is reduced,
            and when the number of spells that use the mesh is reduced to zero, the mesh and
            animation objects are released (to save memory).

             

            Tracking Spells Using sSpellTracker

            Whereas the sMeshAnim structure maintains the meshes used by spells, the actual
            list of active spells is maintained by the sSpellTracker structure. The sSpellTracker
            structure is allocated and inserted into a linked list of the same structures any time
            a spell is cast:

            #define NUM_SPELL_DEF   64

            enum SpellEfects
            {
                ALTER_HEALTH = 0, ALTER_MANA, CURE_AILMENT, CAUSE_AILMENT, RAISE_DEAD, INSTANT_KILL, DISPEL_MAGIC, TELEPORT
            };

            enum SpellTargets
            {
                TARGET_SINGLE = 0, TARGET_SELF, TARGET_AREA
            };

            enum AnimPositions
            {
                POSITION_NONE = 0, POSITION_CASTER, POSITION_TOTARGET, POSITION_TOCASTER, POSITION_TARGET, POSITION_SCALE
            };

            /************************************************************************************************/

            typedef 
            struct sSpellTracker
            {
                
            long        spell_index;

                sCharacter* caster;
                
            long        affect_type;

                
            long cur_anim;              // animation: 0-2
                float source_x, source_y, source_z;
                
            float target_x, target_y, target_z;

                
            float x_pos, y_pos, z_pos;  // current coordinate
                float x_add, y_add, z_add;  // movement values
                float dist_to_target;       

                union
                {
                    
            float   speed;          
                    
            long    holding_time;   
                };

                cObject 
            object;             // graphics object

                sSpellTracker*  prev;
                sSpellTracker*  next;

                
            /////////////////////////////////////////////////////////////////////////////

                sSpellTracker()
                {
                    caster = NULL;
                    prev = next = NULL;
                }

                ~sSpellTracker()
                {
                    delete next;
                }
            } *sSpellTrackerPtr;

            For each spell cast, a sSpellTracker structure is used to contain the information to track
            the mesh, animation, movement, timing, and which character cast the spell. The
            structure starts off with the spell number (spell_index), which relates directly to the MSL.

            To later help determine the effects of a spell, a pointer to a character (caster) is
            maintained as well as the type of characters the spell can affect (PCs, NPCs, or
            MCs). You can define each type of character as follows:

            #define CHAR_PC 0
            #define CHAR_NPC 1
            #define CHAR_MONSTER 2

            Notice that a spell has no target character defined, but a trio of target coordinates.
            In fact, a spell has a trio of source coordinates. Remember that a spell mesh can
            stay in place over the caster or victim, move between the two, or stretch between
            them. Setting the source and target coordinates ensures that the tracker knows how
            to position the mesh in use.

            Speaking of the mesh in use, curr_anim is used to track which of the three
            meshes to use. As you may recall, a mesh movement takes place in three steps, and
            once the current animation passes the third step, the spell takes effect.

            To track the motion of the spell meshes (if they are indeed moving), you use a set of
            values (x_add, y_add, and z_add) that tells the spell controller which direction to move the
            mesh at each update. As for the current position of the mesh in use, the variables
            x_pos, x_pos, and z_pos contain the current coordinates at which to render the mesh.

            The speed in which a mesh moves is contained in speed, and the total distance the
            mesh can move is contained in dist_to_target. If a mesh stays in place, the holding_time variable
            does a countdown of the number of milliseconds until the cycle is complete.

            Rounding off sSpellTracker, object is the graphics object you use to render the
            meshes, and prev and next maintain the linked list of structures.


            posted on 2007-12-03 19:11 lovedday 閱讀(204) 評(píng)論(0)  編輯 收藏 引用


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            91久久精一区二区三区大全| 一级做a爰片久久毛片免费陪| 色综合久久久久无码专区| 久久综合亚洲色HEZYO国产| 久久精品亚洲男人的天堂| 亚洲精品视频久久久| 无码人妻久久久一区二区三区| 久久久久se色偷偷亚洲精品av| 天天爽天天狠久久久综合麻豆| 国内精品久久久久影院日本| 久久精品国产精品青草| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久99国产精品99久久| 97久久精品无码一区二区天美 | 一级女性全黄久久生活片免费| 久久青青色综合| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久天天躁狠狠躁夜夜不卡| 成人精品一区二区久久| 久久香蕉国产线看观看99| 久久99中文字幕久久| 久久久久无码精品国产不卡| 国产A级毛片久久久精品毛片| avtt天堂网久久精品| 久久亚洲欧美日本精品| 久久青青草原精品国产| 精品精品国产自在久久高清| 91久久九九无码成人网站| 国产福利电影一区二区三区久久久久成人精品综合 | 久久亚洲精品无码VA大香大香| 国产亚洲色婷婷久久99精品91| 伊人色综合久久天天人手人婷| 2019久久久高清456| 久久亚洲日韩看片无码| 精品国产乱码久久久久软件| 色妞色综合久久夜夜| 精品一区二区久久| 日本五月天婷久久网站| 狠狠狠色丁香婷婷综合久久俺| 国产—久久香蕉国产线看观看 | 久久夜色精品国产www|