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

天行健 君子當自強而不息

Putting Together a Full Game(10)

 

Using State-Based Processing

I developed the sample game to use state-based processing in order to effectively
use the application class's processing structure. The game uses these four states:

■ Main menu state. When executed, the game displays a main menu giving the
player the option to start a new game, load a game, return to or save a game
in progress, or to quit the game.

■ In-game state. This state is used most often because it takes care of updating
and rendering each frame of the game.

■ Character status window state. Whenever the player right-clicks during gameplay,
he accesses the character status window. Here, the player can use, equip,
or unequip items just by clicking them, as well as check on the character’s
statistics and known spells.

■ Barter window state. When the player talks to the villager, the barter window
opens in order to buy items. Click items to buy or press Esc or the right
mouse button to exit.

You use a state manager object to control the processing of these four states.

 

menu_frame:

 You use the menu_frame function to display the main menu, which, in all its glory, has
 a spinning texture-mapped polygon overlaid with the main menu options. The purpose
 of the menu_frame function is to track which option is being selected and to handle
 the appropriate functions.

void menu_frame(void* data, long purpose)
{
    
static const sMenuVertex verts[] = 
    {
        { -100.0f,  100.0f, 1.0f, 0.0f, 0.0f },
        {  100.0f,  100.0f, 1.0f, 1.0f, 0.0f },
        { -100.0f, -100.0f, 1.0f, 0.0f, 1.0f },
        {  100.0f, -100.0f, 1.0f, 1.0f, 1.0f }
    };
    
    
static IDirect3DVertexBuffer9*  menu_vb;
    
static IDirect3DTexture9*       menu_texture;
    
static IDirect3DTexture9*       menu_select;
    
static ID3DXFont*               title_font;
    
static cCamera                  menu_cam;
    
static cWorldPos                menu_pos;
    
    cApp* app = (cApp*) data;

    
if(purpose == INIT_PURPOSE) // initialize menu related data
    {   
        
// create and set the menu vertices
        create_vertex_buffer(&menu_vb, array_num(verts), sizeof(sMenuVertex), MENU_FVF);
        fill_in_vertex_buffer(menu_vb, 0, array_num(verts), verts);

        load_texture_from_file(&menu_texture, "..\\Data\\MenuBD.bmp", 0, D3DFMT_UNKNOWN);
        load_texture_from_file(&menu_select,  "..\\Data\\Select.bmp", 0, D3DFMT_UNKNOWN);

        create_font(&title_font, "Consolas", 48, 
falsefalse);
        menu_cam.point(0.0f, 0.0f, -150.0f, 0.0f, 0.0f, 0.0f);
    }
    
else if(purpose == SHUTDOWN_PURPOSE)    // shutdown resources used in menu
    {
        release_com(menu_vb);
        release_com(menu_texture);
        release_com(menu_select);
        release_com(title_font);
    }
    
else    // process a frame of menu
    {
        
// exit game or return to game if ESC pressed
        if(app->m_keyboard.get_key_state(KEY_ESC))
        {
            app->m_keyboard.m_locks[KEY_ESC] = 
true;
            app->m_keyboard.set_key_state(KEY_ESC, 
false);

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

        
// see which option was selected if mouse button pressed
        if(app->m_mouse.get_button_state(MOUSE_LBUTTON))
        {
            
// lock the mouse button and clear button state
            app->m_mouse.m_locks[MOUSE_LBUTTON] = true;
            app->m_mouse.set_button_state(MOUSE_LBUTTON, 
false);

            
// determine which, if any selection.

            
long mouse_start = app->m_mouse.get_y_pos() - MAIN_MENU_TOP;

            
if(mouse_start >= 0)
            {
                
long hit_index = mouse_start / MAIN_MENU_HEIGHT;
                
                app->m_state_manager.pop(app);  
// pop the menu state

                // determine what to do based on selection
                switch(hit_index)
                {
                
case NEW_GAME:
                    app->m_state_manager.pop_all(app);

                    app->m_game_chars.free();
                    app->m_game_spells.free();
                    app->m_game_script.reset_data();
                    
                    app->m_game_chars.add_char(ID_PLAYER, 0, CHAR_PC, CHAR_STAND, -100.0f, 0.0f, 50.0f, 3.14f);
                    g_player = app->m_game_chars.get_char(ID_PLAYER);

                    app->m_teleport_map = -1;

                    app->m_state_manager.push(game_frame, app);

                    
// start new game and let script process as startup
                    app->load_level(1);

                    
break;

                
case RETURN_TO_GAME:
                    app->m_state_manager.push(game_frame, app);
                    
break;

                
case LOAD_GAME:
                    app->m_state_manager.pop_all(app);

                    app->m_game_chars.free();
                    app->m_game_spells.free();

                    app->m_game_chars.add_char(ID_PLAYER, 0, CHAR_PC, CHAR_STAND, -100.0f, 0.0f, 50.0f, 3.14f);
                    g_player = app->m_game_chars.get_char(ID_PLAYER);

                    
// load character's stats and inventory
                    app->m_game_chars.load_char(ID_PLAYER, "..\\Data\\Char.cs");
                    g_player->char_ics->load("..\\Data\\Char.ci");

                    
if(g_player->char_def.weapon != -1)
                        app->m_game_chars.equip(g_player, g_player->char_def.weapon, WEAPON, 
true);

                    g_player->health_points = g_player->char_def.health_points;
                    g_player->mana_points   = g_player->char_def.mana_points;

                    app->m_game_script.load("..\\Data\\Script.sav");
                    app->m_teleport_map = -1;

                    app->m_state_manager.push(game_frame, app);

                    app->m_game_chars.move_char(ID_PLAYER, 100.0f, 0.0f, -100.0f);
                    app->load_level(1);     
// start in town

                    
break;

                
case SAVE_GAME:
                    app->m_game_script.save("..\\Data\\Script.sav");

                    
// save character's stats and inventory
                    app->m_game_chars.save_char(ID_PLAYER, "..\\Data\\Char.cs");
                    g_player->char_ics->save("..\\Data\\Char.ci");

                    
break;

                
case QUIT_GAME:
                    app->m_state_manager.pop_all(app);
                    
break;
                }

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

        set_display_camera(&menu_cam);
        
        menu_pos.rotate(0.0f, 0.0f, timeGetTime() / 4000.0f);   
// rotate backdrop

        // render menu backdrop and all menus

        begin_display_scene();

        disable_zbuffer();
        set_display_world(&menu_pos);
        g_d3d_device->SetTexture(0, menu_texture);
        render_vertex_buffer(menu_vb, 0, 2, D3DPT_TRIANGLESTRIP);

        
// draw the game's title
        draw_font(title_font, g_title_name, 0, 16, CLIENT_WIDTH, 0, COLOR_LIGHT_YELLOW, DT_CENTER);

        
// select option based on mouse position

        
long mouse_start = app->m_mouse.get_y_pos() - MAIN_MENU_TOP;

        
if(mouse_start >= 0)
        {
            
long hit_index = mouse_start / MAIN_MENU_HEIGHT;

            
if( hit_index == NEW_GAME ||
               (hit_index == RETURN_TO_GAME && (g_menu_options & MENU_BACK)) ||
               (hit_index == LOAD_GAME && (g_menu_options & MENU_LOAD)) ||
               (hit_index == SAVE_GAME && (g_menu_options & MENU_SAVE)) ||
               (hit_index == QUIT_GAME))
            {
                begin_display_sprite();

                RECT rect;
                calculate_texture_rect(menu_select, 0, 0, 0, 0, &rect);

                
long dest_y = hit_index * MAIN_MENU_HEIGHT + MAIN_MENU_TOP;
                draw_texture(g_d3d_sprite, menu_select, &rect, 192, dest_y, 1.0f, 1.0f, COLOR_WHITE);

                end_display_sprite();
            }
        }

        
// draw enabled options 
        
        draw_font(app->m_font, "New Game", 0, 150, CLIENT_WIDTH, 0, COLOR_LIGHT_YELLOW, DT_CENTER);

        
if(g_menu_options & MENU_BACK)
            draw_font(app->m_font, "Back to Game", 0, 214, CLIENT_WIDTH, 0, COLOR_LIGHT_YELLOW, DT_CENTER);

        
if(g_menu_options & MENU_LOAD)
            draw_font(app->m_font, "Load Game", 0, 278, CLIENT_WIDTH, 0, COLOR_LIGHT_YELLOW, DT_CENTER);

        
if(g_menu_options & MENU_SAVE)
            draw_font(app->m_font, "Save Game", 0, 342, CLIENT_WIDTH, 0, COLOR_LIGHT_YELLOW, DT_CENTER);
        
        draw_font(app->m_font, "Quit", 0, 410, CLIENT_WIDTH, 0, COLOR_LIGHT_YELLOW, DT_CENTER);

        end_display_scene();

        present_display();
    }
}

posted on 2007-12-29 21:22 lovedday 閱讀(245) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(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>
            在线视频精品| 99爱精品视频| 欧美中文字幕| 欧美色图首页| 亚洲欧洲一级| 欧美高清影院| 国产一区 二区 三区一级| 亚洲激情网站免费观看| 久久精品30| 久久色在线观看| 亚洲靠逼com| 香蕉尹人综合在线观看| 久久久国产精品一区二区三区| 欧美a级片网| 国产精品免费久久久久久| 在线免费观看日韩欧美| 亚洲永久免费av| 亚洲高清电影| 午夜精品99久久免费| 欧美精品大片| 亚洲大片av| 欧美亚洲综合网| 亚洲国产精品一区在线观看不卡| 亚洲精品自在久久| 麻豆视频一区二区| 国产精品一区二区在线观看| 国内精品久久久久久久果冻传媒| 一区二区三区三区在线| 亚洲高清在线| 欧美日本网站| 亚洲视频在线二区| 亚洲精品视频在线| 国产精品h在线观看| 亚洲午夜久久久久久久久电影院| 亚洲国产精品一区| 欧美大色视频| 在线视频免费在线观看一区二区| 亚洲国产成人精品女人久久久| 久久久视频精品| 国产一区二区久久| 久久精品女人的天堂av| 国产日韩精品视频一区二区三区| 亚洲欧美久久久久一区二区三区| 洋洋av久久久久久久一区| 欧美日本不卡视频| 欧美在线视频观看免费网站| 欧美在线欧美在线| 欧美在线播放高清精品| 国产精品久久久久久模特| 一本综合久久| 久久精品国产99精品国产亚洲性色 | 免费在线播放第一区高清av| 亚洲毛片视频| 欧美伊人久久久久久久久影院 | 亚洲欧美日韩精品久久亚洲区 | 欧美日韩亚洲91| 一区二区三区蜜桃网| 亚洲一区二区三区在线视频| 一本一本久久| 9久草视频在线视频精品| 国产一区二区丝袜高跟鞋图片| 久久综合伊人77777麻豆| 欧美男人的天堂| 亚洲精品国产精品国自产观看浪潮 | 久久久久综合| 国产一区二区精品丝袜| 香蕉久久夜色精品| 免费久久99精品国产自在现线| 亚洲国产精品悠悠久久琪琪| 免费视频一区| 亚洲一级一区| 一个色综合导航| 久久夜色精品国产噜噜av| 一区二区日韩精品| 欧美高清视频www夜色资源网| 91久久精品一区二区别| 亚洲国产精品成人综合色在线婷婷| 午夜精品一区二区三区四区| 国产精品日韩在线观看| 另类人畜视频在线| 国产精品v欧美精品v日本精品动漫 | 美女视频黄a大片欧美| 亚洲高清视频一区| 亚洲专区免费| 亚洲三级免费电影| 久久精品人人做人人爽| 亚洲综合精品四区| 国产精品午夜视频| 亚洲婷婷在线| 亚洲毛片av| 欧美激情一区二区三区四区| 久久久精品一区| 欧美在线91| 欧美日韩国产一级| 久久gogo国模裸体人体| 99re66热这里只有精品3直播| 久久久7777| 免费影视亚洲| 亚洲在线观看视频网站| 欧美淫片网站| 夜夜爽av福利精品导航| 免费不卡视频| 欧美人与禽猛交乱配视频| 亚洲精品麻豆| 亚洲日本在线视频观看| 久久久亚洲精品一区二区三区| 夜色激情一区二区| 欧美日韩国产成人| 99re国产精品| 午夜精品久久久久久久白皮肤 | 亚洲欧美日韩在线高清直播| 亚洲精品女人| 欧美精品一区二区久久婷婷| 亚洲高清影视| 这里只有精品视频在线| 欧美日韩免费观看中文| 欧美亚洲系列| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美一级一区| 国产精品亚洲综合| 欧美不卡视频| 亚洲免费中文| 欧美激情亚洲综合一区| 美女精品自拍一二三四| 亚洲欧洲另类| 国产欧美日韩三区| 欧美高清影院| 极品中文字幕一区| 亚洲欧美精品| 欧美一级视频精品观看| 欧美福利电影在线观看| 欧美激情精品久久久久久久变态 | 欧美日韩一区二区三区免费看| 久久亚洲影音av资源网| 国产精品久久久久久久午夜| 亚洲欧洲一区二区三区| 影视先锋久久| 久久九九久精品国产免费直播| 久久久久国产精品人| 国产伊人精品| 久久久久女教师免费一区| 久久免费视频网| 国产一区二区三区在线观看免费视频| 亚洲一区二区影院| 先锋影音久久| 国产乱码精品一区二区三区忘忧草 | 久久国产精品免费一区| 久久婷婷久久| 亚洲国产99| 欧美—级a级欧美特级ar全黄| 亚洲高清网站| 亚洲私人影院| 国产亚洲欧美日韩美女| 久久久国产精品一区| 亚洲电影在线免费观看| 一卡二卡3卡四卡高清精品视频| 国产精品99一区| 亚洲欧美日韩国产精品| 猫咪成人在线观看| 一区二区免费看| 国产私拍一区| 一本久道久久综合狠狠爱| 亚洲一区在线观看免费观看电影高清| 日韩一级黄色片| 久久精品人人爽| 国产日韩亚洲| 午夜免费在线观看精品视频| 亚洲午夜免费视频| 蜜桃av一区二区三区| 亚洲免费视频网站| 你懂的视频一区二区| 国产欧美精品| 久久久久久久久伊人| 亚洲片在线资源| 国产精品美女主播| 老司机精品久久| 亚洲一区精彩视频| 亚洲国产精品成人| 久久不见久久见免费视频1| 亚洲国产毛片完整版| 国产精品一区二区a| 免费看黄裸体一级大秀欧美| 一区二区三区久久精品| 欧美高清在线播放| 久久成人18免费网站| 日韩一级精品| 亚洲国产影院| 激情成人亚洲| 国产精品一区二区三区免费观看| 99国产精品久久久久老师| 亚洲午夜av电影| 亚洲欧洲精品一区二区| 久久久久久久久蜜桃| 亚洲视频欧美在线| 亚洲精品欧美专区| 亚洲高清久久久| 狠狠色狠狠色综合系列| 国产精品日韩久久久| 欧美日韩日日骚| 欧美激情精品久久久久久|