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

天行健 君子當自強而不息

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

 

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

 

cMapIcs::get_next_long,cMapIcs::get_next_float

//----------------------------------------------------------------------------
// Return long value from next line in file.
//----------------------------------------------------------------------------
long get_next_long(FILE* fp)
{
    
char buf[1024];
    
long pos = 0;
    
int c;

    
// Read until EOF or EOL
    while(1) 
    {
        
if((c = fgetc(fp)) == EOF || c == '\n' || pos == sizeof(buf)-1)
            
break;

        
if((c >= '0' && c <= '9') || c == '.' || c == '-')
            buf[pos++] = c;
    }

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

    buf[pos] = 0;

    
return atol(buf);
}

//----------------------------------------------------------------------------
// Return float value from next line in file.
//----------------------------------------------------------------------------
float get_next_float(FILE* fp)
{
    
char buf[1024];
    
long pos = 0;
    
int c;

    
// Read until EOF or EOL
    while(1) 
    {
        
if((c = fgetc(fp)) == EOF || c == '\n' || pos == sizeof(buf)-1)
            
break;

        
if((c >= '0' && c <= '9') || c == '.' || c == '-')
            buf[pos++] = c;
    }

    buf[pos] = 0;

    
return (float)atof(buf);
}
 

構造函數、析構函數

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

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

cMapIcs::load, cMapIcs::save, and cMapIcs::free

As their names suggest, this trio of functions loads, saves, and frees a list of items
that belong to a map. The first of the three, Load, loads and creates a list of items.
For simplicity, store all items in a text file, using the following format:


MIL_ItemNum
Quantity
XPos
YPos
ZPos
ParentID


Each item uses six lines of text, and each entry (group of six lines) is numbered
sequentially (the first item in the file is item #0, the second item is #1, and so on).
Here’s a sample file that contains two items:


// Item #0 as follows:
10 // MIL Item # (long value)
1 // Quantity (long value)
10.0 // XPos (float value)
0.0 // YPos (float value)
600.0 // ZPos (float value)
-1 // Owner (-1 = none, index # otherwise)
// Item #1 as follows:
1 // MIL Item #
1 // ...
10.0
0.0
600.0
0 // belongs to item #0 (first item in file)

The preceding comments are for clarification; the actual storage file does not use
them. When reading in a list of items such as the preceding ones, the Load function
converts the text into usable numbers. Using those numbers, it creates a sMapItem
structure for each item in the map to be loaded, constructing a linked list as the
items are loaded. After every item is read in, all objects that belong to another are
matched up (using the Parent pointer in the sMapItem structure).


There’s really nothing too difficult here, so jump right into the cMapIcs::load code:

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

    FILE* fp;

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

    
long item_index;

    sMapItemPtr item;
    sMapItemPtr item_ptr = NULL;

    
// loop forever reading in items
    while(1)
    {
        
// 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 sMapItem;

        
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->x_pos       = get_next_float(fp);
        item->y_pos       = get_next_float(fp);
        item->z_pos       = get_next_float(fp);        
        item->owner_index = 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_index == -1)
            
continue;

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

    
return true;
}

Save takes an internal list of items and, using the filename you specify, saves that list
to a file on disk. The Save function is typically used to update the game data, because
players might consistently pick up and drop items.

The Save function first assigns an index value to each sMapItem structure in the
linked list (based on their order). The first item in the linked list is 0 (zero), the
second item is 1, and so on. Each child item’s Owner variable is updated as well at
this point, and finally all data is written to a file:


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

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

    sMapItemPtr item;
    
long index = 0;

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

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

        fprintf(fp, "%lu\r\n%lu\r\n%lf\r\n%lf\r\n%lf\r\n%ld\r\n",
                item->item_index, item->quantity,
                item->x_pos, item->y_pos, item->z_pos,
                item->owner_index);
    }
    
    fclose(fp);

    
return true;
}

Finally, you use the Free function when destroying the class (thus, deleting the
linked list of items). Here’s the code for free:


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

  delete m_root_item;  
}

You’re just deleting the item linked list and getting the class ready for further use.

 

cMapIcs::Add and cMapIcs::Remove

As items are added to the map (as the result of a player dropping them, for example),
you need to call add to make sure those dropped items make it into the list of
map objects. The add function does this by first allocating a sMapItem structure, filling
it with the appropriate item information that you give it and then linking it into the
map’s list of items:

//----------------------------------------------------------------------------
// Add map item into list.
//----------------------------------------------------------------------------
void cMapIcs::add(long item_index, long quantity, 
                  
float x_pos, float y_pos, float z_pos, 
                  sMapItemPtr owner_item)
{
    sMapItemPtr item = 
new sMapItem;

    
// fill the item structure
    item->item_index = item_index;
    item->quantity   = quantity;
    item->x_pos      = x_pos;
    item->y_pos      = y_pos;
    item->z_pos      = z_pos;
    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;
}

Just as the Add function is used to add objects to the map’s list of items, you’ll need
to use Remove to remove items from a map. You call Remove using the item’s identifier
that you wish to remove from the map’s list. Remove also deletes the allocated item
structure and takes care of items that belong to the removed item:


 
//----------------------------------------------------------------------------
// Remove map item from list.
//----------------------------------------------------------------------------
void cMapIcs::remove(sMapItemPtr item)
{
    sMapItemPtr item_ptr;
    sMapItemPtr next_item;

    
// remove child objects first
    for(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;
}

 

cMapIcs::get_num_items,cMapIcs::get_parent_item,and cMapIcs::get_item

You use these three functions to retrieve the number of items that belong to the map and to retrieve the parent
sMapItem or specified item structure in the linked list. The first two of the following three functions return a single variable while the third function does the hard work by scanning through the linked list of objects, returning the specified item in the list:

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

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

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

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

    
return item;
}

 

cMapIcs類的使用

Every map in your game will have an associated list of items that belongs to it. The
map ICS will load those items and provide them to your engine whenever it needs
to render the map or add a specific item to a player’s inventory (when an item
contained in the map is picked up).


Take a look at the following code bit, which loads a sample list of items, adds a
single item, removes another item, and saves the list of items:

cMapIcs MapICS;

MapICS.load(“sample.mi”); // Load the file

// Add 1 of item # 10
MapICS.add(10, 1, 0.0f, 0.0f, 100.0f, NULL);

// Remove 2nd item from list
MapICS.remove(MapICS.GetItem(1));

// Save list back out
MapICS.save(“sample.mi”);

Although this is a simple example of modifying a map’s item list, why not go ahead
and see just how complicated it can become.


The MapICS demo (see following snap) contains the full cMapICS class and the sItem structure from the MIL edit program.  You use the map ICS and MIL to render a list of objects spread around a simple level.

The MapICS loads the map items and uses their coordinate data to draw
a generic item mesh in the scene. Whenever you approach an item, a
targeting icon appears and displays the name of the item.

NOTE
The MapICS demo allows you to walk around a simple level by using the
arrow keys and mouse.You can pick up items by standing in front of one and
pressing the left mouse button. Pressing the right mouse button
causes you to drop a random item.

Once the level is rendered out, each item in the map is scanned and drawn if in
view. The closest item is detected, and its name is printed to the screen. The code
is well commented, so you should have no problem breezing through it.

 

posted on 2007-11-07 19:28 lovedday 閱讀(307) 評論(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>
            欧美中文字幕在线播放| 国产精品sss| 亚洲精品美女久久久久| 美国成人直播| 久久精品夜色噜噜亚洲a∨| 亚洲永久网站| 欧美一区亚洲二区| 久久久久一区二区三区四区| 久久久噜噜噜久久中文字免| 免费不卡欧美自拍视频| 欧美激情一区| 一本色道久久综合亚洲精品不卡| 日韩网站在线观看| 午夜精品视频在线观看一区二区| 欧美一区三区三区高中清蜜桃 | 一本久久a久久精品亚洲| 亚洲六月丁香色婷婷综合久久| 夜夜嗨av色一区二区不卡| 亚洲伊人久久综合| 久久久久久一区二区| 欧美国产一区二区在线观看| 亚洲精品在线电影| 欧美在线一二三| 欧美精品一区在线播放| 国产精品视频自拍| 久久综合网络一区二区| 美女黄毛**国产精品啪啪| 欧美激情精品久久久久久免费印度| 欧美激情一区二区三区高清视频| 国产精品国产三级国产aⅴ浪潮| 欧美体内she精视频| 国产一区二区三区无遮挡| 一区二区欧美精品| 欧美电影在线观看| 性欧美xxxx大乳国产app| 免费国产一区二区| 韩国久久久久| 午夜日韩视频| 91久久国产综合久久| 欧美一二三视频| 欧美日韩在线精品一区二区三区| 尤物在线观看一区| 欧美在线一区二区| 一区二区三区国产精品| 欧美大片一区| 尤妮丝一区二区裸体视频| 亚洲欧美一区二区三区久久 | 国产精品亚洲激情| 一区二区欧美日韩视频| 欧美国产视频在线| 久久久久国产一区二区三区| 国产精品一二一区| 亚洲免费在线播放| 亚洲麻豆av| 欧美日韩中文字幕| 99精品久久久| 91久久精品日日躁夜夜躁欧美| 久久精品国产亚洲aⅴ| 国产女人精品视频| 欧美亚洲午夜视频在线观看| av成人手机在线| 欧美欧美天天天天操| 亚洲国产小视频在线观看| 另类欧美日韩国产在线| 欧美一区二视频在线免费观看| 国产乱码精品1区2区3区| 亚洲欧美日韩天堂| 亚洲免费一区二区| 国产香蕉97碰碰久久人人| 欧美伊人久久久久久久久影院| 99视频一区二区三区| 国产精品xvideos88| 午夜视频在线观看一区二区| 亚洲网友自拍| 国产精品一区二区视频| 久久国产主播| 久久久精彩视频| 在线观看国产日韩| 亚洲二区三区四区| 欧美日韩xxxxx| 亚洲免费在线播放| 先锋影院在线亚洲| 欧美午夜精品久久久| 午夜在线精品| 今天的高清视频免费播放成人 | 国模套图日韩精品一区二区| 久久人人97超碰国产公开结果 | 国产精品成人免费| 久久国产99| 欧美成人午夜| 一区二区国产日产| 亚洲一区二区在线视频| 韩国久久久久| 日韩午夜激情电影| 国产精品自拍视频| 免费亚洲一区二区| 欧美午夜精品一区| 久久久久久网| 欧美久久视频| 久久国产日韩| 欧美另类videos死尸| 久久精品亚洲一区二区| 欧美成人午夜剧场免费观看| 亚洲欧美高清| 免费亚洲一区| 欧美在线播放一区二区| 美女网站久久| 午夜日韩在线| 欧美激情第4页| 久久精品99| 欧美日韩另类在线| 另类av一区二区| 国产精品夫妻自拍| 欧美成人午夜剧场免费观看| 国产精品一区二区三区久久久 | 欧美高清一区| 国产欧美一区二区三区久久人妖| 欧美h视频在线| 国产精品一区二区欧美| 亚洲国产成人在线| 好吊一区二区三区| 午夜综合激情| 亚洲一区二区在线视频| 麻豆成人在线| 久久天天综合| 国产亚洲精品bv在线观看| 亚洲国产人成综合网站| 合欧美一区二区三区| 亚洲曰本av电影| 99视频在线精品国自产拍免费观看| 欧美一区二区三区在线播放| 亚洲在线日韩| 欧美日韩一区二区三区在线观看免| 免费亚洲电影| 欧美亚洲一区二区在线| 欧美一区影院| 国产日韩精品久久久| 正在播放亚洲一区| 亚洲一级电影| 欧美日韩一区不卡| 亚洲美女av在线播放| 亚洲精品一级| 欧美激情精品久久久久久久变态| 久久久久久久尹人综合网亚洲| 亚洲一卡久久| 亚洲一区二区伦理| 欧美日韩裸体免费视频| 亚洲国产欧美不卡在线观看| 亚洲破处大片| 免费不卡在线观看| 亚洲第一在线视频| 亚洲精品日韩精品| 欧美精品激情| 午夜视频在线观看一区二区| 国产日韩欧美在线| 久久久一本精品99久久精品66| 久久综合网hezyo| 亚洲国产日韩一区| 欧美日韩免费观看一区三区| 一区二区高清| 久久久亚洲成人| 亚洲韩国精品一区| 国产精品福利在线观看网址| 亚洲一区二区在线观看视频| 巨乳诱惑日韩免费av| 亚洲国产精品福利| 欧美天天综合网| 午夜精品成人在线视频| 蘑菇福利视频一区播放| 日韩午夜在线视频| 国产欧美一区二区三区久久人妖| 久久久av毛片精品| 一本久道久久综合狠狠爱| 欧美一区二区三区免费看| 亚洲国产成人av| 国产精品mm| 美女视频黄免费的久久| 一本在线高清不卡dvd| 麻豆国产精品777777在线| 亚洲最黄网站| 亚洲第一成人在线| 国产精品久久久久久久久久妞妞| 久久高清国产| 一本高清dvd不卡在线观看| 久久综合电影| 亚洲欧美成人| 亚洲靠逼com| 狠狠久久五月精品中文字幕| 欧美日韩在线播放| 久久久久久国产精品mv| 亚洲一区二区高清| 亚洲福利在线视频| 久久国产直播| 亚洲一二三区精品| 91久久久亚洲精品| 国产一区二区三区久久| 欧美视频在线观看 亚洲欧| 老司机久久99久久精品播放免费| 午夜精品免费| 正在播放日韩|