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

天行健 君子當自強而不息

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

 

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

 

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);
}
 

構造函數(shù)、析構函數(shù)

//----------------------------------------------------------------------------
// 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)  編輯 收藏 引用


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(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>
            欧美一二区视频| 欧美成人免费全部观看天天性色| 国产精品丝袜久久久久久app| 美女被久久久| 欧美福利一区| 欧美精品不卡| 欧美午夜一区二区三区免费大片 | 国产日韩一区在线| 国产欧美精品国产国产专区| 国产一区二区三区不卡在线观看| 国产视频在线一区二区| 欲色影视综合吧| 亚洲精品一二区| 亚洲欧美春色| 欧美亚洲系列| 亚洲大片精品永久免费| 亚洲国产精品成人综合| 99精品99| 久久久久久97三级| 欧美日一区二区三区在线观看国产免| 国产欧美日韩| 亚洲国产视频a| 亚洲一区二区视频在线| 久久久亚洲欧洲日产国码αv| 欧美大学生性色视频| 亚洲视频axxx| 欧美成人按摩| 国产午夜久久| 亚洲小说春色综合另类电影| 久久久国产一区二区| 亚洲精品欧美| 久久久久久网| 国产精品午夜在线观看| 亚洲国产日韩欧美在线99 | 欧美中文在线免费| 91久久久精品| 久久久精品国产99久久精品芒果| 欧美日韩亚洲一区二区三区四区| 激情91久久| 亚洲欧美日韩国产另类专区| 欧美韩日高清| 久久午夜电影| 国内精品久久久久久 | 一本到12不卡视频在线dvd| 久久精品视频在线免费观看| 欧美午夜精品一区二区三区| 最新国产乱人伦偷精品免费网站| 久久久久国产一区二区三区四区| 99日韩精品| 欧美日本国产一区| 亚洲黄色尤物视频| 另类成人小视频在线| 亚洲欧美综合一区| 国产精品一级二级三级| 亚洲尤物影院| 一本到高清视频免费精品| 欧美精品情趣视频| 亚洲欧洲综合| 亚洲国产精品久久久久久女王| 久久男人资源视频| 精品999日本| 亚洲激情精品| 欧美a级片网站| 久久久亚洲欧洲日产国码αv | 亚洲视频在线播放| 欧美日韩视频在线一区二区观看视频| 亚洲精品日韩在线| 亚洲黄页一区| 欧美日韩一区二区三区视频| 亚洲最新视频在线播放| 亚洲精品一级| 国产精品videosex极品| 亚洲在线中文字幕| 亚洲一区欧美一区| 国产原创一区二区| 麻豆av一区二区三区久久| 久久久久国产精品人| 亚洲欧洲一区二区三区在线观看 | 久久久蜜桃精品| 久久这里有精品视频| 日韩一级免费| 亚洲女女女同性video| 国内精品久久久久久久果冻传媒| 欧美二区在线观看| 欧美日韩免费观看一区三区| 午夜亚洲影视| 老司机成人网| 亚洲一区视频在线| 久久久999| 亚洲天堂成人| 久久久夜精品| 亚洲一区中文字幕在线观看| 欧美中文字幕不卡| 亚洲一级在线观看| 久久久久国内| 欧美一区二区观看视频| 久久影院午夜论| 午夜精彩视频在线观看不卡| 久久男人资源视频| 先锋影音网一区二区| 免费成人av| 欧美一区二区性| 欧美日韩午夜| 欧美xxx成人| 国产欧美一区二区三区在线老狼 | 欧美影院一区| 欧美精品日韩综合在线| 久久免费视频在线| 欧美午夜国产| 亚洲国产婷婷香蕉久久久久久99| 国产欧美精品| 亚洲少妇中出一区| 一本综合精品| 欧美成人精品激情在线观看| 久久久精品日韩欧美| 国产精品第13页| 99国产成+人+综合+亚洲欧美| 亚洲第一免费播放区| 欧美亚洲在线播放| 国产乱码精品一区二区三区不卡| 欧美激情a∨在线视频播放| 国产视频一区二区三区在线观看| 日韩视频精品| 一区二区三区.www| 欧美大片18| 欧美电影美腿模特1979在线看| 国产日韩综合一区二区性色av| 日韩视频永久免费| 一本色道久久加勒比88综合| 欧美成人首页| 亚洲国产精品小视频| 亚洲国产高清高潮精品美女| 久久久国产精品一区二区中文| 久久久精品日韩欧美| 黄色亚洲大片免费在线观看| 欧美亚洲三区| 久久九九全国免费精品观看| 国产欧美一级| 久久精品国产精品亚洲精品| 久久久91精品国产| 伊人精品成人久久综合软件| 久久国产黑丝| 欧美成人三级在线| 最新中文字幕一区二区三区| 免费观看在线综合色| 亚洲国产天堂久久综合网| 一区二区免费看| 国产精品久久久91| 香蕉久久精品日日躁夜夜躁| 久久久国产精品一区二区三区| 激情另类综合| 欧美华人在线视频| 一区二区三区不卡视频在线观看| 亚洲一级二级在线| 国产欧美日韩综合一区在线播放 | 国产精品扒开腿做爽爽爽软件| 亚洲一区二区在线观看视频| 久久国产精品一区二区三区四区| 激情六月婷婷综合| 你懂的亚洲视频| 一区二区精品| 久久久久在线观看| 亚洲六月丁香色婷婷综合久久| 欧美日韩视频在线第一区| 亚洲欧美电影院| 欧美二区在线播放| 欧美亚洲尤物久久| 亚洲国产精品欧美一二99| 欧美午夜无遮挡| 久久综合色婷婷| 亚洲一区二区三区免费在线观看 | 国产精品成人午夜| 久久高清一区| 国产精品99久久久久久宅男| 另类亚洲自拍| 亚洲神马久久| 伊人狠狠色j香婷婷综合| 欧美体内she精视频| 欧美资源在线| 亚洲视频大全| 亚洲人在线视频| 久久久蜜桃精品| 亚洲一区二区少妇| 亚洲欧洲视频| 国产最新精品精品你懂的| 欧美日韩国产综合视频在线| 久久国产精品72免费观看| 香港成人在线视频| 亚洲美女视频网| 狠狠色狠狠色综合人人| 欧美三级免费| 欧美凹凸一区二区三区视频| 亚洲综合视频在线| 日韩一区二区精品视频| 亚洲第一成人在线| 男人插女人欧美| 久久精品国产第一区二区三区最新章节 | 这里只有精品丝袜| 亚洲激情精品| 欧美大片91|