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

天行健 君子當自強而不息

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

 

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


Developing a Character ICS

Although developing a character’s inventory system might make you cringe at first,
let me reassure you that it’s not much different from developing a map inventory
control system. You have the ability to add and remove items, but you don’t have the
problem of dealing with the item coordinates on the map. Instead, a player’s ICS
keeps track of order, which means that players can rearrange the items as they see fit.


Of course, this ordering is just a matter of arranging the linked list, but what about
the items that can hold other items, such as backpacks? As long as you properly categorize
the items as containers in the MIL Editor, you don’t need to worry.


Speaking of categorizing, the real magic happens when you want to equip or use
an item. Because each item is categorized, the character ICS can quickly determine
what to do with the item in question. If the item is a weapon, the character ICS can
ask to equip the item. If it’s a healing item, the player can consume it. Beginning
to get the idea?

Finally, a character ICS should allow the player to examine objects, which is the reason
for the mesh and image parameters in the MIL Editor. Whenever the game’s
player examines the object, the specific mesh or image is loaded and displayed.
Now, turn your attention to putting together a character ICS and example by using
the ICS.

 

Defining the cCharICS Class

Interface:

//==================================================================================
// This structure contains char item information list.
//==================================================================================
typedef struct sCharItem
{
    
long    item_index;     // MIL item index
    long    quantity;       // quantity of item (ie coins)    

    sCharItem*   prev;
    sCharItem*   next;

    
long    index;           // map item index
    long    owner;

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

    ~sCharItem()
    {
        delete next;   
    }
} *sCharItemPtr;

//==================================================================================
// This class encapsulate char inventory contrl system for character.
//==================================================================================
typedef class cCharIcs
{
private:
    
long         m_num_items;
    sCharItemPtr m_root_item;

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

public:
    cCharIcs();
    ~cCharIcs();

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

    
void add(long item_index, long quantity, sCharItemPtr owner_item);
    
void remove(sCharItemPtr item);

    
long get_num_items();
    sCharItemPtr get_root_item();
    sCharItemPtr get_item(
long index);

    
void sort();
    
bool move_up(sCharItemPtr item);
    
bool move_down(sCharItemPtr item);
} *cCharIcsPtr;
 

Much like the cMapICS class, the cCharICS class uses a special structure (sCharItem) that
tracks the MIL item numbers and quantity and maintains a linked list. Unlike the
sMapItem structure, however, sCharItem doesn’t care about the item’s coordinates.

Implement:

//----------------------------------------------------------------------------
// Get numeric value from file.
//----------------------------------------------------------------------------
static void get_numeric_value(FILE* fp, char* buf, int size)
{
    
long pos;
    
int c;

    
// read until EOF or EOL or over buffer
    for(pos = 0; (c = fgetc(fp)) != EOF && c != 0x0a && pos != size-1; pos++)
    {
        
if((c >= '0' && c <= '9') || c == '.' || c == '-')
            buf[pos] = c;
    }

    buf[pos] = 0;
}

//----------------------------------------------------------------------------
// Constructor, initialize member data.
//----------------------------------------------------------------------------
cCharIcs::cCharIcs()
{
    memset(
this, 0, sizeof(*this));
}

//----------------------------------------------------------------------------
// Destructor, free allocated resource. 
//----------------------------------------------------------------------------
cCharIcs::~cCharIcs()
{
  free();
}

//----------------------------------------------------------------------------
// free allocate resource.
//----------------------------------------------------------------------------
void cCharIcs::free()
{
  m_num_items = 0;

  delete m_root_item;  
}

//----------------------------------------------------------------------------
// Load all char items from file.
//----------------------------------------------------------------------------
bool cCharIcs::load(const char* filename)
{
    free();     
// free a prior set

    FILE* fp;

    
if((fp = fopen(filename, "rb")) == NULL)
        
return false;    

    sCharItemPtr item;
    sCharItemPtr item_ptr = NULL;

    
// loop forever reading in items
    while(1)
    {
        
long item_index;

        
// get next item number (break if no more items, which is represented by a return value of -1).
        if((item_index = get_next_long(fp)) == -1)
            
break;

        
// create a new map item and link it in

        item = 
new sCharItem;

        
if(item_ptr == NULL)
            m_root_item = item;
        
else
        {
            item->prev = item_ptr;
            item_ptr->next = item;
        }

        item_ptr = item;

        item->item_index  = item_index;
        item->quantity    = get_next_long(fp);      
        item->owner       = get_next_long(fp);
        item->index       = m_num_items++;
    }

    fclose(fp);

    
// match objects that belong to others
    for(item_ptr = m_root_item; item_ptr != NULL; item_ptr = item_ptr->next)
    {
        
// check if this item belongs to another
        if(item_ptr->owner == -1)
            
continue;

        
// find matching parent item
        for(item = m_root_item; item != NULL; item = item->next)
        {
            
if(item_ptr->owner == item->index)
            {
                
// a match, point to parent and stop scanning for parents.
                item_ptr->parent = item;
                
break;
            }
        }
    }

    
return true;
}

//----------------------------------------------------------------------------
// Save all char items to file.
//----------------------------------------------------------------------------
bool cCharIcs::save(const char* filename)
{
    FILE* fp;

    
if((fp = fopen(filename, "wb")) == NULL)
        
return false;
     
    
long index = 0;

    
for(sCharItemPtr item = m_root_item; item != NULL; item = item->next)
    {
        item->index = index++;

        
// match child items to parents
        if(item->parent)
            item->owner = item->parent->index;
        
else
            item->owner = -1;

        fprintf(fp, "%lu\r\n%lu\r\n%ld\r\n", item->item_index, item->quantity, item->owner);
    }
    
    fclose(fp);

    
return true;
}

//----------------------------------------------------------------------------
// Add char item into list.
//----------------------------------------------------------------------------
void cCharIcs::add(long item_index, long quantity, sCharItemPtr owner_item)
{
    sCharItemPtr item = 
new sCharItem;

    
// fill the item structure
    item->item_index = item_index;
    item->quantity   = quantity;
    item->parent     = owner_item;

    
// insert into top of list

    item->next = m_root_item;

    
if(m_root_item)
        m_root_item->prev = item;

    m_root_item = item;
}

//----------------------------------------------------------------------------
// Remove char item from list.
//----------------------------------------------------------------------------
void cCharIcs::remove(sCharItemPtr item)
{    
    sCharItemPtr next_item;

    
// remove child objects first
    for(sCharItemPtr item_ptr = m_root_item; item_ptr != NULL; item_ptr = next_item)
    {
        next_item = item_ptr->next;

        
if(item_ptr->parent == item)
            remove(item_ptr);
    }

    
// remove from linked list and reset root if it's the current head of list.
    
    
if(item->prev)
        item->prev->next = item->next;
    
else
        m_root_item = item->next;

    
if(item->next)
        item->next->prev = item->prev;

    item->prev = item->next = NULL;
    delete item;
}

//----------------------------------------------------------------------------
// Return number of map items.
//----------------------------------------------------------------------------
long cCharIcs::get_num_items()
{
    
return m_num_items;
}

//----------------------------------------------------------------------------
// Return root map item.
//----------------------------------------------------------------------------
sCharItemPtr cCharIcs::get_root_item()
{
    
return m_root_item;
}

//----------------------------------------------------------------------------
// Return map item with specified index.
//----------------------------------------------------------------------------
sCharItemPtr cCharIcs::get_item(long index)
{
    sCharItemPtr item;

    
// loop until reached item index
    for(item = m_root_item; item != NULL && index != 0; item = item->next)
        index--;

    
return item;
}

//----------------------------------------------------------------------------
// Return long value from next line in file.
//----------------------------------------------------------------------------
long cCharIcs::get_next_long(FILE *fp)
{
    
char buf[1024];
    get_numeric_value(fp, buf, 
sizeof(buf));

    
if(strlen(buf) == 0)    // if there is no long value in file
        return -1;

    
return atol(buf);
}

//----------------------------------------------------------------------------
// Return float value from next line in file.
//----------------------------------------------------------------------------
float cCharIcs::get_next_float(FILE *fp)
{
    
char buf[1024];
    get_numeric_value(fp, buf, 
sizeof(buf));

    
return (float)atof(buf);
}

The cCharICS class, again, is much like its cMapICS counterpart, except for the addition
of three more public functions— sort, move_up, and move_down. You use these functions
to sort the character’s list of items. Their code is as follows:


//----------------------------------------------------------------------------
// Arrange char ics.
//----------------------------------------------------------------------------
void cCharIcs::sort()
{
    
// start at top of linked list and float each item up that has a lesser item_index,
    // break if past bottom of list.
    for(sCharItemPtr item = m_root_item; item != NULL; item = item->next)
    {
        
// keep floating up while previous item has a lesser item_index value or
        // until top of list has been rearched.
        for(sCharItemPtr prev_item = item->prev; prev_item != NULL; prev_item = item->prev)
        {
            
// break if no more to float up
            if(prev_item->item_index <= item->item_index)
                
break;

            
// swap element

            
if(prev_item->prev)
                prev_item->prev->next = item;

            
if((prev_item->next = item->next) != NULL)
                item->next->prev = prev_item;

            
if((item->prev = prev_item->prev) == NULL)
                m_root_item = item;
            
            prev_item->prev = item;
            item->next = prev_item;
        }
    }
}

//----------------------------------------------------------------------------
// Move one char item up.
//----------------------------------------------------------------------------
bool cCharIcs::move_up(sCharItemPtr item)
{
    sCharItemPtr prev_item = item->prev;

    
if(prev_item == NULL)
        
return FALSE;

    
// swap item and item before it

    
if(prev_item->prev)
        prev_item->prev->next = item;

    
if((prev_item->next = item->next) != NULL)
        item->next->prev = prev_item;

    
if((item->prev = prev_item->prev) == NULL)
        m_root_item = item;

    prev_item->prev = item;
    item->next = prev_item;

    
return TRUE;
}

//----------------------------------------------------------------------------
// Move one char item down.
//----------------------------------------------------------------------------
bool cCharIcs::move_down(sCharItemPtr item)
{
    sCharItemPtr next_item = item->next;

    
if(next_item == NULL)
        
return FALSE;

    
// swap item and item after it

    
if((item->next = next_item->next) != NULL)
        next_item->next->prev = item;

    
if((next_item->prev = item->prev) != NULL)
        item->prev->next = next_item;
    
else
        m_root_item = next_item;

    next_item->next = item;
    item->prev = next_item;

    
return TRUE;
}

Function 'sort' sorts the linked list of items based on each item’s MIL item number, from
lowest to highest. If, on the other hand, you want to specifically order the list yourself,
you can utilize the move_up and move_down functions, which take a pointer to a
sCharItem structure that is already contained in the list.

The move_up function moves the specified sItem structure up in the linked list, and
move_down moves the specified structure down in the linked list. Figure 15.10 illustrates
the concept of using the Arrange, move_up, and move_down functions on a sample
linked list of items.

The rest of the functions in cCharICS are identical in their functionality to the
cMapICS class, with the obvious exclusion of the item coordinates used when adding
an item to the list. Even the storage format for character items is identical to the
map item format, except for the coordinates.

 

Using the cCharICS Class

To demonstrate the use of the character ICS system, I created a demo application
named CharICS that maintains a list of items contained in the default.mil master
item list file. When you start the demo, you’ll see the
Inventory dialog box (shown in following snap). In the Inventory dialog box, the list
box contains an imaginary character’s inventory, which you can manipulate by
using the buttons on the dialog box.

To use the CharICS demo, follow these steps:


1. Click the Add Item button. The CharICS demo will add a random item from
the MIL to the inventory list.


2. Select an item from the list. Items are classified, so the Use and Equip buttons
are enabled or disabled depending on which item you select from the
list. Clicking Equip has no effect; it comes into play later when you deal with
characters. Clicking Use, however, removes an item if it is flagged as USEONCE.

3. Click the Drop button to drop an item (remove the item from the inventory
list) if it is flagged as CANDROP.


4. In order to arrange the items in the inventory, you can click an item and
then click either Sort Up or Sort Down. The selected item then moves up or
down in the list. To arrange the items by their item number in the list, click
Sort.


As a last, special treat, items that have matching meshes appear in the box on the
right in the demo. The 3-D object spins around slowly so that you have a full view
of all sides. Now, that’s cool!


posted on 2007-11-08 15:05 lovedday 閱讀(428) 評論(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>
            久久精品盗摄| 欧美高清一区| 久久久999精品免费| 久久精品女人天堂| 免费观看久久久4p| 国产精品扒开腿做爽爽爽视频 | 亚洲影院色在线观看免费| 亚洲精品社区| 亚洲精品国产精品乱码不99按摩| 日韩午夜激情电影| 久久黄金**| 最新亚洲一区| 亚洲美女视频在线观看| 午夜亚洲福利| 欧美日韩日本网| 好吊色欧美一区二区三区视频| 99ri日韩精品视频| 久久在精品线影院精品国产| 日韩午夜在线| 欧美福利小视频| 狠狠色噜噜狠狠色综合久| 亚洲午夜极品| 亚洲电影有码| 久久久亚洲综合| 国产欧美一区二区视频| 在线亚洲欧美专区二区| 欧美激情中文不卡| 久久爱www久久做| 国产精品美女久久久浪潮软件| 亚洲片在线观看| 久久亚洲影院| 欧美在线视频免费观看| 国产精品久久久久久av福利软件 | 国产精品v欧美精品∨日韩| 欧美日韩中文| 99精品热视频只有精品10| 欧美插天视频在线播放| 久久疯狂做爰流白浆xx| 国产精品久久久久久五月尺| 亚洲免费电影在线观看| 免费成人高清视频| 久久精品人人| 永久免费精品影视网站| 久久五月天婷婷| 国产精品99久久99久久久二8 | 欧美黄色免费| 精品电影在线观看| 久久久久欧美| 久久久国产成人精品| 国产午夜精品全部视频在线播放| 亚洲欧美另类国产| 亚洲午夜激情网站| 国产精品一区二区在线观看| 欧美一区二区国产| 欧美一区二区网站| 黄色成人在线观看| 久热精品视频| 亚洲免费视频观看| 国产一区二区日韩| 免播放器亚洲一区| 欧美激情精品久久久| 亚洲视频成人| 亚洲欧美日韩高清| 在线观看一区欧美| 亚洲激情一区二区| 国产精品成人观看视频免费| 欧美一级久久久| 久久久美女艺术照精彩视频福利播放| 黄色精品一二区| 亚洲高清久久网| 国产精品久久久久三级| 久久噜噜噜精品国产亚洲综合| 久久一区二区三区国产精品 | 国产精品老牛| 香蕉久久夜色精品| 久久露脸国产精品| 亚洲第一色中文字幕| 夜久久久久久| 国产一区二区中文| 日韩视频不卡| 国产午夜精品久久久久久久| 欧美中文在线观看国产| 免费看亚洲片| 午夜精品国产更新| 噜噜噜91成人网| 午夜欧美理论片| 欧美国产日本在线| 久久激情久久| 欧美日韩一区免费| 牛夜精品久久久久久久99黑人| 欧美日本中文字幕| 久久久久久久尹人综合网亚洲| 欧美激情第1页| 久久精品最新地址| 欧美视频免费在线| 欧美超级免费视 在线| 国产区日韩欧美| 日韩午夜免费视频| 亚洲精品欧美日韩专区| 久久不射中文字幕| 亚洲欧美日韩综合国产aⅴ| 免费欧美在线视频| 久久在线播放| 国产午夜精品麻豆| 亚洲一区在线免费观看| 一区二区国产在线观看| 免费毛片一区二区三区久久久| 午夜国产欧美理论在线播放| 久久精品国产99国产精品| 亚洲午夜免费视频| 久久er精品视频| 欧美制服丝袜第一页| 欧美性事在线| 99re6这里只有精品| 一本一本久久a久久精品牛牛影视| 久久在线免费| 另类尿喷潮videofree| 国产亚洲精品自拍| 欧美一区2区三区4区公司二百| 午夜影院日韩| 国产乱码精品一区二区三区五月婷| 一本一道久久综合狠狠老精东影业 | 麻豆九一精品爱看视频在线观看免费 | 欧美成人有码| 激情文学综合丁香| 久久精品国产一区二区电影| 久久国产福利国产秒拍| 国产亚洲成年网址在线观看| 亚洲美女色禁图| 在线观看欧美日本| 噜噜噜躁狠狠躁狠狠精品视频| 午夜伦欧美伦电影理论片| 国产精品人人爽人人做我的可爱| 亚洲视频1区| 久久成人精品无人区| 国产最新精品精品你懂的| 久久久99国产精品免费| 欧美高清你懂得| 999亚洲国产精| 欧美视频三区在线播放| 亚洲欧美日本日韩| 久久伊人精品天天| 亚洲精品系列| 国产精品白丝jk黑袜喷水| 欧美一二三视频| 欧美电影免费观看网站| 99综合在线| 国产伦理一区| 美腿丝袜亚洲色图| 99这里有精品| 玖玖综合伊人| 一本一本a久久| 国产欧美日韩不卡| 麻豆精品传媒视频| 中文一区二区| 快射av在线播放一区| 一区二区高清视频在线观看| 国产精品久久久久一区二区三区共| 日韩亚洲不卡在线| 久久性色av| 在线综合视频| 激情亚洲成人| 欧美伦理a级免费电影| 亚洲欧美日本视频在线观看| 欧美一区亚洲一区| 亚洲国产精品悠悠久久琪琪| 国产精品美女主播在线观看纯欲| 久久久人人人| 亚洲天堂av综合网| 欧美电影在线观看完整版| 亚洲一区二区三区在线| 亚洲国产精品久久久久秋霞影院| 欧美视频不卡| 欧美成人午夜免费视在线看片| 亚洲一区精品视频| 亚洲欧洲在线一区| 老司机午夜精品| 性欧美video另类hd性玩具| 亚洲日本理论电影| 含羞草久久爱69一区| 国产精品激情偷乱一区二区∴| 欧美a级一区二区| 久久精精品视频| 午夜亚洲影视| 亚洲一区在线观看视频 | 性欧美暴力猛交另类hd| 国产午夜一区二区三区| 欧美性猛交99久久久久99按摩| 免费日韩视频| 久久亚洲国产精品一区二区| 亚洲视频在线免费观看| 日韩亚洲欧美一区二区三区| 久久精品久久综合| 欧美一区二区三区久久精品| 亚洲一区二区欧美| 亚洲少妇在线| 一区二区免费看| 亚洲视频在线播放| 亚洲性夜色噜噜噜7777| 亚洲深夜福利网站|