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

天行健 君子當自強而不息

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

 

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

 

使用物品清單系統管理物件

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

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

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


 

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

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.

 

開發一個地圖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)  編輯 收藏 引用


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


公告

導航

統計

常用鏈接

隨筆分類(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ⅴ浪潮 | 久久久久久久尹人综合网亚洲| 国产日韩欧美亚洲| 久久午夜羞羞影院免费观看| 久久免费精品日本久久中文字幕| 黄色一区二区三区四区| 欧美二区不卡| 欧美日韩国产黄| 欧美一区国产在线| 久久精品久久综合| 亚洲久久一区二区| 99riav1国产精品视频| 国产精品视频区| 久久免费视频在线| 欧美高清视频在线观看| 亚洲一区二区高清| 久久av红桃一区二区小说| 亚洲高清视频在线观看| 日韩午夜激情av| 国产色爱av资源综合区| 亚洲第一黄色| 欧美日韩少妇| 你懂的一区二区| 欧美午夜精品一区二区三区| 久久视频在线看| 欧美日本在线看| 久久久久久久久久久久久久一区| 蜜桃av综合| 久久爱91午夜羞羞| 欧美激情第六页| 久久久久久久999| 欧美区在线观看| 麻豆国产精品一区二区三区 | 久久精品国产999大香线蕉| 亚洲区一区二| 欧美亚洲日本国产| 亚洲视频图片小说| 久久久av毛片精品| 午夜精品视频在线| 欧美激情精品| 免费在线一区二区| 国产麻豆精品theporn| 亚洲日本精品国产第一区| 国产亚洲欧美一级| 亚洲一二三区在线| 一区二区电影免费观看| 免费高清在线一区| 久久久综合激的五月天| 国产精品欧美在线| 日韩一区二区精品在线观看| 91久久精品日日躁夜夜躁欧美| 午夜伦理片一区| 亚欧成人在线| 国产精品免费小视频| 最近看过的日韩成人| 亚洲经典三级| 欧美成人第一页| 欧美国产激情| 亚洲国产一二三| 免费人成精品欧美精品| 女同性一区二区三区人了人一| 国产色综合久久| 欧美一区二区高清在线观看| 午夜久久久久久久久久一区二区| 欧美日韩一区二区三区高清| 亚洲日本无吗高清不卡| 99精品国产在热久久| 男男成人高潮片免费网站| 欧美激情一二三区| 亚洲精品女av网站| 欧美日本在线一区| 国产精品99久久久久久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美视频在线观看一区二区| 在线综合视频| 久久久久国产精品午夜一区| 国产一区二区三区在线观看精品| 久久爱另类一区二区小说| 久久午夜av| 亚洲人成绝费网站色www| 欧美激情影音先锋| 亚洲天堂av电影| 久久精品视频在线看| 亚洲电影免费观看高清完整版在线观看 | 亚洲第一二三四五区| 99国产一区二区三精品乱码| 国产精品进线69影院| 西西人体一区二区| 欧美激情一区二区三区蜜桃视频| 一本色道久久综合亚洲精品高清| 欧美午夜免费影院| 久久九九99视频| 亚洲精品乱码久久久久| 欧美亚洲免费| 亚洲欧洲三级| 国产日韩精品在线观看| 久久综合伊人77777麻豆| 99re这里只有精品6| 久久精品色图| 夜夜夜精品看看| 国产一区二区剧情av在线| 欧美成人在线网站| 亚洲免费视频成人| 亚洲国产欧美一区二区三区久久 | 亚洲福利在线视频| 国产精品白丝av嫩草影院| 久久深夜福利免费观看| 9色porny自拍视频一区二区| 开心色5月久久精品| 亚洲天堂成人| 亚洲精品国产系列| 黄色成人在线| 国产精品久久91| 欧美精品v日韩精品v韩国精品v| 性欧美18~19sex高清播放| 亚洲日本国产| 欧美福利一区二区| 久久久久国产免费免费| 亚洲在线免费| 日韩午夜av在线| 亚洲第一二三四五区| 国产亚洲网站| 国产精品久久久久久久7电影 | 久久久久久久久久久久久9999| 一区电影在线观看| 亚洲三级观看| 欧美黄色小视频| 蜜桃av噜噜一区| 久久亚洲高清| 久久九九免费视频| 欧美主播一区二区三区| 亚洲欧美激情在线视频| 99riav久久精品riav| 亚洲精品人人| 亚洲区国产区| 亚洲精品一二三| 亚洲人被黑人高潮完整版| 亚洲成人在线| 亚洲国产高清在线观看视频| 伊人久久久大香线蕉综合直播| 国产亚洲aⅴaaaaaa毛片| 国产日韩欧美在线看| 国产乱码精品一区二区三| 国产精品久久久久久久久果冻传媒| 欧美日韩国产黄| 欧美性色aⅴ视频一区日韩精品| 欧美日韩国产高清视频| 欧美日韩激情网| 欧美视频一区二区三区四区| 欧美特黄一区| 国产欧美精品在线| 国产一区二区三区视频在线观看 | 欧美国产一区二区| 欧美精品在线一区| 国产精品成人一区二区三区夜夜夜| 欧美日韩亚洲一区在线观看| 欧美日韩在线观看一区二区| 国产精品a级| 国产日韩欧美精品在线| 有坂深雪在线一区| 亚洲精品小视频在线观看| 亚洲一区二区影院| 久久国产精品99精品国产| 久久亚洲国产精品一区二区| 亚洲成人在线视频播放| 免费日本视频一区| 亚洲国产综合在线| 亚洲一区二区三| 久久综合色影院| 国产精品ⅴa在线观看h| 国产欧美在线视频| 亚洲激情在线观看| 午夜精品一区二区三区电影天堂| 久久久福利视频| 亚洲精品你懂的| 亚洲一级在线观看| 老司机凹凸av亚洲导航| 国产精品第三页| 亚洲福利小视频| 香蕉久久夜色精品国产使用方法| 免费成人黄色av| 亚洲一区在线播放| 麻豆精品一区二区综合av| 国产精品久久久久9999高清| 亚洲电影免费观看高清完整版在线观看 | 亚洲黄色成人网| 欧美一区二区三区视频在线观看| 欧美 日韩 国产一区二区在线视频 | 亚洲欧美综合| 亚洲第一视频网站| 欧美在现视频| 欧美视频中文字幕在线| 亚洲国产精品久久久久久女王| 亚洲欧美视频一区二区三区| 亚洲电影免费观看高清完整版在线观看| 亚洲自拍偷拍网址|