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

天行健 君子當自強而不息

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>
            激情伊人五月天久久综合| 欧美一区二区免费视频| 欧美一级理论片| 午夜欧美精品| 欧美三级黄美女| 在线欧美日韩| 久久久久国产精品一区三寸 | 亚洲欧美激情一区| 日韩五码在线| 欧美综合二区| 亚洲午夜久久久| 国产三区精品| 亚洲第一福利在线观看| 久久精品天堂| 亚洲高清一区二| 亚洲国产精品精华液2区45| 免费一区视频| 亚洲午夜av| 欧美亚洲在线观看| 亚洲理论在线观看| 欧美一区二区性| 亚洲视频在线观看一区| 亚洲精品久久久久中文字幕欢迎你 | 蜜臀久久久99精品久久久久久 | 国产精品v日韩精品| 亚洲一区免费网站| 蜜桃av综合| 久久精品人人做人人爽| 免费在线亚洲| 另类综合日韩欧美亚洲| 欧美成熟视频| 欧美高清视频在线播放| 国产精品99免费看 | 一本大道久久a久久综合婷婷 | 欧美三级欧美一级| 久热国产精品| 一区二区在线免费观看| 亚洲美女尤物影院| 亚洲精品视频在线观看免费| 亚洲人成啪啪网站| 91久久精品一区| 欧美精品色综合| 亚洲国产国产亚洲一二三| 国产人成精品一区二区三| 一区二区三区高清| 亚洲欧美日韩天堂| 国产一区二区精品在线观看| 亚洲高清久久久| 亚洲第一精品夜夜躁人人爽| 亚洲毛片在线观看| 久久成人精品视频| 在线日韩日本国产亚洲| 久久国产主播| 91久久久在线| 午夜视频一区在线观看| 国产精品亚洲网站| 久久免费的精品国产v∧| 久久蜜桃资源一区二区老牛| 国产精品人成在线观看免费| 欧美激情91| 西西人体一区二区| 日韩视频不卡| 国产精品久久久久一区二区三区| 国产亚洲精品久久久| 免费视频一区| 亚洲欧美一区二区视频| 国产免费观看久久| 欧美精品福利在线| 久久免费视频一区| 中文日韩在线视频| 亚洲国产专区校园欧美| 欧美国产视频一区二区| 欧美国产一区二区在线观看| 一区二区三区在线免费观看| 欧美在线二区| 亚洲免费一级电影| 亚洲视频在线免费观看| 亚洲国产精品日韩| 欧美激情视频免费观看| 久久久久久国产精品一区| 最新中文字幕一区二区三区| 欧美日韩国语| 欧美午夜视频| 国产精品普通话对白| 欧美色欧美亚洲高清在线视频| 欧美亚洲一区| 久久se精品一区精品二区| 在线亚洲精品| 午夜亚洲福利在线老司机| 亚洲伊人观看| 久久国产视频网| 噜噜爱69成人精品| 欧美日韩在线播放三区四区| 久久久视频精品| 欧美成人精品h版在线观看| 久久综合一区| 国产精品视频免费一区| 国模叶桐国产精品一区| 国产欧美一区二区精品忘忧草| 欧美视频精品在线| 国产人久久人人人人爽| 精品成人国产在线观看男人呻吟| 国产亚洲精品bt天堂精选| 国产日韩欧美一区在线| 国产女精品视频网站免费| 国产区欧美区日韩区| **欧美日韩vr在线| 亚洲免费在线观看| 欧美福利视频在线观看| 亚洲精品国产日韩| 亚洲欧美影院| 欧美日韩亚洲网| 久久久水蜜桃| 国产精品一区视频| 亚洲日韩第九十九页| 午夜精品电影| 亚洲日韩视频| 欧美激情一区二区三区蜜桃视频 | 亚洲自拍都市欧美小说| 欧美亚洲视频一区二区| 欧美激情按摩| 亚洲毛片在线观看| 亚洲第一级黄色片| 欧美国产日韩亚洲一区| 一区二区三区自拍| 久久在线免费| 免费视频一区| 亚洲激情在线| 亚洲精品老司机| 国产模特精品视频久久久久 | 久久精品导航| 亚洲小少妇裸体bbw| 国产精品第2页| 久久精品一区蜜桃臀影院 | 欧美aa在线视频| 亚洲精品在线免费| 一区二区三区鲁丝不卡| 欧美日韩国产高清视频| 亚洲国产精品成人| 99精品99| 亚洲第一级黄色片| 亚洲视频第一页| 影音先锋久久| 亚洲免费中文字幕| 亚洲精品一线二线三线无人区| 亚洲国产成人在线播放| 欧美黄色成人网| 国产精品二区三区四区| 亚洲一区二区三区高清不卡| 亚洲美女视频在线免费观看| 久久综合免费视频影院| 日韩天堂在线观看| 欧美在线一级va免费观看| 亚洲免费av电影| 久久久久国色av免费看影院 | 在线国产欧美| 欧美一区二区三区四区在线| 国产精品视频精品| 亚洲精品视频在线观看免费| 欧美日韩高清在线| 欧美国产成人精品| 最新亚洲电影| 欧美精品一区三区| 99国产精品99久久久久久粉嫩| 国产精品一区一区| 午夜精品福利一区二区三区av| 亚洲免费久久| 欧美色视频一区| 亚洲你懂的在线视频| 日韩午夜电影av| 欧美日韩高清在线观看| 亚洲国产日日夜夜| 亚洲欧洲在线一区| 欧美日韩亚洲免费| 香蕉成人久久| 欧美高清影院| 亚洲特级毛片| 激情欧美一区| 欧美激情日韩| 久久国产精品毛片| 亚洲精品久久久久久久久| 在线亚洲欧美| 激情综合久久| 欧美日韩国产三区| 久久精品91| 亚洲视频每日更新| 亚洲国产99| 久久婷婷麻豆| 亚洲一区日本| 亚洲日本久久| 国产主播精品在线| 国产精品免费在线| 亚洲作爱视频| 伊大人香蕉综合8在线视| 鲁大师影院一区二区三区| 欧美激情亚洲国产| 久久精品日韩| 久久九九国产精品| 久久精品国产免费观看| 久久久久免费视频|