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

天行健 君子當自強而不息

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 閱讀(220) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(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>
            国产精品久久久久一区二区三区共 | 久久综合伊人77777尤物| 国产欧美日韩精品a在线观看| 亚洲天堂男人| 亚洲网站视频| 国产亚洲午夜高清国产拍精品| 久久免费视频在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲人体1000| 在线视频欧美日韩精品| 国产午夜精品麻豆| 欧美二区视频| 久久精品一本| 久久精精品视频| 亚洲日韩欧美视频| 亚洲色图综合久久| 黑人巨大精品欧美一区二区小视频 | 欧美一区二区三区日韩视频| 欧美一区二区三区视频免费播放 | 亚洲国产经典视频| 亚洲免费激情| 国产视频亚洲| 亚洲欧洲日韩在线| 国产精品wwwwww| 久久综合影视| 欧美日韩一区二区精品| 久久久国际精品| 欧美日韩国产综合视频在线观看| 欧美一区二区三区四区在线观看| 蜜臀久久久99精品久久久久久| 一二三区精品福利视频| 欧美专区日韩专区| 一区电影在线观看| 久久免费少妇高潮久久精品99| 一个色综合av| 久久午夜视频| 久久精品夜色噜噜亚洲aⅴ| 欧美激情免费观看| 美女主播视频一区| 国产农村妇女精品| 亚洲精品黄网在线观看| 韩日精品在线| 一区二区欧美在线| 最新亚洲电影| 久久久久久午夜| 久久国产高清| 欧美视频日韩| 亚洲狼人综合| 亚洲国产一二三| 久久蜜臀精品av| 性8sex亚洲区入口| 欧美性jizz18性欧美| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲欧美日韩国产一区二区三区| 欧美成年人视频网站| 久久女同互慰一区二区三区| 国产欧美日韩一区二区三区在线| 一区二区欧美视频| 亚洲一区二区三区在线视频| 欧美日韩亚洲国产精品| 亚洲人成欧美中文字幕| 亚洲精品欧美| 欧美激情免费观看| 亚洲精品一区二区三区福利| 亚洲免费中文字幕| 亚洲天堂av电影| 亚洲精品国产日韩| 91久久夜色精品国产九色| 久久www成人_看片免费不卡| 午夜欧美理论片| 国产精品呻吟| 亚洲欧美日韩视频一区| 性欧美超级视频| 国产欧美91| 欧美在线视频免费观看| 久久久久久久综合| 在线国产亚洲欧美| 欧美成人日韩| 99riav国产精品| 亚洲欧美一区二区三区在线| 国产精品亚洲аv天堂网| 亚洲欧美综合精品久久成人| 欧美在线视频一区二区三区| 激情亚洲网站| 欧美成人中文字幕在线| 一本大道av伊人久久综合| 午夜视频一区二区| 狠色狠色综合久久| 欧美sm视频| 亚洲图片在线| 六月婷婷一区| 艳妇臀荡乳欲伦亚洲一区| 国产精品久久久久影院色老大 | 久久国产精彩视频| 亚洲欧洲日本国产| 国产精品劲爆视频| 久久久久久久尹人综合网亚洲 | 午夜视频在线观看一区二区三区| 国产色婷婷国产综合在线理论片a| 欧美一级在线视频| 亚洲高清久久| 欧美亚洲一区二区在线| 亚洲国产另类精品专区| 国产精品国产三级国产专播精品人| 性色av一区二区怡红| 亚洲国产日韩欧美| 久久精品99无色码中文字幕| 日韩午夜在线视频| 激情欧美国产欧美| 欧美午夜精品久久久| 美女久久网站| 亚洲欧美日韩在线不卡| 亚洲福利视频一区| 久久久精品午夜少妇| 亚洲在线一区二区三区| 亚洲国产视频一区| 国内伊人久久久久久网站视频| 欧美人在线观看| 久久一区中文字幕| 欧美在线播放高清精品| 一区二区三区色| 亚洲国内在线| 久久综合狠狠综合久久综合88| 亚洲网站视频| 99精品欧美一区二区三区综合在线 | 欧美1区免费| 久久精品夜色噜噜亚洲a∨| 在线一区二区三区四区五区| 91久久精品国产91性色tv| 欧美成人黑人xx视频免费观看| 久久av资源网站| 亚洲欧美精品在线观看| 亚洲午夜激情| 日韩一区二区免费高清| 亚洲人体影院| 91久久嫩草影院一区二区| 在线成人h网| 在线观看视频亚洲| 一区二区三区自拍| 一区二区视频免费在线观看| 国产一区二区精品丝袜| 国产专区综合网| 国产主播精品| 激情欧美日韩| 亚洲欧洲精品成人久久奇米网 | 在线免费观看欧美| 亚洲第一在线| 亚洲精品综合在线| 一本久道久久综合狠狠爱| 中文av一区二区| 亚洲欧美自拍偷拍| 久久er精品视频| 久久亚洲欧美| 欧美大香线蕉线伊人久久国产精品| 男男成人高潮片免费网站| 模特精品在线| 亚洲精品久久久久久下一站 | 亚洲宅男天堂在线观看无病毒| 亚洲曰本av电影| 欧美一区二区三区婷婷月色| 欧美亚洲一级片| 六十路精品视频| 欧美日韩精品综合在线| 国产精品a级| 激情综合色综合久久| 亚洲精品中文在线| 亚洲永久精品国产| 毛片基地黄久久久久久天堂| 亚洲国产乱码最新视频| 亚洲性感激情| 久久一区二区三区超碰国产精品| 欧美精品久久久久久久久久| 国产精品乱人伦一区二区| 国际精品欧美精品| 夜夜狂射影院欧美极品| 欧美自拍偷拍午夜视频| 亚洲国产va精品久久久不卡综合| 一区二区电影免费观看| 久久久97精品| 欧美视频一区二区三区在线观看| 国产亚洲美州欧州综合国| 亚洲麻豆视频| 久久精品视频在线看| 日韩亚洲欧美高清| 久久久另类综合| 欧美日韩久久| 亚洲韩国一区二区三区| 欧美一级片在线播放| 最新热久久免费视频| 久久国产精品99国产| 国产精品日韩久久久久| 99re热这里只有精品免费视频| 久久精品99国产精品| 中文亚洲视频在线| 欧美精品v日韩精品v韩国精品v| 国产专区欧美精品| 亚洲欧美日韩中文播放| 亚洲国产日韩欧美| 久久综合色88| 狠狠干综合网|