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

天行健 君子當自強而不息

游戲中物件的定義與使用(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>
            久久在线视频在线| 欧美在线关看| 亚洲无线一线二线三线区别av| 亚洲中午字幕| 亚洲精品国产精品国自产在线| 午夜久久久久| 国产精品网曝门| 亚洲天堂第二页| 亚洲国产乱码最新视频| 久久久久天天天天| 亚洲第一区中文99精品| 美女性感视频久久久| 久久激情婷婷| 国产日本亚洲高清| 午夜日韩激情| 亚洲午夜精品一区二区三区他趣| 欧美日韩国产区一| 亚洲一区二区高清视频| 亚洲午夜伦理| 国产精品综合| 久久久99精品免费观看不卡| 欧美中文在线免费| 亚洲高清在线视频| 亚洲美女视频在线观看| 国产精品v日韩精品v欧美精品网站| 亚洲一区二区免费看| 亚洲欧美国产77777| 黄页网站一区| 亚洲大胆人体视频| 欧美日韩精品高清| 香蕉久久一区二区不卡无毒影院| 亚洲女性喷水在线观看一区| 加勒比av一区二区| 亚洲国产一区二区精品专区| 欧美色另类天堂2015| 久久精品99| 欧美韩日高清| 欧美亚洲视频在线观看| 久久久久天天天天| 亚洲午夜精品| 久久狠狠久久综合桃花| 日韩视频三区| 久久国产精品亚洲va麻豆| 亚洲精品免费在线播放| 亚洲午夜激情在线| 最新69国产成人精品视频免费| 日韩视频在线观看国产| 国产一区二区三区自拍| 亚洲欧洲日本mm| 国产精品一区一区| 欧美国产日韩一区二区三区| 国产精品福利影院| 欧美护士18xxxxhd| 国产欧美一区二区三区国产幕精品| 欧美大尺度在线| 国产精品你懂的| 亚洲国产精品成人综合| 国产在线高清精品| 一本久道久久综合中文字幕| 玉米视频成人免费看| 国产精品99久久99久久久二8| 狠狠色综合色区| 亚洲综合999| 中国成人在线视频| 欧美成人官网二区| 久久亚洲精品网站| 一本综合精品| 亚洲高清激情| 国产一区二区成人| 最新国产精品拍自在线播放| 国产一区导航| 亚洲影院免费观看| 亚洲一区二区动漫| 欧美日韩不卡合集视频| 亚洲国产婷婷综合在线精品| 在线欧美亚洲| 久久久久久久国产| 久久精品国产亚洲高清剧情介绍| 欧美日韩午夜视频在线观看| 91久久精品网| 亚洲肉体裸体xxxx137| 久久先锋资源| 久久综合色8888| 一区视频在线看| 久久精品视频播放| 久久永久免费| 亚洲成色777777在线观看影院| 性欧美xxxx大乳国产app| 午夜欧美不卡精品aaaaa| 国产精品家教| 亚洲一区二区三区高清 | 欧美美女bbbb| 亚洲电影在线播放| 亚洲高清精品中出| 另类av一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 蜜臀99久久精品久久久久久软件| 久久亚洲国产成人| 在线观看精品一区| 久热精品视频在线观看| 久久久久久久一区| 国产综合色产| 久久色在线播放| 欧美黄色影院| 夜夜嗨av色一区二区不卡| 欧美剧在线免费观看网站| 日韩视频在线免费观看| 亚洲一区二区成人| 国产区精品在线观看| 欧美中日韩免费视频| 欧美高清视频www夜色资源网| 亚洲第一福利社区| 欧美久色视频| 欧美亚洲网站| 欧美v日韩v国产v| 99re8这里有精品热视频免费 | 久久全球大尺度高清视频| 狠狠入ady亚洲精品| 女生裸体视频一区二区三区| 亚洲激情在线| 欧美一区二区啪啪| 在线成人av网站| 欧美日韩成人免费| 午夜精品一区二区三区电影天堂| 久久综合久久综合久久综合| 亚洲精品午夜精品| 国产精品蜜臀在线观看| 久久一二三区| 一区二区三区免费在线观看| 欧美中文在线观看| 亚洲精品欧洲| 国产精品久久久一区二区三区| 欧美自拍偷拍午夜视频| 亚洲韩国日本中文字幕| 欧美一区二区三区在线观看| 亚洲精品中文字| 国产日韩综合一区二区性色av| 久久一区精品| 亚洲一区二区不卡免费| 欧美激情一区二区| 久久久久久久久久久久久女国产乱 | 在线视频欧美日韩精品| 久久一区二区精品| 亚洲一区二区久久| 亚洲精品中文字| 伊人夜夜躁av伊人久久| 国产精品久久影院| 欧美激情二区三区| 久久久久一区二区三区| 亚洲欧美卡通另类91av| 亚洲精选一区| 亚洲国产天堂久久综合网| 欧美不卡福利| 久久久久国产精品午夜一区| 亚洲欧美一区二区三区久久| 亚洲每日更新| 亚洲第一精品在线| 国产亚洲欧洲一区高清在线观看| 欧美日韩午夜激情| 欧美精品综合| 欧美激情导航| 欧美国产日韩一区二区在线观看 | 国产精品婷婷| 欧美四级电影网站| 欧美日韩性生活视频| 欧美超级免费视 在线| 久久精品一区二区三区四区| 午夜日韩av| 欧美一区二区三区啪啪| 亚洲欧美久久久| 欧美亚洲免费高清在线观看| 亚洲在线播放电影| 亚洲永久免费精品| 亚洲一区激情| 亚洲欧美一级二级三级| 亚洲综合另类| 欧美在线免费观看| 久久国产精品一区二区三区四区| 欧美一级免费视频| 久久久蜜桃一区二区人| 久久在线免费| 欧美成人日韩| 欧美日韩在线播放一区| 欧美性感一类影片在线播放| 麻豆亚洲精品| 久久久久久久999| 美女露胸一区二区三区| 老司机一区二区| 欧美刺激午夜性久久久久久久| 久久一区免费| 欧美日韩123| 国产精品一区免费观看| 国产综合激情| 亚洲经典自拍| 亚洲一区免费网站| 久久精品av麻豆的观看方式| 久久久久久久综合色一本| 欧美大成色www永久网站婷| 亚洲茄子视频| 亚洲图中文字幕|