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

天行健 君子當(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>
            欧美电影打屁股sp| 免费成人av在线| 蜜臀av性久久久久蜜臀aⅴ| 亚洲影院色在线观看免费| 欧美视频官网| 亚洲欧美日韩直播| 先锋影院在线亚洲| 亚洲国产另类久久久精品极度| 欧美成人综合在线| 欧美日韩日本国产亚洲在线| 午夜国产欧美理论在线播放| 亚洲免费视频网站| 国产夜色精品一区二区av| 欧美一级网站| 久久国产夜色精品鲁鲁99| 国产三级精品三级| 亚洲欧美日韩成人高清在线一区| 欧美精品久久久久久| 久久影视精品| 欧美成人免费一级人片100| 在线观看一区欧美| 欧美成人小视频| 欧美成人国产va精品日本一级| 亚洲卡通欧美制服中文| 亚洲国产精品久久久久久女王| 欧美chengren| 久久国产精品99精品国产| 麻豆久久精品| 久久精品99国产精品| 欧美高清视频在线播放| 欧美一区二区在线| 欧美精品一级| 久久这里只有| 欧美日韩久久| 欧美+日本+国产+在线a∨观看| 国产精品久久久久一区二区三区| 欧美国产日韩一区二区三区| 国产精品亚洲成人| 99成人在线| 亚洲人www| 久久午夜电影| 欧美诱惑福利视频| 欧美日韩亚洲一区| 欧美激情精品久久久久久| 欧美国产日韩一区二区在线观看| 夜夜精品视频一区二区| 久久久久国产一区二区三区| 欧美一区二区啪啪| 欧美日韩dvd在线观看| 欧美一级二区| 国产精品久久久久久久一区探花| 亚洲成人在线视频播放 | 久久精品伊人| 欧美二区在线| 午夜老司机精品| 免费在线一区二区| 久久久久久久久久久久久女国产乱| 欧美福利一区二区| 亚洲福利小视频| 亚洲第一精品影视| 欧美一级视频精品观看| 亚洲亚洲精品三区日韩精品在线视频| 欧美激情欧美激情在线五月| 欧美激情一区二区三区| 亚洲国产精品久久久久婷婷884| 亚洲男人的天堂在线aⅴ视频| 艳女tv在线观看国产一区| 久久九九免费| 欧美有码在线观看视频| 国产美女在线精品免费观看| 亚洲人人精品| 亚洲美女免费视频| 欧美成人69| 欧美风情在线观看| 狠狠色综合网| 欧美在线不卡视频| 久久se精品一区精品二区| 国产精品久久久久久久久久免费看 | 久久久夜精品| 国产精品视频九色porn| 亚洲一区中文| 香蕉成人久久| 国产亚洲精品一区二555| 午夜精品久久久久| 欧美中文在线观看国产| 国产欧美一区二区精品仙草咪| 久久天堂成人| 国产亚洲欧洲一区高清在线观看| 欧美在线关看| 欧美成人首页| 亚洲精品综合| 国产精品久久久久久av福利软件 | 久久乐国产精品| 亚洲国产精品第一区二区三区| 亚洲少妇自拍| 在线播放中文一区| 欧美日韩在线不卡| 久久xxxx| 亚洲乱码国产乱码精品精| 欧美一区二区视频在线观看| 亚洲国产第一| 国产精品极品美女粉嫩高清在线| 欧美一级片久久久久久久| 亚洲精品国产无天堂网2021| 欧美一区成人| 一本一本久久| 红桃视频欧美| 国产精品久久久久免费a∨| 久久婷婷久久| 在线一区日本视频| 亚洲高清在线观看一区| 久久电影一区| 99视频精品| 亚洲国产精品一区二区第一页 | 每日更新成人在线视频| 亚洲男人的天堂在线观看| 亚洲国产日韩欧美综合久久| 久久久久久久久久看片| 亚洲欧美精品在线观看| 亚洲精品一品区二品区三品区| 国产一区观看| 国产精品v欧美精品v日韩精品| 久久视频一区| 久久国产一区二区| 性色av香蕉一区二区| 亚洲婷婷在线| 一区二区动漫| 夜夜夜久久久| 亚洲精品久久久一区二区三区| 久久人人97超碰精品888| 亚洲一级黄色| 一区二区三区四区五区视频 | 好看的日韩视频| 国产午夜久久久久| 国产精品区二区三区日本| 欧美天堂亚洲电影院在线观看| 欧美激情综合网| 欧美激情在线狂野欧美精品| 欧美大片免费看| 欧美国产日韩一区二区在线观看| 免费久久99精品国产自| 美女精品网站| 美女尤物久久精品| 美女网站久久| 欧美激情一区二区三区| 欧美噜噜久久久xxx| 欧美人与禽性xxxxx杂性| 欧美精品日韩一区| 欧美视频在线一区| 国产久一道中文一区| 国产午夜精品美女毛片视频| 国内精品久久久久久| 亚洲电影自拍| 日韩视频在线观看一区二区| 亚洲少妇在线| 欧美与黑人午夜性猛交久久久| 久久久999精品视频| 久久久久一本一区二区青青蜜月| 久久精品理论片| 欧美国产精品v| 亚洲精品国久久99热| 亚洲视频二区| 久久精品人人爽| 欧美成人自拍视频| 欧美午夜精品久久久久久人妖| 国产欧美日韩在线播放| 精品白丝av| 亚洲专区在线视频| 久久免费视频在线| 亚洲人成在线观看| 亚洲欧美日韩精品| 欧美成在线观看| 国产精品美女久久久久久免费 | 国产一区二区三区黄| 亚洲区国产区| 欧美一区二区视频免费观看| 欧美高清视频免费观看| 一区二区福利| 麻豆久久精品| 国产婷婷97碰碰久久人人蜜臀| 亚洲第一页在线| 午夜国产精品影院在线观看 | 欧美一区在线直播| 亚洲二区免费| 欧美中文字幕在线观看| 欧美另类女人| 亚洲第一中文字幕在线观看| 亚洲在线视频| 亚洲欧洲日夜超级视频| 欧美在线视频不卡| 欧美网站在线观看| 亚洲区欧美区| 久久综合999| 亚洲欧美韩国| 欧美日韩在线免费| 亚洲欧洲日本mm| 久久久久久久成人| 亚洲综合国产| 欧美三级不卡| 一区二区三区四区在线|