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

天行健 君子當自強而不息

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>
            免费中文日韩| 亚洲国产精品成人| 日韩一级大片在线| 欧美电影免费观看高清| 激情一区二区三区| 久久久www| 午夜精品福利一区二区蜜股av| 欧美视频三区在线播放| aa国产精品| 亚洲无线观看| 国产一区二区三区高清播放| 亚洲香蕉伊综合在人在线视看| 亚洲区国产区| 国产精品永久在线| 久久久亚洲精品一区二区三区| 亚洲欧美视频| 国产精品免费网站在线观看| 欧美在线免费视频| 久热爱精品视频线路一| 亚洲精品久久久久久久久| 亚洲欧洲日韩在线| 国产欧美精品| 蜜月aⅴ免费一区二区三区| 欧美成人一品| 欧美一级播放| 久久亚洲高清| 亚洲性感激情| 亚洲自拍偷拍色片视频| 国产一区二区三区四区在线观看 | 欧美高清在线视频观看不卡| 亚洲免费电影在线| 亚洲午夜视频在线观看| 欧美三区在线视频| 老鸭窝亚洲一区二区三区| 欧美不卡三区| 久久精品男女| 欧美精品一区二区三区很污很色的 | 欧美在线日韩精品| 日韩一区二区精品葵司在线| 亚洲欧美成aⅴ人在线观看| 在线成人黄色| 亚洲综合色丁香婷婷六月图片| 精品动漫av| 亚洲午夜羞羞片| 亚洲激情不卡| 欧美在线网站| 亚洲自拍偷拍福利| 欧美www视频| 久久婷婷激情| 国产精品区一区二区三| 亚洲第一视频| 在线日韩精品视频| 亚洲欧美制服中文字幕| 一区二区三区黄色| 销魂美女一区二区三区视频在线| 亚洲精品国精品久久99热| 午夜视黄欧洲亚洲| 亚洲午夜在线| 欧美欧美全黄| 亚洲欧洲日本国产| 亚洲国产一区二区视频| 久久精品国产999大香线蕉| 亚洲三级电影在线观看| 久久精品中文字幕一区| 欧美伊人久久久久久午夜久久久久 | 欧美一区二区日韩一区二区| 欧美精品一区二区视频| 亚洲成色777777在线观看影院| 国产最新精品精品你懂的| 亚洲视频每日更新| 亚洲一区二区三区四区五区午夜 | 狼人社综合社区| 久久尤物视频| 激情成人亚洲| 亚洲综合欧美日韩| 欧美一级日韩一级| 国产精品资源在线观看| 亚洲欧美大片| 久久经典综合| 一区二区三区在线看| 久久人人爽国产| 欧美激情一区在线| 国语对白精品一区二区| 欧美一区三区三区高中清蜜桃 | 亚洲免费精彩视频| 欧美美女操人视频| 在线综合亚洲| 久久精品视频免费观看| 国外成人在线视频网站| 欧美中文字幕视频在线观看| 久久久久久久久久久久久9999| 国产一区日韩一区| 久久久水蜜桃| 91久久嫩草影院一区二区| 一本色道久久综合一区| 国产精品日韩欧美| 久久另类ts人妖一区二区| 欧美黄免费看| 亚洲一区二区三区午夜| 国产精品视频免费观看www| 欧美亚洲在线观看| 久久国产精品99久久久久久老狼| 国产一区二区在线免费观看| 久久久久国产精品www | 99精品热视频| 国产精品永久免费| 久久综合999| 一本色道久久88精品综合| 亚洲手机在线| 国内精品久久久| 欧美国产日韩一区二区在线观看 | 欧美激情成人在线| 中日韩在线视频| 红杏aⅴ成人免费视频| 欧美激情一区二区三区高清视频 | 在线中文字幕一区| 一区二区三区在线免费播放| 欧美日韩国产麻豆| 欧美在线视频观看免费网站| 久久精品亚洲一区| 一区二区日韩欧美| 国产一区香蕉久久| 欧美视频日韩视频| 久久女同精品一区二区| 亚欧成人在线| 亚洲欧美制服中文字幕| 亚洲婷婷在线| 夜夜嗨一区二区| 亚洲精品乱码久久久久久日本蜜臀| 久久一区免费| 久久婷婷国产综合尤物精品| 亚洲欧美三级在线| 亚洲欧美另类中文字幕| 艳妇臀荡乳欲伦亚洲一区| 亚洲日本乱码在线观看| 亚洲国产精品久久久久| 1024亚洲| 亚洲激情在线观看视频免费| 在线日本成人| 亚洲高清网站| 亚洲精品久久久久中文字幕欢迎你| 亚洲高清成人| 亚洲麻豆av| 中国成人在线视频| 亚洲专区一区| 久久精品99无色码中文字幕 | 在线看无码的免费网站| 一区二区三区在线视频免费观看 | 中文av一区特黄| 亚洲欧美日韩在线| 欧美影院视频| 裸体歌舞表演一区二区| 欧美jizzhd精品欧美巨大免费| 欧美91精品| 亚洲精品美女久久7777777| 亚洲精选在线| 亚洲欧美日韩精品久久久| 欧美一级夜夜爽| 鲁大师成人一区二区三区| 欧美精品激情| 国产欧美另类| 亚洲国产精品成人| 亚洲一区区二区| 久久婷婷国产综合国色天香| 欧美高清在线一区二区| 日韩午夜黄色| 久久精品在线观看| 欧美肥婆在线| 国产欧美日韩伦理| 亚洲国产一区二区视频| 亚洲午夜羞羞片| 美女脱光内衣内裤视频久久影院| 亚洲丶国产丶欧美一区二区三区| 日韩一区二区免费高清| 久久成人精品电影| 欧美日韩亚洲视频一区| 国产主播一区二区三区| 一区二区免费在线观看| 久久九九久精品国产免费直播| 亚洲国产精品成人一区二区 | 亚洲激情中文1区| 欧美一区二区黄| 欧美日韩午夜| 亚洲成人资源| 欧美一区二区精品在线| 欧美激情国产精品| 欧美一区二区大片| 欧美亚男人的天堂| 亚洲美女色禁图| 久久综合一区二区| 亚洲男人天堂2024| 欧美日韩1080p| 亚洲黄色天堂| 久久免费偷拍视频| 亚洲午夜国产成人av电影男同| 免费观看日韩| 18成人免费观看视频| 欧美一区二区三区四区在线观看地址| 亚洲国产日韩欧美一区二区三区| 午夜欧美大片免费观看|