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

天行健 君子當自強而不息

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 閱讀(242) 評論(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>
            国产精品综合色区在线观看| 欧美成人影音| 国内外成人免费激情在线视频| 欧美日韩ab| 欧美极品aⅴ影院| 久久久久国产成人精品亚洲午夜| 午夜在线一区| 欧美中文字幕| 欧美一区二区三区视频| 欧美在线观看视频| 久热国产精品| 欧美v日韩v国产v| 99国产精品视频免费观看| 日韩一级大片在线| 欧美亚洲一区二区在线| 久久电影一区| 免播放器亚洲| 国产精品久久久| 国产欧美高清| 日韩视频一区二区三区在线播放免费观看 | 国产亚洲网站| 亚洲福利精品| 亚洲永久网站| 欧美激情一区二区三级高清视频| 欧美精品三区| 国产最新精品精品你懂的| 亚洲高清在线| 欧美在线看片| 欧美成人影音| 久久国产精品久久久| 狼人天天伊人久久| 国产欧美日韩一区二区三区| 国产伦精品一区二区三区四区免费| 黄色日韩在线| 午夜精品在线视频| 麻豆国产精品va在线观看不卡| 亚洲高清二区| 欧美一区二区高清| 欧美日韩视频在线一区二区观看视频 | 最新成人在线| 亚洲欧美成人综合| 欧美激情2020午夜免费观看| 亚洲一区二区三区四区五区黄| 美女视频一区免费观看| 国产一区二区久久久| 亚洲线精品一区二区三区八戒| 欧美高清在线一区| 久久久激情视频| 国产有码在线一区二区视频| 亚洲永久字幕| 亚洲天堂成人| 国产精品久久国产三级国电话系列| 亚洲另类春色国产| 亚洲国产另类久久久精品极度| 亚洲欧美日本另类| 日韩视频在线免费| 欧美日韩一区二区视频在线观看| 亚洲娇小video精品| 久久三级视频| 欧美在线观看网站| 国产在线精品一区二区中文| 欧美一级视频免费在线观看| 亚洲视频一区在线观看| 欧美午夜电影完整版| 国产精品99久久久久久白浆小说 | 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲国产日韩在线一区模特| 久久久久久欧美| 伊人一区二区三区久久精品| 久久综合久久综合久久综合| 久久久免费精品视频| 亚洲国产精品一区二区www| 久久一综合视频| 久久综合九色九九| 亚洲精品久久| 99精品视频一区| 国产精品亚洲欧美| 久久躁狠狠躁夜夜爽| 久久这里有精品15一区二区三区| 怡红院精品视频在线观看极品| 免费欧美在线视频| 欧美精品日日鲁夜夜添| 亚洲一区日韩在线| 欧美一区二区三区日韩视频| 在线观看视频一区| 亚洲精品免费观看| 国产日产欧美精品| 欧美激情一区二区在线| 欧美日韩美女在线| 久久精品国产久精国产一老狼| 久久精品国产综合| 一本色道久久综合亚洲精品婷婷| 亚洲网站在线看| 在线国产精品播放| 亚洲九九精品| 精品成人在线观看| 亚洲精品中文字幕在线观看| 国产欧美亚洲一区| 亚洲激情一区二区三区| 国产麻豆精品视频| 亚洲欧洲午夜| 一区视频在线看| 一区二区三区四区国产| 在线播放日韩专区| 亚洲一区二区免费视频| 亚洲欧洲日夜超级视频| 午夜免费在线观看精品视频| 日韩视频二区| 老司机精品久久| 亚洲欧美日韩国产综合在线| 久久亚洲精品欧美| 久久精品成人一区二区三区| 欧美激情亚洲综合一区| 国产精品久久久久影院色老大| 麻豆精品视频| 国产欧美亚洲视频| 在线亚洲成人| 一区二区三区久久久| 久久综合给合久久狠狠色 | 亚洲欧洲日产国码二区| 久久爱www久久做| 午夜精品久久久久99热蜜桃导演| 欧美不卡视频| 老司机午夜精品视频在线观看| 国产精品国产a| 一本在线高清不卡dvd| 日韩一级免费观看| 欧美 日韩 国产在线| 久久夜色精品国产欧美乱| 国产精品综合不卡av | 欧美日韩免费在线观看| 欧美丰满少妇xxxbbb| 伊人色综合久久天天五月婷| 欧美自拍偷拍| 久久夜色精品国产欧美乱| 国产婷婷色一区二区三区四区 | 亚洲尤物在线视频观看| 亚洲午夜精品视频| 欧美日韩三级| 中文欧美在线视频| 午夜精品免费| 国产午夜精品一区二区三区欧美| 亚洲欧美一区二区视频| 久久精品国产久精国产爱| 韩国女主播一区| 久久精品天堂| 欧美顶级少妇做爰| 亚洲精品日韩久久| 欧美日韩国产综合网| 在线视频日本亚洲性| 午夜精品短视频| 国产综合18久久久久久| 麻豆精品一区二区综合av| 亚洲高清二区| 亚洲欧美另类综合偷拍| 国产在线视频欧美一区二区三区| 久久国产直播| 亚洲欧洲日韩综合二区| 欧美亚洲免费高清在线观看| 国产午夜精品理论片a级探花| 久久国产精品久久久久久久久久| 久久综合一区| 一本久道久久综合婷婷鲸鱼| 欧美午夜在线| 久久精品五月| 在线一区日本视频| 蜜臀av一级做a爰片久久| 99精品欧美一区二区三区| 国产精品久久久久久久一区探花| 欧美一区二区福利在线| 亚洲国产婷婷香蕉久久久久久99| 一区二区三区视频免费在线观看| 国产精品一区二区久久精品| 久久综合久久综合九色| 一区二区三区欧美视频| 久久综合色婷婷| 亚洲一区二区三区国产| 尤物九九久久国产精品的特点 | 亚洲天堂成人在线观看| 国产午夜精品久久久| 欧美女同视频| 久久精品在线免费观看| 99在线热播精品免费| 久久色在线观看| 香蕉久久夜色| 一区二区三区福利| 亚洲高清一区二| 国产一区二区你懂的| 欧美日韩午夜视频在线观看| 久久永久免费| 欧美一区在线视频| 国产精品99久久久久久人| 亚洲国产精品悠悠久久琪琪| 久久狠狠一本精品综合网| 亚洲深爱激情| 亚洲毛片在线观看.| 在线成人激情视频| 国产一区视频观看| 国产精品一区二区在线观看| 欧美日韩精品一本二本三本|