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

天行健 君子當自強而不息

游戲中物件的定義與使用(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 閱讀(308) 評論(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>
            国内自拍亚洲| 欧美成人69av| 久久gogo国模啪啪人体图| 亚洲男人影院| 欧美主播一区二区三区美女 久久精品人 | 欧美成人免费播放| 欧美激情小视频| 亚洲午夜精品久久| 欧美专区18| 亚洲精品少妇网址| 欧美一区二区播放| 日韩视频精品| 久久综合色播五月| 国产精品另类一区| 日韩视频二区| 欧美韩国日本一区| 欧美精品少妇一区二区三区| 国内精品久久久久久久影视麻豆| 国模大胆一区二区三区| 欧美成人精品在线播放| 免费久久99精品国产自| 国内精品视频一区| 一区二区激情| 欧美激情一区二区久久久| 久久狠狠亚洲综合| 亚洲第一主播视频| 欧美日韩精品福利| 亚洲美女性视频| 欧美永久精品| 亚洲在线中文字幕| 亚洲私人黄色宅男| 一本色道久久加勒比精品| 欧美激情精品久久久久久黑人| 欧美久久在线| 久久99在线观看| 亚洲一区二区三区国产| 国产精品一区二区久久| 亚洲欧美日韩中文视频| 久久国产高清| 一本色道久久| 欧美视频免费在线| 免费欧美日韩| 国产精品久久久久三级| 一本久久青青| 久久久久久久久久久一区| 欧美亚洲一区二区在线观看| 亚洲乱码日产精品bd| 久久人91精品久久久久久不卡| 亚洲激情校园春色| 欧美在线视屏| 欧美激情中文字幕一区二区| 亚洲国产精品999| 亚洲一区二区三区精品动漫| 久久成人18免费观看| 在线看片日韩| 欧美三日本三级少妇三2023 | 9i看片成人免费高清| 国产精品毛片va一区二区三区| 欧美尤物巨大精品爽| 亚洲第一黄色网| 亚洲黄色免费| 国产精品久久国产三级国电话系列| 久久最新视频| 亚洲人成网站777色婷婷| 久久九九精品| 久久精品女人的天堂av| 99re6这里只有精品视频在线观看| 久久av最新网址| 亚洲欧美日韩直播| 久久久亚洲国产美女国产盗摄| 国产精品久久久久久久久久免费 | 日韩亚洲精品电影| 91久久精品国产91性色tv| 激情久久久久久久| 亚洲最黄网站| 久久成人羞羞网站| 久久国产精品久久久久久| 亚洲视频精品在线| 国产日本欧美一区二区三区在线| 亚洲一区二区视频在线| 一本色道久久88综合亚洲精品ⅰ| 麻豆久久婷婷| 欧美福利在线观看| 亚洲精品久久久一区二区三区| 亚洲激情在线视频| 亚洲精品1区2区| 亚洲一区二区免费在线| 在线观看91精品国产入口| 欧美日韩性视频在线| 久久亚洲综合网| 欧美理论在线播放| 国产亚洲毛片| 国产精品国色综合久久| 国产性色一区二区| 国产热re99久久6国产精品| 国外视频精品毛片| 亚洲三级色网| 国产一区二区看久久| 国产综合激情| 亚洲自拍偷拍福利| 欧美大片免费看| 亚洲天堂成人| 欧美日韩天天操| 亚洲大胆人体视频| 久久久久成人精品| 亚洲视频每日更新| 欧美大片一区二区| 久久精品99国产精品酒店日本| 欧美天天视频| 亚洲免费在线看| 一区二区三区精品国产| 欧美日韩国内自拍| 一区二区日韩免费看| 欧美一区二区三区日韩视频| 99国产精品久久久| 国产精品女主播一区二区三区| 一区二区三区精密机械公司| 亚洲国产精品精华液网站| 免费在线观看日韩欧美| 亚洲精品一区二区三区福利| 亚洲大片在线| 国产精品萝li| 久久先锋影音av| 99国产精品国产精品毛片| 国产精品扒开腿做爽爽爽视频| 曰韩精品一区二区| 亚洲精品视频免费在线观看| 欧美一区2区视频在线观看| 韩国精品一区二区三区| 亚洲黄色天堂| 国产在线观看一区| 亚洲黄色影片| 狠久久av成人天堂| 中文国产一区| 99精品国产在热久久婷婷| 亚洲性感激情| 中日韩在线视频| 欧美91大片| 久久综合电影| 国产一区二区中文| 一本色道久久99精品综合| 亚洲精品123区| 国内揄拍国内精品少妇国语| 亚洲国产欧美一区二区三区久久| 欧美涩涩视频| 亚洲第一网站免费视频| 一区视频在线看| 久久精品国产2020观看福利| 一区二区三区精品国产| 欧美岛国在线观看| 欧美国产大片| 99视频有精品| 欧美日韩国内自拍| 一本一本大道香蕉久在线精品| 亚洲精品在线二区| 欧美日韩在线三区| 亚洲网友自拍| 亚洲欧美影院| 欧美在线观看视频| 久久久久久夜| 亚洲精品视频免费观看| 欧美日韩国产综合一区二区| 亚洲美女区一区| 久久av二区| 亚洲国产成人精品久久久国产成人一区 | 国产精品爽爽ⅴa在线观看| 蜜臀va亚洲va欧美va天堂| 日韩视频一区| 国产午夜精品理论片a级探花| 久久久www成人免费精品| 亚洲国产乱码最新视频| 欧美亚洲系列| 欧美日韩一区国产| 另类图片综合电影| 亚洲午夜国产一区99re久久| 欧美成人午夜影院| 性欧美1819sex性高清| 亚洲人线精品午夜| 黄色成人91| 国产午夜精品久久久| 欧美精品一区二区三区视频| av成人天堂| 亚洲精品黄色| 亚洲国产天堂久久综合网| 小黄鸭视频精品导航| 中文国产亚洲喷潮| 日韩视频不卡| 亚洲一卡久久| 亚洲免费一级电影| 亚洲网址在线| 午夜久久久久久| 先锋亚洲精品| 久久精品久久99精品久久| 久久精品午夜| 欧美黄色免费网站| 亚洲第一精品夜夜躁人人爽| 久久蜜臀精品av| 免费在线看一区| 亚洲精品在线视频观看| 亚洲美女精品一区|