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

天行健 君子當自強而不息

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>
            欧美jizzhd精品欧美喷水| 日韩午夜在线电影| 欧美国产国产综合| 亚欧成人在线| 国产日韩一区二区| 久久国产一区二区| 亚洲欧美在线看| 国产精品入口日韩视频大尺度| 在线观看日韩| 欧美激情视频一区二区三区免费| 久久精精品视频| 精品999久久久| 蜜桃久久av一区| 欧美国产高清| 中文网丁香综合网| 欧美肥婆bbw| 免费视频最近日韩| 亚洲剧情一区二区| 免费成人av资源网| 欧美极品在线观看| 亚洲另类黄色| 亚洲神马久久| 国产一区二区三区免费观看| 久久精品中文| 欧美11—12娇小xxxx| 一区二区不卡在线视频 午夜欧美不卡'| 欧美黄污视频| 国产精品美女xx| 久久色中文字幕| 欧美激情第3页| 午夜精品福利一区二区蜜股av| 午夜一区二区三区在线观看| 好看的亚洲午夜视频在线| 免费在线成人av| 国产精品国产a级| 久久久综合网站| 欧美精品在线看| 久久久五月天| 欧美日韩免费观看一区三区| 亚洲毛片在线观看| 亚洲欧美日韩在线综合| 亚洲激情小视频| 午夜久久资源| 亚洲伦理久久| 亚洲欧美视频在线观看| 亚洲国产精品女人久久久| 黑人操亚洲美女惩罚| 欧美电影免费网站| 欧美精品国产精品日韩精品| 久久精品国产亚洲5555| 欧美女同在线视频| 理论片一区二区在线| 欧美性开放视频| 老司机精品导航| 国产精品麻豆va在线播放| 亚洲电影免费在线观看| 国产午夜精品美女视频明星a级 | 欧美日韩麻豆| 欧美成人免费va影院高清| 国产精品久久久久久模特| 亚洲激情网站免费观看| 精品粉嫩aⅴ一区二区三区四区| 99精品欧美一区二区蜜桃免费| 极品少妇一区二区三区精品视频| 夜夜精品视频一区二区| 日韩香蕉视频| 欧美成人亚洲| 欧美国产日韩精品免费观看| 国产精品一级二级三级| 夜夜嗨av一区二区三区四季av| 亚洲欧洲一区二区在线播放| 久久久久久网址| 久久一区国产| 欧美三级在线播放| 一区二区三区www| 一本色道久久综合| 免费在线成人| 亚洲国产成人一区| 99精品热视频只有精品10| 欧美不卡高清| 亚洲国产成人精品久久| 国产一区二区三区直播精品电影| 午夜视频久久久久久| 午夜精品影院| 欧美精品成人| 一本色道久久综合狠狠躁篇的优点 | 亚洲在线一区| 午夜精品久久| 国产欧美日韩高清| 欧美一区二区在线观看| 欧美freesex交免费视频| 亚洲国产一区二区精品专区| 美女视频一区免费观看| 亚洲高清成人| 亚洲网站视频福利| 国产精品乱码一区二三区小蝌蚪| 99亚洲视频| 欧美一级日韩一级| 国内自拍亚洲| 欧美jizz19性欧美| 一区二区免费在线观看| 久久精品国产99精品国产亚洲性色 | 免费观看一区| 中文在线不卡| 欧美va亚洲va国产综合| 亚洲在线成人精品| 亚洲福利免费| 国产精品自拍一区| 欧美国产亚洲另类动漫| 羞羞色国产精品| 亚洲久久在线| 免费观看在线综合色| 午夜精品福利一区二区蜜股av| 亚洲黄色免费电影| 国产人成精品一区二区三| 欧美黑人一区二区三区| 久久精品亚洲乱码伦伦中文 | 麻豆精品精品国产自在97香蕉| 亚洲国产高清视频| 国内精品久久久久影院色| 欧美视频一区二区三区| 免费成人av资源网| 欧美专区在线播放| 亚洲天堂网在线观看| 亚洲精品久久久蜜桃| 欧美黄色视屏| 欧美激情第8页| 欧美国产日韩精品| 欧美大胆人体视频| 久久午夜av| 久久久亚洲国产美女国产盗摄| 欧美亚洲色图校园春色| 亚洲一区中文字幕在线观看| 亚洲精选中文字幕| 亚洲另类自拍| av成人免费在线| 日韩一级精品| 一区二区三区欧美成人| 99国产精品99久久久久久| 亚洲人成亚洲人成在线观看图片| 在线成人激情| 亚洲国产免费| 亚洲日本中文字幕| 亚洲精选在线观看| 一区二区三区久久| 亚洲一区三区电影在线观看| 亚洲一区在线播放| 午夜欧美不卡精品aaaaa| 亚洲欧美日韩国产综合| 午夜视频久久久| 久久激情网站| 欧美成人国产va精品日本一级| 欧美α欧美αv大片| 欧美激情一区二区三区蜜桃视频| 蜜桃久久av| 亚洲激情第一页| 亚洲天堂av电影| 欧美一区二区三区四区夜夜大片| 欧美一区二区视频观看视频| 久久久久久日产精品| 欧美激情视频在线播放 | 欧美一级大片在线免费观看| 久久精品国产免费观看| 久久久久久久一区二区| 欧美xxx成人| 国产精品欧美日韩一区| 韩日精品在线| av成人老司机| 久久精品视频在线播放| 亚洲国产精品123| 亚洲香蕉网站| 久久婷婷色综合| 欧美色视频在线| 国内精品嫩模av私拍在线观看| 亚洲日韩视频| 欧美中文字幕久久| 亚洲国产精品一区二区第四页av| 制服丝袜激情欧洲亚洲| 久久蜜桃精品| 国产精品久久久久久久久免费| 国内精品久久久| 一区二区精品| 麻豆精品91| 在线中文字幕一区| 免费试看一区| 国产亚洲网站| 亚洲一区二区伦理| 欧美高清视频一区二区三区在线观看| 在线中文字幕一区| 嫩草影视亚洲| 国产一区日韩一区| 亚洲午夜一区二区| 欧美国产精品劲爆| 小黄鸭精品aⅴ导航网站入口| 欧美福利电影在线观看| 黑人一区二区| 欧美自拍偷拍午夜视频| 亚洲精品免费网站| 欧美14一18处毛片| 亚洲高清在线精品|