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

天行健 君子當自強而不息

Controlling Players and Characters(34)

Once it is determined what action each character wants to perform, that action
must be validated. Characters moving around can’t walk through other players
(except for PCs, who can walk through other PCs). Also, depending on your levels,
you use a function to determine character-to-map collisions. These two validation
functions are as follows:

///////////////////////////////////////////////////////////////////////////////////////////////////

bool cCharController::check_move(sCharacter* character, float* x_move, float* y_move, float* z_move)
{    
    
if(character == NULL)
        
return false;

    
float pos_x = character->pos_x + (*x_move);
    
float pos_y = character->pos_y + (*y_move);
    
float pos_z = character->pos_z + (*z_move);

    
float min_x, min_z, max_x, max_z;

    character->
object.get_bounds(&min_x, NULL, &min_z, &max_x, NULL, &max_z, NULL);
    
float radius1 = max(max_x - min_x, max_z - min_z) * 0.5;

    
// check movement against other characters
    for(sCharacter* char_ptr = m_root_char; char_ptr != NULL; char_ptr = char_ptr->next)
    {
        
// do not check against self or disabled characters
        if(character != char_ptr && char_ptr->update_enable)
        {
            
// do not check against other PC characters
            if(character->type == CHAR_PC && char_ptr->type == CHAR_PC)
                
break;

            
// get distance between characters
            float x_diff = fabs(pos_x - char_ptr->pos_x);
            
float y_diff = fabs(pos_y - char_ptr->pos_y);
            
float z_diff = fabs(pos_z - char_ptr->pos_z);

            
float dist = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff;

            char_ptr->
object.get_bounds(&min_x, NULL, &min_z, &max_x, NULL, &max_z, NULL);
            
float radius2 = max(max_x - min_x, max_z - min_z) * 0.5f;

            
// do not allow movement if intersecting
            if(dist <= (radius1 * radius1 + radius2 * radius2))
                
return false;
        }        
    }

    
// check custom collisions (map, etc)
    return validate_move(character, x_move, y_move, z_move);
}

///////////////////////////////////////////////////////////////////////////////////////////////////

virtual bool validate_move(sCharacter* character, float* x_move, float* y_move, float* z_move)
{
        
// validate for outside bounds checking against character movements.

        
return true;
}

Both of the preceding functions (check_move and validate_move) take a pointer to the
character being updated, as well as the character’s intended amount of movement
in each direction. Each function modifies these values appropriately. When the
character’s moves and actions have been validated, another function wraps up the
actions and actually updates the character positions and actions.


///////////////////////////////////////////////////////////////////////////////////////////////////

void cCharController::process_update(sCharacter* character, float x_move, float y_move, float z_move)
{
    
// move character
    character->pos_x += x_move;
    character->pos_y += y_move;
    character->pos_z += z_move;        

    
// move object and point in direction
    character->object.move(character->pos_x, character->pos_y, character->pos_z);
    character->
object.rotate(0.0f, character->direction, 0.0f);

    
// set new animation
    if(character->last_anim != character->action)
    {
        character->last_anim = character->action;

        
if(m_num_char_anim != 0 && m_char_anim)
        {
            character->last_anim_time = timeGetTime() / 30;

            character->
object.set_anim_set(
                &m_mesh_anim[character->char_def.mesh_index].anim,
                m_char_anim[character->action].name,
                character->last_anim_time);
        }
    }
}

Whenever characters start battling it out, some are sure to die. The controller can
quickly handle dying NPCs and monsters by removing their respective structures
from the list. As for PCs though, death can mean the end of the game, so it’s up to
the main application to handle them. That’s the reasoning behind pc_death, which
takes a single argument, the pointer to the dying PC:

virtual void pc_death(sCharacter* character)
{
}

Speaking of characters dying, any time a monster dies, it has a chance of dropping
an item, as well as all the money it is carrying. Because your main application handles
all items in the maps, it’s your job to determine when a monster drops an item
or gold and to add the appropriate item to the map’s list of items. Overriding the
following two functions will help you out anytime a monster drops something by
giving you the exact coordinates where the monster perished, the item dropped,
and the amount of money dropped.

virtual bool drop_money(float pos_x, float pos_y, float pos_z, long quantity)
{
  return true;
}

virtual bool drop_item(float pos_x, float pos_y, float pos_z, long item_index)
{
  return true;
}


posted on 2007-12-04 16:47 lovedday 閱讀(227) 評論(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>
            久久综合亚州| 亚洲欧美在线高清| 老司机精品视频一区二区三区| 狠狠爱综合网| 你懂的亚洲视频| 免费不卡在线观看| 一本综合久久| 中文国产成人精品| 好看不卡的中文字幕| 欧美国产精品日韩| 欧美日韩高清一区| 久久久国产精品一区| 久久久女女女女999久久| 亚洲激情第一页| 亚洲欧美日韩精品一区二区| 欧美日韩中文字幕在线| 欧美尤物一区| 玖玖玖国产精品| 夜夜嗨av一区二区三区中文字幕 | 欧美中文字幕视频| 亚洲国产免费| 亚洲先锋成人| 亚洲国产精品一区制服丝袜| 日韩亚洲国产精品| 国产亚洲一区二区在线观看| 亚洲成色精品| 国产精品女主播在线观看| 久久综合狠狠综合久久激情| 欧美日韩国产三区| 免费成人黄色片| 国产精品久久久久久久久久久久| 蜜桃精品久久久久久久免费影院| 欧美四级电影网站| 欧美激情一二三区| 国产欧美日韩三级| 亚洲七七久久综合桃花剧情介绍| 国产偷国产偷亚洲高清97cao | 欧美国产国产综合| 国产精品一区二区三区免费观看| 欧美激情性爽国产精品17p| 国产精品卡一卡二| 亚洲精品一二| 亚洲日本在线视频观看| 欧美一区二区三区电影在线观看| 亚洲少妇最新在线视频| 欧美国产激情| 欧美激情亚洲| 1024成人| 久久久久久久一区| 久久久久久久国产| 国产丝袜一区二区| 亚洲欧美成人在线| 亚洲欧美日韩一区二区| 欧美美女福利视频| 亚洲黄色一区二区三区| 在线免费一区三区| 久久精品视频在线| 快射av在线播放一区| 国产伪娘ts一区| 欧美影院精品一区| 久久国产日韩欧美| 国产亚洲精品久久久久婷婷瑜伽| 亚洲一区网站| 久久精品午夜| 国产一区二区三区黄| 久久成人精品| 美女脱光内衣内裤视频久久影院 | 欧美r片在线| 亚洲第一精品在线| 六月婷婷一区| 亚洲欧洲在线播放| 亚洲一区二区四区| 国产精品成人久久久久| 亚洲一区二区三区四区在线观看| 亚洲在线网站| 国产欧美日韩另类一区| 久久精品国产99精品国产亚洲性色| 久久久久久欧美| 永久免费精品影视网站| 麻豆久久久9性大片| 亚洲国产精品成人综合色在线婷婷| 亚洲精品日韩在线观看| 欧美色精品在线视频| 夜夜躁日日躁狠狠久久88av| 欧美一区三区二区在线观看| 国产亚洲精品自拍| 欧美成人午夜激情| 亚洲精品系列| 久久精品一区二区三区中文字幕| 精品999久久久| 欧美剧在线免费观看网站| 中日韩美女免费视频网址在线观看 | 亚洲精品偷拍| 久久成人资源| 亚洲人成亚洲人成在线观看| 欧美日本中文字幕| 欧美亚洲一区二区在线| 亚洲黄色免费网站| 欧美一级一区| 亚洲精品在线一区二区| 国产精品手机在线| 欧美好吊妞视频| 亚洲综合欧美| 亚洲国产精品日韩| 久久精品国产96久久久香蕉| 日韩亚洲欧美一区| 国产一区二区三区四区老人| 欧美日韩精品一区二区| 久久视频国产精品免费视频在线| 亚洲美女在线看| 久久视频免费观看| 亚洲性感美女99在线| 激情欧美丁香| 国产精品综合不卡av| 欧美日韩国产成人在线免费| 欧美在线视频网站| 99视频有精品| 91久久久精品| 免费在线成人av| 久久精品99国产精品| 一区二区久久久久| 亚洲国产综合在线| 韩国三级电影一区二区| 国产精品人人做人人爽| 欧美精品久久一区二区| 久久蜜臀精品av| 欧美在线观看视频一区二区三区| 亚洲免费av电影| 欧美电影在线观看| 裸体一区二区| 久久精品99国产精品日本| 亚洲欧美日韩国产综合在线| 夜夜嗨一区二区| 99热在这里有精品免费| 亚洲高清视频在线观看| 韩日视频一区| 国模套图日韩精品一区二区| 国产欧美日本| 国产欧美日韩视频一区二区| 国产精品久久久久久久久婷婷| 欧美日韩免费视频| 欧美日韩精品免费观看视频完整 | 欧美一级电影久久| 亚洲欧美日韩精品久久久| 亚洲午夜免费视频| 亚洲天堂久久| 午夜激情久久久| 小黄鸭视频精品导航| 午夜精品www| 久久精品国产免费观看| 久久亚洲国产成人| 蜜桃精品久久久久久久免费影院| 模特精品在线| 欧美激情精品久久久久久大尺度 | 欧美三级不卡| 国产精品国产三级国产专播精品人 | 99国产精品久久久久久久久久| 日韩一级黄色av| 亚洲欧美日韩国产一区二区| 午夜精品福利视频| 久久久久久九九九九| 久久精品夜色噜噜亚洲aⅴ| 久久亚洲春色中文字幕| 欧美电影免费观看| 欧美日韩中国免费专区在线看| 国产精品国产一区二区| 国产九九精品| 91久久精品美女高潮| 中文精品99久久国产香蕉| 欧美伊人久久大香线蕉综合69| 久久深夜福利免费观看| 亚洲高清视频的网址| 中文一区二区| 久久久久久香蕉网| 欧美日韩国产麻豆| 国产午夜精品麻豆| 亚洲九九爱视频| 欧美在线看片| 亚洲国产精品一区二区尤物区| 亚洲先锋成人| 欧美国产激情| 韩国美女久久| 亚洲综合色激情五月| 欧美国产高潮xxxx1819| 亚洲永久免费av| 欧美成人四级电影| 国产日韩欧美综合精品| 日韩视频在线观看| 久久久久久九九九九| 亚洲精品影视在线观看| 久久久xxx| 国产精品久久久亚洲一区| 亚洲精品欧美一区二区三区| 久久精品九九| 亚洲一区二区免费在线| 欧美精品自拍| 亚洲青涩在线| 免费国产自线拍一欧美视频| 一本色道久久综合狠狠躁篇的优点| 久久久夜夜夜|