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

            天行健 君子當自強而不息

            游戲中物件的定義與使用(2)

             

            本篇是游戲中物件的定義與使用(1)的續篇。

             

            因為每個物件都被分類以便與另外的物件區分開來,所以并不是所有的信息都是必須的,劍具有殺傷力,而護甲則提供保護,因此沒有必要去混合損傷與防御的數據。

            需要將每個物件進行分類,以便游戲引擎可以使用它們,每種類別的物件都被加以編號(1是武器,2是護甲,以此類推)。每種類型都有一個相關的價值,如物件的等級指數(攻擊或防御)、特定用途、治愈值或損傷值,以及一個附屬的腳本。是的,物件可以使用腳本增強它們的能力。除了所附屬的腳本外,還可以使用一個變量去表示所有的值,如等級指數、治愈值等。

            TIP

            You can use an enumerator value to represent the categories in the sItem structure:

            enum ItemCategories { WEAPON=0,ARMOR,SHIELD,HEALING,OTHER };

            游戲中的每個物件都是有價值的,為每個物件指定一個貨幣價值可以幫助玩家在購買或出售物件時確定它的價格,相同的物件售出的價格通常比購買的價格稍低。

            有時并不希望玩家能夠出售某件物品,例如一個非常重要的魔術物件。一個標志位就能夠起到這樣的作用,而且還可以添加其他更多的標志位。

            將每個標志表示為一個enum數值(最多32個標志),設置、清除、或檢查一個標志,可以使用隨后的宏(在宏的使用中,v代表物件的標志變量,而f代表了該標志):

            enum {
              SELLABLE = 0, // Bit 0
              CANDROP, // Bit 1
              USEONCE, // Bit 2
              UNKNOWN // Bit 3
            };

            #define SetItemFlag(v,f) (v |= (1 << f))
            #define ClearItemFlag(v,f) (v &= ~(1 << f))
            #define CheckItemFlag(v,f) (v & (1 << f))

            // Example using macros and flags
            long ItemFlags = 0;

            // Set item flags to sellable and item can be dropped
            SetItemFlag(ItemFlags, SELLABLE);
            SetItemFlag(ItemFlags, CANDROP);

            // Check if the item is dropable and display a message
            if(CheckItemFlag(ItemFlags, CANDROP))
              MessageBox(NULL, “Can Drop Item”, “Item”, MB_OK);

            ClearItemFlag(ItemFlags, SELLABLE); // Clear sellable flag

             

            使用限制

            游戲中的某些角色可能不能使用某個特定的物件。例如一個魔法師,他不可能揮舞一把巨大的戰斧,而一個野蠻人則不可能施展法術。在這種情況下,特定的角色只能被允許去使用特定的物件,所以需要指定角色類別的使用限制。

            NOTE

            A character class is a classification or grouping of characters based on their race or profession. For example,
            all humans belong to the same class, but to be more specific, human fighters are considered a
            separate class from human wizards (or just fighters and wizards—who says they all have to be human).

            To represent the usage restrictions of an item, another variable is introduced to the
            sItem structure, one that tracks 32 bits of information. Each bit represents a single
            class, which means that you can track up to 32 classes. If an item is usable by a certain
            class, that respective bit is set; if an item is restricted in use by the character’s
            class, the appropriate bit is cleared.


            Here’s the addition to the sItem structure, which handles usage restrictions:


            long Usage; // Usage restrictions
            // ... other sItem data


            To make setting, clearing, and retrieving a usage restriction class bit easier, you can
            use the following macros (v represents the flag variable, and c is the class number
            ranging from 0 to 31):

            #define SetUsageBit(v,c) (v |= (1 << c))
            #define ClearUsageBit(v,c) (v &= ((~(1 << c))
            #define CheckUsageBit(v,c) (v & (1 << c))

            // Examples using macros
            long Flags = 0;

            SetUsageBit(Flags, 5); // Set class 5 bit

            if(CheckUsageBit(Flags, 5)) // Check class 5 bit
                  MessageBox(NULL, “Usage Set”, “Bit”, MB_OK);

            ClearUsageBit(Flags, 5); // Clear class 5 bit


            Using the preceding macros (SetUsageBit, ClearUsageBit, and CheckUsageBit), you can
            quickly check whether a character is allowed to use or equip the item based on his
            character class. For example, this game places wizards in class 1 and fighters in
            class 2. When the wizard tries to equip a broadsword (one that has the class 1 bit
            clear), the game engine informs the player that the wizard cannot use the item.

            為了使物件能夠更加靈活通用,可以為物件附上腳本。無論是使用療傷藥,或是在戰斗中使用劍,或者玩家啟用了某種特定的物件(例如使用魔杖),每當一個物體被使用時,它的腳本也被觸發。

            最終的物件結構定義如下:

            enum ItemCategories
            {
                MONEY = 0,
                WEAPON,
                ARMOR,
                SHIELD,
                ACCESSORY,
                EDIBLE,
                HEALING,
                COLLECTION,
                TRANSPORTATION,
                CONTAINER,
                OTHER 
            };

            #define set_bit(v, c)   ((v) |= (1 << (c)))
            #define clear_bit(v, c) ((v) &= ~(1 << (c)))
            #define check_bit(v, c) ((v) & (1 << (c)))

            enum 
            {
                SELLABLE = 0,   
            // bit 0
                CANDROP,        // bit 1
                USEONCE,        // bit 2
                UNKNOWN         // bit 3
            };

            typedef 
            struct sItem
            {
                
            char    name[32];               // a short name for the item
                char    desc[128];              // a desciption of item
                float   weight;                 // weight (in lbs.)
                float   size;                   // size (in cubic feet)
                long    category;               // category of item
                long    value;                  // modifier, health increase, etc.
                long    price;                  // buying price of item
                long    flags;                  // item bit flags
                long    usage;                  // usage restrictions

                
            char    script_filename[16];    // .mls script filename
                char    mesh_filename[16];      // .x mesh filename
                char    image_filename[16];     // .bmp image filename
            } *sItemPtr;

             

            With the complete sItem structure in place, it’s time to get back to building the
            sword item. Say that the sword item uses a +10 modifier on damage (which means
            that you add 10 to the damage factor in combat). The sword normally sells for 200
            monetary units in the game, and only fighter classes (class two) can use it:


            // Character class definitions
            #define WIZARD 1
            #define WARRIOR 2

            sItem Sword = {
              “Sword”, “A big heavy sword”, // name and description
                5.0f, 4.0f, // weight and size
                WEAPON, 200, SELLABLE | CANDROP, // category, price, and flags
               (1 << WARRIOR), // usage class 2 (warrior)
             “”, “Sword.x”, “Sword.bmp” // Script, mesh, image files
            };


            Now that the sword item is defined, you can use it in the game. But what good is a single
            item? Your game world is going to be packed with items! How can you possibly deal with all
            those objects?

             

            主物件列表

            游戲中的每個物件都需要被定義,同時為了使事情保持簡潔,需要在主物件列表(master item list,MIL)中記錄所有物件的描述。可以將MIL想象成一個物件的目錄,如下圖所示,每個物件都進行編號以便引用,同時每種物件僅顯示一個。

            每當需要一個新物件時,或者需要檢索指定物件的屬性特征時,可以搜索MIL。在一個基本的層面上,游戲的MIL可以被存儲為sItem結構的數組,或一個順序文件,它由物件結構的列表所組成,如下圖所示:

             

            構造MIL

            The following code bit creates a small item structure that contains the item’s name,
            weight, and size. You will use this structure to construct a simple MIL:


            typedef struct sItem
            {
                char Name[32]; // Name of item
                float Weight; // Weight (in lbs.)
                float Size; // Size (in cubic ft.)
            };

            From here, say that you want to store five items in the MIL, all represented in an
            array of sItem structures:

            sItem Items[5] = {
               { “Big Sword”, 5.0f, 4.0f },
               { “Small Sword”, 2.0f, 2.0f },
               { “Magic Wand”, 0.5f, 1.0f },
               { “Rock”, 1.0f, 0.5f },
               { “Potion”, 0.5f, 0.5f }
            };

            Now that you have defined your MIL (using an array of sItem structures), you may want
            to save the list out to a file for later retrieval. Such is the case if you are using a separate
            program that creates the MIL file for you, much like the program you’ll see in the
            upcoming section, “Using the MIL Editor.” As for here, take a look at the following bit
            of code that will create a file (called items.mil) and save the Items array to the file:


            FILE *fp=fopen(“items.mil”, “wb”);

            for(short i=0;i<5;i++)
            fwrite(&Items[i], 1, sizeof(sItem), fp);

            fclose(fp);

             

            Although short and to the point, the preceding example for creating a MIL file
            is wholly unusable in a real-world application such as a role-playing game. Item
            descriptions need to contain much more information, and you could theoretically
            work with thousands of items. Doing all that by hand is a waste of time. What you
            need is an item editor to help you create and maintain the MIL . . . and, so, behold
            the MIL Editor.


            posted on 2007-11-06 00:34 lovedday 閱讀(892) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            国产午夜福利精品久久2021 | 久久亚洲综合色一区二区三区| 亚洲精品乱码久久久久久蜜桃图片 | 久久婷婷人人澡人人爽人人爱| 久久精品国产99国产精品导航| 久久99国产乱子伦精品免费| 国产精品美女久久久久网| 99久久精品国产毛片| 久久强奷乱码老熟女网站| 狠狠色丁香婷综合久久| 日本久久中文字幕| 97久久精品人妻人人搡人人玩| 9999国产精品欧美久久久久久 | 欧美日韩中文字幕久久久不卡| 久久无码人妻一区二区三区午夜| 国产综合成人久久大片91| 久久精品天天中文字幕人妻| 久久青青草原精品国产不卡| 久久久久成人精品无码中文字幕| 久久亚洲2019中文字幕| 精品久久久久久国产潘金莲| 久久久久久午夜精品| 久久免费99精品国产自在现线| 国产精品久久国产精品99盘| 亚洲精品国产美女久久久| 久久成人国产精品一区二区| 久久本道伊人久久| AV色综合久久天堂AV色综合在| 性做久久久久久久久浪潮| 一本大道久久a久久精品综合| 久久精品国产亚洲av麻豆色欲| 国产精品久久久久久五月尺| 国产成人精品综合久久久| 久久香蕉一级毛片| 国产精品久久久福利| 久久精品国产精品亚洲毛片| 伊人久久大香线蕉综合Av| 久久精品免费全国观看国产| 精品久久久久久久国产潘金莲| 日本高清无卡码一区二区久久| 香蕉久久永久视频|