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

天行健 君子當自強而不息

Putting Together a Full Game(15)

 

Handling Bartering

Previously you read about how the barter_frame state is used to render the bartering
scene in which the player can buy items from a character.

How does that state know what items to sell? The only way the game initiates the
bartering state is when a script triggers it via the Barter-with-Character script action.
That action, in turn, calls cApp::setup_barter, which configures the information
needed for the barter_frame function. This information includes the character that is
selling the items, as well as the filename of the character inventory control system
(ICS) item file:

void cApp::setup_barter(const char* ics_file)
{
    strcpy(g_barter_ics_file, ics_file);

    m_state_manager.push(barter_frame, 
this);
}

The barter_frame state function scans the ICS that was loaded, displaying every item
contained with the character’s inventory list on the screen. If the player clicks an
item and the player has the appropriate amount of money, that item is bought.
Once the player finishes dealing with the shopkeeper, the barter state is popped
from the state stack, and game-play returns.

 

Playing Sounds and Music

Music and other sounds are played during the game. Those game sounds, although
somewhat cheesy (as you can tell, I’m no recording artist!), are played by a call to
play_sound. The only argument to play_sound is an index number to an array of sound
files that you declare at the beginning of the application code:

To play one of the valid sounds, you use the following function:

void cApp::play_sound(long index)
{
    
if(index >= 0 && index < array_num(g_sound_files))
    {
        m_sound_data.free();

        
if(m_sound_data.load_wav(g_sound_files[index]))
            m_sound_channel.play(&m_sound_data, 100, 1);
    }
}

The play_sound function needs to load the sound to play, using the cSoundData object.
From there, the sound is played from memory. In much the same way that you call
the play_sound function, you can play different songs using the play_music function.

The play_music function also takes an index number into an array of song filenames.

No need for tracking the number of songs here (we're living on the wild side!), so
you can jump right into the play_music function:

void cApp::play_music(long index)
{
    
// do not botther changing song if same already playing
    if(g_cur_music == index)
        
return;

    m_music_channel.stop();
    m_music_channel.free();

    
// Fade music out, giving DirectMusic enough time to finish up last song or else new song doesn't play correctly.  
    // The 700 is based on play volume of music, so adjust ahead.

    DWORD timer = timeGetTime() + 700;

    
while(timeGetTime() < timer)
    {
        DWORD level = (timer - timeGetTime()) / 10;
        m_music_channel.set_volume(level);
    }

    
// load and play new song
    m_music_channel.load(g_music_files[index]);
    m_music_channel.play(70, 0);

    g_cur_music = index;
}

Before continuing, you want to check whether a song is currently playing. A global
variable keeps track of which song was last played, and if that song is still playing,
you don’t need to start playing the same song again (the current song continues to
play). If a new song is to be played, fade out the volume, free the current song,
load the new song, and start playing the music playing.

 

Other functions:

int PASCAL WinMain(HINSTANCE inst, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    DWORD pos_x = (get_screen_width()  - CLIENT_WIDTH) / 2;
    DWORD pos_y = (get_screen_height() - CLIENT_HEIGHT) / 4;

    build_window(inst, "GameClass", g_title_name, 
                 WS_BORDER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
                 pos_x, pos_y, CLIENT_WIDTH, CLIENT_HEIGHT);

    cApp app;
    app.run();

    
return 0;
}

void cGameSpells::play_spell_sound(long index)
{
    m_app->play_sound(index);
}

/*********************************************************************************************************/

void cApp::win_game()
{
    m_state_manager.pop_all(
this);

    g_menu_options = MENU_LOAD;
    m_state_manager.push(menu_frame, 
this);
}

void cApp::start_of_combat()
{
    m_combat_exp   = 0;
    m_combat_money = 0;

    
// trigger start of combat script

    
char filename[MAX_PATH];
    sprintf(filename, "..\\Data\\SOC%lu.mls", m_scene_index);

    m_game_script.execute(filename);
}
 
void cApp::end_of_combat()
{
    g_player->char_def.money += m_combat_money;
    g_player->char_def.exp   += m_combat_exp;

    m_text_header.set_text("Victory!", COLOR_WHITE);
    m_text_window.set_text("", COLOR_WHITE);

    
char window_text[2000], gained[128];

    
// start constructing the main window text

    strcpy(window_text, "\r\n\n");

    
if(m_combat_money)
    {
        sprintf(gained, "Gained %lu gold!\r\n", m_combat_money);
        strcat(window_text, gained);
    }

    sprintf(gained, "Gained %lu experience!\r\n", m_combat_exp);
    strcat(window_text, gained);    

    
// process level up
    for(int i = 0; i < array_num(g_level_up_exp); i++)
    {
        
if(g_player->char_def.exp >= g_level_up_exp[i] && g_player->char_def.level < i+2)
        {
            g_player->char_def.level = i+2;
            strcat(window_text, "Level up!\r\n");

            
// add bonuses for leveling up

            g_player->char_def.health_points += 10;
            g_player->char_def.mana_points   += 10;
            g_player->char_def.attack        += 4;
            g_player->char_def.defense       += 2;
            g_player->char_def.agility       += 2;
            g_player->char_def.resistance    += 2;
            g_player->char_def.mental        += 2;
            g_player->char_def.to_hit        += 10;

            strcat(window_text, "Stats up!\r\n");

            
// learn spells
            if(g_player->char_def.level < SPELL_LEARN_TOP_LEVEL)
            {
                g_player->char_def.magic_spell[0] |= (1 << i);
                sprintf(gained, "Learned spell %s\r\n", m_game_spells.get_spell(i)->name);
                strcat(window_text, gained);
            }

            
// max health and mana to match definition
            g_player->health_points = g_player->char_def.health_points;
            g_player->mana_points   = g_player->char_def.mana_points;
        }
    }

    
// lock the keyboard and mouse
    m_keyboard.m_locks[KEY_SPACE] = true;
    m_keyboard.set_key_state(KEY_SPACE, 
false);
    m_mouse.m_locks[MOUSE_LBUTTON] = 
true;
    m_mouse.set_button_state(MOUSE_LBUTTON, 
false);

    
// render the scene while waiting for key press or button press
    for(;;)
    {
        
// break when space pressed

        m_keyboard.acquire();
        m_keyboard.read();

        
if(m_keyboard.get_key_state(KEY_SPACE))
            
break;

        
// break when left mouse button pressed

        m_mouse.acquire();
        m_mouse.read();

        
if(m_mouse.get_button_state(MOUSE_LBUTTON))
            
break;

        
// render the scene and text window

        clear_display_zbuffer(1.0f);

        begin_display_scene();        

        render_frame(0);

        m_text_window.render(window_text, COLOR_WHITE);
        m_text_header.render(NULL, COLOR_WHITE);

        end_display_scene();

        present_display();
    }

    
// trigger end of combat script

    
char filename[MAX_PATH];
    sprintf(filename, "..\\Data\\EOC%lu.mls", m_scene_index);

    m_game_script.execute(filename);
}

bool cApp::last_point_reached(sCharacter* character)
{
    
if(character == NULL || character->ai != CHAR_ROUTE)
        
return false;

    
long last_index = character->num_points - 1;
    sRoutePoint* last_point = &character->route[last_index];

    
// determine if character has reached point

    
float x_diff = fabs(character->pos_x - last_point->pos_x);
    
float y_diff = fabs(character->pos_y - last_point->pos_y);
    
float z_diff = fabs(character->pos_z - last_point->pos_z);

    
float dist = x_diff * x_diff + y_diff * y_diff + z_diff * z_diff;
    
float radius = m_game_chars.get_xz_radius(character) * 0.25f;

    
// return true if point being touched
    return (dist < radius * radius);
}

posted on 2007-12-30 14:26 lovedday 閱讀(329) 評論(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>
            亚洲电影在线看| 国产精品亚洲网站| 免费观看30秒视频久久| 日韩一级裸体免费视频| 欧美—级在线免费片| 久久精品在线免费观看| 亚洲一区久久久| 亚洲黑丝一区二区| 尤物在线观看一区| 国产精品丝袜91| 亚洲专区一二三| 久久综合久久综合九色| 午夜精品视频在线观看| 99在线观看免费视频精品观看| 亚洲综合色丁香婷婷六月图片| 一本色道久久综合亚洲精品按摩| 亚洲激情另类| 亚洲精品午夜| 韩国亚洲精品| 亚洲高清成人| 亚洲国产日韩综合一区| 亚洲电影免费观看高清完整版| 国产精品尤物福利片在线观看| 国产精品久久久久久久久动漫 | 一区二区三区欧美成人| 99亚洲视频| 亚洲一区二区三区四区中文| 一区二区三区四区国产| 一本色道久久综合亚洲精品高清| 亚洲国产一区在线| 亚洲美女免费精品视频在线观看| 亚洲精品欧美日韩专区| 亚洲香蕉伊综合在人在线视看| 亚洲综合国产激情另类一区| 久久福利影视| 久久日韩粉嫩一区二区三区| 欧美福利专区| 亚洲手机在线| 亚洲视频精品| 久久久久国产精品一区三寸 | 欧美日本在线一区| 欧美激情视频在线播放| 国产精品福利av| 激情成人av在线| 99精品欧美| 在线综合视频| 麻豆成人在线| 99在线观看免费视频精品观看| 午夜国产精品影院在线观看| 欧美 日韩 国产一区二区在线视频| 欧美日韩一二区| 国产色产综合色产在线视频| 亚洲精品乱码久久久久久蜜桃麻豆| 在线观看成人av电影| 在线视频精品一| 久久久噜噜噜久噜久久| 亚洲日本中文字幕区| 亚洲自拍16p| 欧美激情aⅴ一区二区三区| 国产视频精品免费播放| 亚洲精品日韩在线观看| 久久成年人视频| 国产精品久久久久久亚洲调教| 国产女主播一区二区三区| 国产亚洲一区二区三区在线播放| 亚洲精品日韩一| 欧美黄色aaaa| 久久综合久色欧美综合狠狠 | 狠狠做深爱婷婷久久综合一区| 久久精品视频亚洲| 欧美在线视屏| 一区二区三区自拍| 欧美激情在线观看| 欧美日韩成人网| 午夜精品成人在线| 性久久久久久久| 樱花yy私人影院亚洲| 欧美激情国产日韩| 欧美日韩国产精品自在自线| 亚洲女爱视频在线| 欧美在线观看天堂一区二区三区 | 亚洲高清自拍| 亚洲精品网址在线观看| 国产精品久久一区主播| 久久精品国产视频| 欧美1区3d| 亚洲综合首页| 久久精品中文字幕一区| 亚洲人精品午夜在线观看| 日韩小视频在线观看| 国产欧美精品日韩| 欧美国产专区| 国产精品日韩久久久久| 嫩草成人www欧美| 国产精品成人av性教育| 久久综合亚洲社区| 欧美日韩精品免费| 久久一本综合频道| 欧美日韩精品综合| 久久久久久久综合狠狠综合| 欧美黄色视屏| 久久精品中文| 欧美女同在线视频| 久久亚洲精品一区二区| 国产精品大片| 亚洲激情在线| 伊人成年综合电影网| 亚洲一区二区三区精品在线| 最新国产乱人伦偷精品免费网站| 亚洲欧美精品在线观看| 夜夜精品视频一区二区| 久久久久88色偷偷免费| 欧美亚洲专区| 欧美日韩亚洲一区二区三区四区| 免费看的黄色欧美网站| 国产啪精品视频| 一本一本久久a久久精品综合妖精| 亚洲福利小视频| 久久久蜜桃精品| 久久久夜精品| 国产一区二区三区直播精品电影 | 久久综合九色综合欧美就去吻| 亚洲女人av| 欧美精品在线观看91| 两个人的视频www国产精品| 国产精品自拍在线| 一区二区三区回区在观看免费视频| 亚洲精品少妇网址| 久热精品在线视频| 免费视频最近日韩| 在线观看日韩欧美| 久久夜色精品国产噜噜av| 久久五月激情| 国产亚洲一级高清| 欧美制服丝袜第一页| 久久久久.com| 一区二区在线看| 久久久精品国产免大香伊| 久久久久99精品国产片| 国产午夜精品福利| 欧美中文日韩| 欧美成人69| 亚洲精品乱码久久久久久日本蜜臀| 免费亚洲电影在线观看| 亚洲电影观看| 一区二区三区精品视频在线观看 | 国产精品久久久久久久9999| 亚洲视频电影图片偷拍一区| 午夜激情一区| 国产一区二区三区免费不卡| 欧美在线一级视频| 女生裸体视频一区二区三区| 亚洲国产精品一区二区第四页av | 欧美在线视频观看| 黄色一区二区在线观看| 久久综合一区二区| 亚洲日本欧美日韩高观看| 亚洲综合国产| 黄网站色欧美视频| 欧美激情偷拍| 亚洲欧美99| 欧美激情小视频| 亚洲天堂av图片| 国产一区二区三区丝袜| 欧美国产精品人人做人人爱| 亚洲午夜激情| 久久亚洲综合色一区二区三区| 亚洲国语精品自产拍在线观看| 欧美日韩国产精品| 性8sex亚洲区入口| 亚洲第一成人在线| 性色av一区二区三区在线观看| 激情成人亚洲| 欧美视频一区二区三区四区| 午夜欧美大片免费观看| 欧美国产激情二区三区| 羞羞漫画18久久大片| 亚洲国产精选| 国产精品久久久久久久久果冻传媒| 久久免费精品视频| 中文在线资源观看网站视频免费不卡| 久久精品欧洲| 99这里只有久久精品视频| 国产综合视频在线观看| 欧美精品一区二区三| 久久er精品视频| 99riav国产精品| 欧美黄色aaaa| 久久久777| 亚洲与欧洲av电影| 亚洲国产精品成人一区二区| 久久国产精彩视频| 亚洲天堂网站在线观看视频| 在线免费日韩片| 国产欧美一区二区三区国产幕精品| 欧美顶级艳妇交换群宴| 欧美在线免费视频| 亚洲视频一区在线观看| 亚洲精品一区二区三区不| 免费试看一区|