青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

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

 

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

 

使用物品清單系統(tǒng)管理物件

物件被分散在四處,玩家們找到這些物件只不過是一個時間問題。對于這種情況,玩家需要運用一種方法去管理物件,包括使用物品清單控制系統(tǒng)(inventory control system,ICS)來進行分類整理。

請不要誤解,一個ICS并不只適用于玩家,它同樣適用于整個游戲世界。物件可以屬于一張地圖,一個角色,甚至是另一個物件(例如背包,有一些其他的物件在它里面),那就意味著物件需要指定它的所有者(ownership)。除此之外,一個所有者可以擁有一個物件的多個實例(multiple instance),例如貨幣。

所有者的物件收藏稱之為物件清單列表(inventory list),任何物件都可以歸屬到這個列表中去(也包括物件的眾多實例)。所有者,物件清單列表,以及數(shù)量之間的關系如下表所示:


 

ICS和MIL相互協(xié)調(diào)工作,MIL只保存了世界中每個物件惟一的實例,而ICS則使用了物件的眾多實例。每當ICS需要一個物件的信息時,它可以引用MIL。以這種方式,可以僅使用ICS保存MIL中的物件引用編號(如下圖所示),以節(jié)省大量內(nèi)存。

For your game’s maps and levels, a simple ICS (called a map ICS) consists of only a
list of items and their locations within the map, which is just fine because you can
place objects throughout—ready for characters to pick them up. The real problem
comes when those characters pick them up and add them to their inventory.
Multiple instances pile up, new items are added, and other items are used or
dropped. Things quickly become a real jumble. Handling a collection of character’s
objects is the job of a character ICS, which is a little more complicated than its map
counterpart.

 

開發(fā)一個地圖ICS

The map ICS tracks items that are placed within levels, including items that are
contained within other items—a sword contained within a treasure chest, for
example. The type of map you use determines how you position items within the
map. In 3-D maps, you use three coordinates for positioning an item—the X-, Y-,
and Z- coordinates. Because each map is also unique (each part of the world has
different maps), you can track each map’s items in separate files.

You can represent the map ICS with a structure and a class:

//==================================================================================
// This structure contains map item information list.
//==================================================================================
typedef struct sMapItem
{
    
long    item_index;             // MIL item index
    long    quantity;               // quantity of item (ie coins)
    float   x_pos, y_pos, z_pos;    // map coordinates

    sMapItem*   prev;
    sMapItem*   next;

    
long    index;          // map item index
    long    owner_index;

    sMapItem*   parent;     
// parent of a contained item
    
    sMapItem()
    {
        memset(
this, 0, sizeof(*this));
        owner_index = -1;
    }

    ~sMapItem()
    {
        delete next;   
    }
} *sMapItemPtr;

//==================================================================================
// This class encapsulate map inventory contrl system.
//==================================================================================
typedef class cMapIcs
{
private:
    
long        m_num_items;
    sMapItemPtr m_root_item;

private:
    
long    get_next_long(FILE* fp);
    
float   get_next_float(FILE* fp);

public:
    cMapIcs();
    ~cMapIcs();

    
bool load(const char* filename);
    
bool save(const char* filename);
    
void free();

    
void add(long item_index, long quantity,
             
float x_pos, float y_pos, float z_pos,
             sMapItemPtr owner_item);

    
void remove(sMapItemPtr item);

    
long get_num_items();
    sMapItemPtr get_root_item();
    sMapItemPtr get_item(
long index);
} *cMapIcsPtr;

First, you see the sMapItem structure, which holds the information for every item in
the map. item_index is the MIL item reference number (which ranges from 0 to 1,023
if you used the MILEdit program), and quantity is the number of item_index (to allow
things like a horde of coins to be represented as a single object). Then you see the
item’s map coordinates x_pos, y_pos, and z_pos.

Next comes the prev and next pointers. You insert them to track a linked list of
sMapItem structures. The next couple of variables, index and owner_index, are used when
loading and saving the items in a map. Index stores the current index number of
an item in the linked list. If an item is owned by another item, the Owner variable
holds the index number of the parent object (otherwise, Owner is set to -1). When
loading (or adding) an object, you set the final variable in sMapItem (parent) to point
to the actual owner item’s structure. You can see the sMapItem structure link list concept
illustrated in Figure 15.8.

The sMapItem uses both a constructor and destructor function called whenever a
structure instance is allocated or reallocated. Both functions ensure that the linked
list pointers are in check, and whenever a structure is deleted, all subsequent
sMapItem structures in the linked list are deleted as well.

CAUTION
If you’re removing only a single instance of sMapItem from the linked list, you first have to
set the instance’s Next variable to NULL. Doing so ensures that all subsequent instances in the
linked list are not deleted as well.

The cMapICS class has two private functions (get_next_long and get_next_float) used to read
in text and convert it into a long or float value. The cMapICS class also has eight usable
public functions. Take a closer look at those public functions.


posted on 2007-11-07 18:31 lovedday 閱讀(252) 評論(0)  編輯 收藏 引用


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国一区二区在线观看| 国产日韩欧美一区二区| 在线视频观看日韩| 女人天堂亚洲aⅴ在线观看| 久久av二区| 在线观看日韩av先锋影音电影院| 久久这里有精品视频| 久久久久网站| 亚洲精品久久久久久久久| 亚洲国产婷婷香蕉久久久久久99| 欧美大片免费久久精品三p| 亚洲理论在线观看| 一区二区久久| 合欧美一区二区三区| 嫩草影视亚洲| 欧美日韩精品欧美日韩精品 | av不卡免费看| 一区二区三欧美| 国产亚洲欧美日韩一区二区| 老司机精品久久| 欧美日韩另类国产亚洲欧美一级| 欧美亚洲综合网| 老鸭窝亚洲一区二区三区| 在线亚洲国产精品网站| 亚洲欧美综合国产精品一区| 亚洲高清三级视频| 亚洲午夜日本在线观看| 亚洲成人在线| 亚洲天堂偷拍| 亚洲三级影院| 翔田千里一区二区| 日韩视频永久免费观看| 亚洲欧美中日韩| 99re6热只有精品免费观看| 午夜免费日韩视频| 一本色道久久88综合亚洲精品ⅰ | 久久人人九九| 欧美日韩国产一级片| 老巨人导航500精品| 国产精品久久久久9999| 亚洲国产成人久久综合| 国产三级精品三级| 一本色道久久88精品综合| 亚洲高清不卡| 欧美中文字幕不卡| 午夜精品一区二区三区电影天堂| 乱中年女人伦av一区二区| 久久国产精品久久久久久久久久| 欧美破处大片在线视频| 欧美成人国产| 国产午夜精品在线观看| 亚洲午夜av电影| 亚洲视频一区二区在线观看| 久久在精品线影院精品国产| 久久av资源网| 国产美女扒开尿口久久久| 日韩一级裸体免费视频| 亚洲另类自拍| 欧美黄色片免费观看| 免费成人美女女| 尤物视频一区二区| 欧美一区二区三区免费大片| 欧美亚洲视频在线观看| 国产精品久久久久久久久久久久| 亚洲破处大片| 亚洲少妇中出一区| 国产精品a级| 亚洲天堂网在线观看| 亚洲女同在线| 国产精品欧美在线| 亚洲免费中文字幕| 久久国产色av| 狠狠狠色丁香婷婷综合久久五月| 欧美一区二区黄| 久久久久久国产精品mv| 狠狠色综合色区| 另类激情亚洲| 亚洲精品亚洲人成人网| 亚洲一区bb| 国产女精品视频网站免费| 久久精品91| 亚洲盗摄视频| 宅男噜噜噜66一区二区 | 久久久www成人免费毛片麻豆| 久久av一区| 在线观看视频一区| 欧美精品一区二区久久婷婷| 99视频超级精品| 性色av一区二区三区| 国产综合色产| 欧美激情一区在线观看| 在线视频欧美精品| 久久久亚洲国产美女国产盗摄| 亚洲福利专区| 欧美亚洲第一页| 久久久久91| 亚洲精品在线视频| 欧美一区二区三区四区在线 | 欧美日韩一区二区三区四区五区| 在线视频欧美精品| 久久亚洲国产精品日日av夜夜| 亚洲人成在线免费观看| 欧美日韩精品一区二区| 欧美在线一二三区| 亚洲乱亚洲高清| 久久久青草青青国产亚洲免观| 亚洲精品影院在线观看| 国产精品一二三视频| 老司机免费视频久久| 亚洲一区二区久久| 欧美护士18xxxxhd| 欧美中文字幕视频在线观看| 亚洲精品护士| 国内精品久久久| 国产精品igao视频网网址不卡日韩| 久久av在线| 亚洲一区二区免费视频| 亚洲第一毛片| 久久综合激情| 欧美一级片久久久久久久| 亚洲靠逼com| 亚洲国产精品999| 国产亚洲一区二区三区在线播放| 欧美日韩三级| 欧美国产日本在线| 久久香蕉国产线看观看av| 亚洲男人的天堂在线| 亚洲麻豆国产自偷在线| 亚洲福利小视频| 美女成人午夜| 久久久久国产精品人| 性一交一乱一区二区洋洋av| 一区电影在线观看| 亚洲欧洲一区二区在线播放| 欲色影视综合吧| 韩国精品主播一区二区在线观看| 国产精品视屏| 国产精品一级在线| 国产精品久久久久三级| 欧美日韩喷水| 国产精品v欧美精品v日韩 | 欧美11—12娇小xxxx| 久久久之久亚州精品露出| 久久精品国产第一区二区三区| 亚洲欧美www| 先锋影音网一区二区| 亚洲欧美成人网| 欧美亚洲免费电影| 久久成人人人人精品欧| 欧美在线地址| 另类av一区二区| 欧美国产三区| 欧美日韩福利视频| 欧美天天视频| 国产乱码精品一区二区三| 国产日本欧美一区二区| 国产在线欧美| 亚洲国产三级网| 日韩小视频在线观看专区| 亚洲视频一起| 久久国产色av| 欧美国产亚洲视频| 亚洲美女在线国产| 午夜精品久久久| 久久精品夜夜夜夜久久| 久久综合色综合88| 欧美视频免费| 国产一区久久久| 亚洲精品乱码久久久久| 亚洲在线播放电影| 老司机成人网| 亚洲精品国产拍免费91在线| 一区二区三区视频在线| 亚洲欧美日韩一区二区| 卡通动漫国产精品| 欧美亚洲第一区| 激情综合在线| 亚洲一二区在线| 久久综合精品国产一区二区三区| 亚洲国产欧美久久| 午夜国产一区| 欧美黄色免费网站| 国产手机视频精品| 亚洲精品一区二区三区在线观看| 亚洲欧美精品在线观看| 欧美国产先锋| 香蕉av777xxx色综合一区| 欧美大片一区二区| 国产精品久久久久免费a∨| 亚洲国产精品一区二区三区| 亚洲欧美精品suv| 欧美丰满少妇xxxbbb| 亚洲欧美一区在线| 欧美精品久久一区二区| 国产视频在线观看一区二区三区 | 国产亚洲制服色| 一区二区欧美日韩| 欧美大片第1页| 午夜视频在线观看一区| 欧美三区免费完整视频在线观看|