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

天行健 君子當自強而不息

Putting Together a Full Game(12)

 

status_frame:

You use the status_frame function to display the player's statistics (health points,
mana points, known spells, and so on) when the player's status window is displayed.
This function handles equipping items and checking on the player's statistics.

void status_frame(void* data, long purpose)
{
    
if(purpose == SHUTDOWN_PURPOSE)
        
return;

    cApp* app = (cApp*) data;

    
if(purpose == INIT_PURPOSE)
    {
        app->m_text_header.set_text("Status", COLOR_WHITE);
        app->m_text_window.set_text("", COLOR_WHITE);
    }
    
else    // process a frame of status screen
    {
        
// exit screen if ESC or right mouse button pressed
        if(app->m_keyboard.get_key_state(KEY_ESC) || app->m_mouse.get_button_state(MOUSE_RBUTTON))
        {
            app->m_keyboard.m_locks[KEY_ESC]    = 
true;
            app->m_mouse.m_locks[MOUSE_RBUTTON] = 
true;

            app->m_state_manager.pop(app);
            
return;
        }

        sCharDef& char_def = g_player->char_def;

        
// determine which item is selected with mouse

        
long sel = app->m_mouse.get_y_pos() - STATUS_TOP_HEIGHT;

        
if(sel >= 0)
            sel /= STATUS_MENU_HEIGHT;

        
// see if click on item to use or equip
        if(app->m_mouse.get_button_state(MOUSE_LBUTTON))
        {
            app->m_mouse.m_locks[MOUSE_LBUTTON] = 
true;

            
// see which item was clicked
            if(sel >= 0 && sel < g_player->char_ics->get_num_items())
            {
                sCharItem* char_item = g_player->char_ics->get_item(sel);
                
bool is_consume = false;
                
bool is_equip_now;

                
// determine what to do with item
                switch(app->m_mil[char_item->item_index].category)
                {
                
case WEAPON:    // equip/unequip weapon
                    is_equip_now = (char_def.weapon != char_item->item_index);                    
                    app->m_game_chars.equip(g_player, char_item->item_index, WEAPON, is_equip_now);
                    
break;

                
case ARMOR:     // equip/unequip armor
                    is_equip_now = (char_def.armor != char_item->item_index);
                    app->m_game_chars.equip(g_player, char_item->item_index, ARMOR, is_equip_now);
                    
break;

                
case SHIELD:     // equip/unequip shield
                    is_equip_now = (char_def.shield != char_item->item_index);
                    app->m_game_chars.equip(g_player, char_item->item_index, SHIELD, is_equip_now);
                    
break;

                
case HEALING:
                    
if(g_player->health_points < g_player->char_def.health_points)
                    {
                        g_player->health_points += app->m_mil[char_item->item_index].value;

                        
if(g_player->health_points > char_def.health_points)
                            g_player->health_points = char_def.health_points;

                        is_consume = 
true;
                    }

                    
break;
                }

                
// reduce quantity if flagged as use once and consume flag
                if(check_bit(app->m_mil[char_item->item_index].flags, USEONCE) && is_consume)
                {
                    
if(char_item->quantity == 1)
                        g_player->char_ics->remove(char_item);
                    
else
                        char_item->quantity--;
                }

                app->play_sound(SOUND_BEEP);
            }
        } 
// [end] if(app->m_mouse.get_button_state(MOUSE_LBUTTON))

        // render the scene

        begin_display_scene();

        app->render_frame(0);
        app->m_text_window.render(NULL, COLOR_WHITE);
        app->m_text_header.render(NULL, COLOR_WHITE);

        
// display inventory on left
        
        draw_font(app->m_font, "Inventory:", 8, 96, 0, 0, D3DCOLOR_RGBA(255, 213, 191, 255), DT_LEFT);
        
        
long index = 0;

        
for(sCharItem* item_ptr = g_player->char_ics->get_root_item(); item_ptr != NULL; item_ptr = item_ptr->next)
        {
            
// calculate color to draw based on mouse position
            long color = ((index == sel) ? D3DCOLOR_RGBA(255, 255, 0, 255) : D3DCOLOR_RGBA(128, 128, 128, 255));

            
// display item name and quantity

            
char text[256];
            sprintf(text, "%lu x %s", item_ptr->quantity, app->m_mil[item_ptr->item_index].name);

            
long y_pos = index * STATUS_MENU_HEIGHT + STATUS_TOP_HEIGHT;
            draw_font(app->m_font, text, 32, y_pos, 0, 0, color, DT_LEFT);
            
            
// if item is equipped, then show E next to it.
            if(char_def.weapon == item_ptr->item_index ||
               char_def.armor  == item_ptr->item_index ||
               char_def.shield == item_ptr->item_index)
            {
                draw_font(app->m_font, "E", 16, y_pos, 0, 0, color, DT_LEFT);
            }

            index++;    
// go down one line
        }

        
static const int x_pos = 250;
        
char text[256];

        
// display character's stats at top-right

        draw_font(app->m_font, "Stats:", x_pos, 32, 0, 0, 
                  D3DCOLOR_RGBA(255, 213, 191, 255), DT_LEFT);

        sprintf(text, "HP: %ld/%ld", g_player->health_points, char_def.health_points);
        draw_font(app->m_font, text, x_pos + 20, 64, 0, 0, COLOR_WHITE, DT_LEFT);

        sprintf(text, "MP: %ld/%ld", g_player->mana_points, char_def.mana_points);
        draw_font(app->m_font, text, x_pos + 20, 96, 0, 0, COLOR_WHITE, DT_LEFT);        

        sprintf(text, "Level(Max %lu): %lu", MAX_PLAYER_LEVEL, char_def.level);
        draw_font(app->m_font, text, x_pos + 20, 128, 0, 0, COLOR_WHITE, DT_LEFT);
        
        
if(char_def.level < MAX_PLAYER_LEVEL)
            sprintf(text, "Exp/Next: %lu/%lu", char_def.exp, g_level_up_exp[char_def.level-1]);
        
else
            sprintf(text, "Exp/Next: %lu/99999", char_def.exp);

        draw_font(app->m_font, text, x_pos + 20, 160, 0, 0, COLOR_WHITE, DT_LEFT);

        sprintf(text, "$: %lu", char_def.money);
        draw_font(app->m_font, text, x_pos + 20, 192, 0, 0, COLOR_LIGHT_YELLOW, DT_LEFT);

        
long change = 0;

        
// print attack

        
if(g_player->char_def.weapon == -1)        
            sprintf(text, "Attack: %lu", char_def.attack);
        
else
        {            
            change = app->m_game_chars.get_attack(g_player) - char_def.attack;
            sprintf(text, "Attack: %lu + %lu", char_def.attack, change); 
        }

        draw_font(app->m_font, text, x_pos + 220, 64, 0, 0, COLOR_WHITE, DT_LEFT);

        
// print defense        

        
if(char_def.armor == -1 && char_def.shield == -1)
            sprintf(text, "Defense: %lu", char_def.defense);
        
else
        {
            change = app->m_game_chars.get_defense(g_player) - char_def.defense;
            sprintf(text, "Defense: %lu + %lu", char_def.defense, change); 
        }

        draw_font(app->m_font, text, x_pos + 220, 96, 0, 0, COLOR_WHITE, DT_LEFT);

        sprintf(text, "Agility: %lu", char_def.agility);
        draw_font(app->m_font, text, x_pos + 220, 128, 0, 0, COLOR_WHITE, DT_LEFT);

        sprintf(text, "Registance: %lu", char_def.resistance);
        draw_font(app->m_font, text, x_pos + 220, 160, 0, 0, COLOR_WHITE, DT_LEFT);

        sprintf(text, "Mental: %lu", char_def.mental);
        draw_font(app->m_font, text, x_pos + 220, 192, 0, 0, COLOR_WHITE, DT_LEFT);

        sprintf(text, "ToHit: %lu", char_def.to_hit);
        draw_font(app->m_font, text, x_pos + 220, 224, 0, 0, COLOR_WHITE, DT_LEFT);

        
// display known spells at right

        draw_font(app->m_font, "Spells:", x_pos , 240, 0, 0, D3DCOLOR_RGBA(255, 213, 191, 255), DT_LEFT);

        
for(long i = 0; i < NUM_SPELL_DEF; i++)
        {
            
if(char_def.magic_spell[i/32] & (1 << (i & 31)))
            {
                sSpell* spell = app->m_game_spells.get_spell(i);                

                
if(i == SPELL_HEAL)
                {                    
                    sprintf(text, "%lu: %s (Cost MP: %lu, Heal HP: %lu)", 
                        i+1, spell->name, spell->cost, (
long)spell->value[0]);
                }
                
else if(i == SPELL_TELEPORT)
                {
                    sprintf(text, "%lu: %s (Cost MP: %lu, Move to town!)", i+1, spell->name, spell->cost);
                }
                
else
                {
                    sprintf(text, "%lu: %s (Cost MP: %lu, Damage: %lu)", 
                        i+1, spell->name, spell->cost, -(
long)spell->value[0]);
                }

                draw_font(app->m_font, text, x_pos + 20, i * STATUS_MENU_HEIGHT + 272, 0, 0, COLOR_WHITE, DT_LEFT);
            }
        }

        end_display_scene();
        present_display();
    }
}

 

barter_frame:

The last of the state functions, barter_frame displays the store clerk's wares and allows the
player to click-and-buy those items for sale.

void barter_frame(void* data, long purpose)
{
    
static cCharIcs char_ics;

    cApp* app = (cApp*) data;

    
if(purpose == INIT_PURPOSE)     // initialize barter data
    {
        app->m_keyboard.m_locks[KEY_SPACE] = 
true;
        app->m_keyboard.set_key_state(KEY_SPACE, 
false);
        app->m_mouse.m_locks[MOUSE_LBUTTON] = 
true;
        app->m_mouse.set_button_state(MOUSE_LBUTTON, 
false);

        char_ics.load(g_barter_ics_file);            

        app->m_text_header.set_text("Shop", COLOR_WHITE);
        app->m_text_window.set_text("\r\n\nWhat would you like to buy?", COLOR_WHITE);
    }
    
else if(purpose == SHUTDOWN_PURPOSE)
    {
        char_ics.free();
    }
    
else    // process a frame of bartering
    {
        
// exit bartering if ESC or right mouse button pressed
        if(app->m_keyboard.get_key_state(KEY_ESC) || app->m_mouse.get_button_state(MOUSE_RBUTTON))
        {
            app->m_keyboard.m_locks[KEY_ESC]    = 
true;
            app->m_mouse.m_locks[MOUSE_RBUTTON] = 
true;

            app->m_state_manager.pop(app);
            
return;
        }

        
// dertermine which item is selected with mouse

        
long sel = app->m_mouse.get_y_pos() - BARTER_TOP_HEIGHT;

        
if(sel >= 0)
            sel /= BARTER_MENU_HEIGHT;

        
// see if click on item to buy
        if(app->m_mouse.get_button_state(MOUSE_LBUTTON))
        {
            app->m_mouse.m_locks[MOUSE_LBUTTON] = 
true;

            
// see which item was clicked
            if(sel >= 0 && sel < char_ics.get_num_items())
            {
                sCharItem* char_item = char_ics.get_item(sel);

                
// make sure player has enough gold for item
                if(g_player->char_def.money >= app->m_mil[char_item->item_index].price)
                {
                    sCharItem* item_ptr;

                    
// search for item alreay in inventory
                    for(item_ptr = g_player->char_ics->get_root_item(); item_ptr != NULL; item_ptr = item_ptr->next)
                    {
                        
// increase quantity if item already in inventory
                        if(char_item->item_index == item_ptr->item_index)
                        {
                            item_ptr->quantity++;
                            
break;
                        }
                    }

                    
// add item to player's inventory if not already
                    if(item_ptr == NULL)
                        g_player->char_ics->add(char_item->item_index, 1, NULL);

                    g_player->char_def.money -= app->m_mil[char_item->item_index].price;

                    app->play_sound(SOUND_BEEP);
                }                
            }
        }

        
// render the bartering scene
        
        begin_display_scene();

        app->render_frame(0);
        app->m_text_window.render(NULL, COLOR_WHITE);
        app->m_text_header.render(NULL, COLOR_WHITE);

        
// display items to buy
        long index = 0;
        
char text[256];

        
for(sCharItem* char_item = char_ics.get_root_item(); char_item != NULL; char_item = char_item->next)
        {
            
// calculate color to draw based on mouse position
            long color = ((index == sel) ? D3DCOLOR_RGBA(255, 255, 0, 255) : D3DCOLOR_RGBA(128, 128, 128, 255));

            
// display item name
            long pos_y = index * BARTER_MENU_HEIGHT + BARTER_TOP_HEIGHT;
            draw_font(app->m_font, app->m_mil[char_item->item_index].name, 32, pos_y, 0, 0, color, D3DFMT_UNKNOWN);

            
// display item price
            sprintf(text, "$%lu", app->m_mil[char_item->item_index].price);
            draw_font(app->m_font, text, 300, pos_y, 0, 0, color, D3DFMT_UNKNOWN);

            index++;
        }

        
// display character's gold at top-right
        sprintf(text, "Money: $%lu", g_player->char_def.money);
        draw_font(app->m_font, text, 320, 32, 0, 0, COLOR_WHITE, D3DFMT_UNKNOWN);

        end_display_scene();
        present_display();
    }
}

posted on 2007-12-29 22:44 lovedday 閱讀(310) 評論(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>
            久久综合久色欧美综合狠狠| 午夜精品久久| 美国十次成人| 亚洲午夜免费视频| 亚洲国产专区校园欧美| 西瓜成人精品人成网站| 国产精品一区免费视频| 欧美日韩三级在线| 欧美黄在线观看| 欧美大片在线看| 可以看av的网站久久看| 久久美女性网| 久久天天综合| 久久这里只精品最新地址| 欧美一级日韩一级| 欧美影视一区| 亚洲经典自拍| 亚洲精品裸体| 亚洲天堂av综合网| 亚洲激情第一区| aaa亚洲精品一二三区| 99精品久久免费看蜜臀剧情介绍| 亚洲美女在线看| 亚洲午夜视频在线| 欧美在线一二三| 欧美成年人网站| 国产精品成人一区二区三区夜夜夜| 亚洲第一中文字幕在线观看| 欧美一级理论片| 99精品国产99久久久久久福利| 国产日韩精品在线播放| 免费观看在线综合色| 久久精品91久久久久久再现| 亚洲少妇自拍| 欧美福利视频在线观看| 美脚丝袜一区二区三区在线观看| 久久久精彩视频| 亚洲电影专区| 午夜一区二区三区在线观看| 欧美精品成人一区二区在线观看| 国产亚洲欧美中文| 亚洲一区二区在线免费观看视频| 欧美成人第一页| 性欧美精品高清| 国产精品日韩欧美综合| 一区二区三区久久久| 欧美第一黄色网| 久久精品一二三| 国内精品久久久久久久影视蜜臀| 性欧美超级视频| 亚洲色图制服丝袜| 欧美午夜一区| 亚洲一区区二区| aa亚洲婷婷| 欧美日精品一区视频| 日韩视频永久免费观看| 亚洲国产精品久久精品怡红院| 久久久噜噜噜久久中文字免| 国内精品视频在线观看| 久久免费精品日本久久中文字幕| 午夜伦欧美伦电影理论片| 国产精品日韩二区| 久久国内精品自在自线400部| 亚洲网站视频福利| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲午夜久久久| 亚洲欧美成人网| 国产亚洲欧美一区| 蜜臀久久99精品久久久画质超高清| 久久精品三级| 亚洲日本成人女熟在线观看| 亚洲国产99| 欧美日韩一区精品| 亚洲欧美第一页| 欧美一区二区三区免费在线看| 国产区日韩欧美| 免费成人在线观看视频| 免费美女久久99| 亚洲一二三区精品| 亚洲在线免费| 亚洲永久网站| 国产精品国产三级欧美二区 | 午夜免费日韩视频| 国内久久婷婷综合| 欧美激情一区二区三区不卡| 欧美精品在线视频| 欧美亚洲在线观看| 久久综合久色欧美综合狠狠| 一本色道久久综合狠狠躁篇的优点| 一本色道久久综合精品竹菊 | 欧美性猛交xxxx免费看久久久| 亚洲欧美日韩爽爽影院| 久久成人综合网| 亚洲美女黄网| 欧美一级一区| 一区二区三区久久网| 亚洲午夜视频在线| 在线免费观看日本一区| 夜久久久久久| 亚洲国产cao| 99精品久久免费看蜜臀剧情介绍| 国产亚洲欧美另类一区二区三区| 欧美激情一区二区三区成人| 国产精品美女www爽爽爽| 六月婷婷一区| 国产精品色婷婷| 亚洲韩国日本中文字幕| 国产亚洲va综合人人澡精品| 亚洲高清免费| 好看的av在线不卡观看| 99ri日韩精品视频| 影音先锋久久资源网| 亚洲无玛一区| 一区二区高清视频在线观看| 久久亚洲国产精品一区二区| 欧美一区二区三区免费视频| 欧美极品影院| 免费视频一区| 国产拍揄自揄精品视频麻豆| 一区二区精品| 一区二区三区国产在线| 久久久久综合网| 久久久久综合一区二区三区| 国产精品乱码一区二区三区| 亚洲黄色一区| 亚洲精品影视| 欧美成年网站| 亚洲国产你懂的| 91久久久一线二线三线品牌| 老司机久久99久久精品播放免费| 久久激情五月丁香伊人| 国产精品青草久久| 亚洲精品免费观看| 日韩亚洲欧美成人| 欧美国产精品| 亚洲精品视频在线观看网站| 亚洲人成小说网站色在线| 久久九九电影| 可以免费看不卡的av网站| 激情久久久久| 毛片av中文字幕一区二区| 欧美日韩在线视频一区二区| 久久激情五月婷婷| 欧美日韩精品在线观看| 亚洲高清在线观看一区| 狠狠爱成人网| 久久婷婷丁香| 狼人天天伊人久久| 在线精品观看| 免费看亚洲片| 91久久精品视频| 一区二区三区四区精品| 国产精品福利在线| 亚洲欧洲av一区二区三区久久| 午夜精品婷婷| 国内揄拍国内精品少妇国语| 久久久久国产精品一区| 欧美电影美腿模特1979在线看| 亚洲日本在线观看| 欧美日韩在线精品| 午夜精品国产| 欧美激情一区二区三区不卡| 中国亚洲黄色| 国产亚洲一本大道中文在线| 久久久久免费| 99亚洲视频| 久久伊人亚洲| 99国产精品私拍| 国产亚洲精品久| 欧美激情综合色| 欧美亚洲一区二区三区| 欧美国产精品v| 午夜国产精品视频| 亚洲国产精品第一区二区| 欧美日韩直播| 久久人人97超碰国产公开结果 | 亚洲国产精品免费| 亚洲中无吗在线| 亚洲二区视频| 国产精品久久久久免费a∨大胸 | 国产精品综合| 免费观看成人www动漫视频| 99国产精品视频免费观看一公开| 欧美在线黄色| 亚洲一区二区三区视频播放| 在线观看日韩www视频免费| 欧美三区不卡| 欧美成人一二三| 久久国产日韩| 亚洲一区二区在线免费观看| 亚洲激情午夜| 免费亚洲一区二区| 久久精品首页| 亚洲欧美一级二级三级| 一区二区三区鲁丝不卡| 亚洲国产精彩中文乱码av在线播放| 国产精品亚洲产品| 欧美日韩国产黄| 欧美成人精品一区二区三区| 久久久久久久精|