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

天行健 君子當(dāng)自強(qiáng)而不息

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) 評(píng)論(0)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            曰韩精品一区二区| 国产午夜精品全部视频播放| 影音先锋亚洲精品| 久久在线免费观看视频| 欧美一区二区三区视频| 国模 一区 二区 三区| 久久男人资源视频| 久久尤物视频| 99国产精品国产精品毛片| 亚洲精品免费电影| 欧美日韩一区二区免费在线观看| 亚洲视频电影图片偷拍一区| 这里只有视频精品| 国产一区久久久| 欧美福利专区| 欧美日韩在线视频首页| 欧美一区二区三区免费在线看 | 亚洲日本在线观看| 亚洲精品国产精品国自产在线| 欧美黄污视频| 午夜精品久久久久久久99黑人| 欧美在线一级va免费观看| 亚洲国产精彩中文乱码av在线播放| 亚洲人成网在线播放| 国产精品视频免费一区| 蜜桃久久av一区| 国产精品久久二区二区| 久久天天综合| 欧美午夜一区二区三区免费大片| 久久久福利视频| 欧美欧美天天天天操| 久久久无码精品亚洲日韩按摩| 欧美国产欧美亚洲国产日韩mv天天看完整 | 妖精成人www高清在线观看| 国产精品日韩一区二区三区| 欧美.www| 国产模特精品视频久久久久 | 欧美一区二粉嫩精品国产一线天| 久久精品国产亚洲高清剧情介绍| 99re热这里只有精品视频| 午夜精品一区二区三区电影天堂 | 午夜国产一区| 欧美风情在线| 蜜桃av综合| 国产乱码精品一区二区三区不卡 | 日韩天堂在线视频| 伊人春色精品| 性娇小13――14欧美| 日韩亚洲综合在线| 另类图片国产| 久久亚洲综合色| 国产嫩草一区二区三区在线观看| 亚洲电影第1页| 国产综合自拍| 午夜精品久久久久99热蜜桃导演| 亚洲视频网站在线观看| 老司机午夜精品视频在线观看| 久久精品国产免费观看| 国产精品捆绑调教| 日韩图片一区| 国产精品99久久久久久白浆小说| 免费观看在线综合色| 免费观看在线综合| 黄色亚洲在线| 久久精品人人做人人爽| 欧美在线视频免费播放| 国产模特精品视频久久久久 | 国产伦精品一区二区三区视频黑人 | 国产欧美亚洲一区| 亚洲自拍电影| 欧美一区二区精美| 国产精品资源| 久久动漫亚洲| 免费看亚洲片| 亚洲青色在线| 欧美伦理91| 一本大道久久a久久综合婷婷| 99国产精品自拍| 欧美日韩成人在线观看| 亚洲精品一区二区在线| 夜夜嗨av一区二区三区中文字幕| 欧美激情一区二区三区在线视频观看 | 欧美国产精品日韩| 91久久精品美女高潮| 欧美极品欧美精品欧美视频| 亚洲人成人一区二区三区| 一区二区三区四区五区精品| 欧美日韩国产麻豆| 亚洲午夜极品| 久久午夜精品| 亚洲巨乳在线| 国产精品成人观看视频免费| 亚洲在线视频网站| 老司机精品视频网站| 亚洲精品日日夜夜| 国产精品九九| 欧美一区二视频在线免费观看| 久久一本综合频道| 日韩视频免费在线观看| 国产精品视频精品| 久久综合福利| 一本色道久久综合一区| 久久久久一区| 一区二区av在线| 国产一区二区欧美日韩| 欧美v国产在线一区二区三区| 日韩一级黄色片| 久久婷婷国产综合尤物精品| 日韩视频中文| 国产一区二区三区高清| 欧美理论电影在线播放| 欧美一级淫片aaaaaaa视频| 欧美激情在线免费观看| 午夜精品在线看| 亚洲激情不卡| 国产亚洲综合精品| 欧美日韩一二区| 久久综合影音| 先锋影音网一区二区| 亚洲全部视频| 免费视频久久| 久久精品国产一区二区三| 日韩图片一区| 精品成人在线| 国产亚洲精品一区二区| 欧美午夜免费电影| 欧美承认网站| 久久尤物视频| 欧美在线三区| 午夜久久久久| 亚洲影院色无极综合| 亚洲毛片在线| 亚洲三级影片| 亚洲国产日韩在线一区模特| 久久久人人人| 久久久久久国产精品一区| 亚洲一线二线三线久久久| 99精品视频免费观看视频| 亚洲第一中文字幕| 韩国在线一区| 在线精品福利| 在线免费观看视频一区| 精品盗摄一区二区三区| 国内自拍一区| 极品尤物一区二区三区| 国语自产精品视频在线看8查询8| 国产视频观看一区| 国产日产亚洲精品系列| 国产日产欧美a一级在线| 国产精品一区免费视频| 国产人成精品一区二区三| 国产精品每日更新在线播放网址| 欧美日韩在线综合| 国产精品www994| 国产精品推荐精品| 国产欧美日韩精品丝袜高跟鞋| 国产精品久久午夜| 国产美女精品| 黄色国产精品一区二区三区| 影音先锋中文字幕一区| 最新成人av在线| 一本一道久久综合狠狠老精东影业| 一区二区欧美国产| 亚洲摸下面视频| 久久精品视频导航| 免费黄网站欧美| 亚洲激情在线激情| 亚洲图片自拍偷拍| 欧美在线视频一区二区| 老司机aⅴ在线精品导航| 欧美精品亚洲| 国产精品视频网址| 一区二区亚洲| 国产精品99久久久久久久久久久久 | 欧美大片一区二区| 欧美特黄视频| 国内成+人亚洲| 99在线精品视频在线观看| 亚洲欧美激情一区二区| 久久久久一区二区三区| 亚洲国产综合在线看不卡| 亚洲一区二区三区在线观看视频 | 99精品国产在热久久下载| 亚洲影院色在线观看免费| 久久一区二区三区国产精品| 欧美另类综合| 激情欧美国产欧美| 亚洲影院污污.| 欧美~级网站不卡| 亚洲一区二区三区四区五区午夜| 久久夜色精品国产亚洲aⅴ| 欧美图区在线视频| 亚洲国产老妈| 久久激情网站| 99在线|亚洲一区二区| 久久在线免费| 国产乱码精品一区二区三区忘忧草 | 欧美视频四区| 亚洲黄页视频免费观看| 久久激情五月婷婷|