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

天行健 君子當(dāng)自強(qiáng)而不息

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) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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国产精品| 蜜臀av在线播放一区二区三区| 久久爱www.| 亚洲午夜精品久久久久久浪潮| 亚洲日韩欧美视频一区| 亚洲人被黑人高潮完整版| 亚洲国产高潮在线观看| 亚洲国产精品一区二区www| 亚洲丰满在线| 在线亚洲观看| 久久久久久一区| 女主播福利一区| 最新亚洲一区| 99在线精品观看| 欧美一区二区三区在线播放| 午夜精品福利在线观看| 久久精品国产91精品亚洲| 久久久久久久性| 久久三级福利| 欧美高清视频www夜色资源网| 欧美激情中文字幕一区二区| 欧美日韩一区二区视频在线 | 国产日产欧美一区| 国产一二三精品| 欧美.日韩.国产.一区.二区| 亚洲国产乱码最新视频| 好看的av在线不卡观看| 伊人久久大香线蕉av超碰演员| 精品成人免费| 欧美一区亚洲二区| 日韩视频―中文字幕| 国产精品一区二区三区四区| 久久av一区| 亚洲激情网址| 欧美亚洲自偷自偷| 欧美阿v一级看视频| 一区二区三区四区蜜桃| 久久伊人精品天天| 国产精品久久77777| 亚洲国产精品123| 午夜亚洲一区| 亚洲伦理自拍| 欧美精品激情在线| 亚洲国产精品一区在线观看不卡| 午夜激情亚洲| 国产综合色精品一区二区三区| 国户精品久久久久久久久久久不卡| 国产精品捆绑调教| 亚洲精品视频在线观看免费| 欧美在线视频观看免费网站| 99精品视频网| 欧美色视频一区| 一区二区三区久久| 亚洲第一在线视频| 翔田千里一区二区| 国产日韩一区二区| 欧美中日韩免费视频| 亚洲欧美激情视频在线观看一区二区三区| 欧美精品一区二区三区久久久竹菊 | 你懂的成人av| 亚洲欧美中文日韩v在线观看| 欧美视频二区36p| 性久久久久久久久| 国产精品亚洲综合天堂夜夜| 99re66热这里只有精品4| 最新日韩在线视频| 欧美日韩一区二区在线观看| 日韩午夜电影| 999亚洲国产精| 国产精品每日更新| 激情成人综合| 极品日韩久久| 麻豆成人在线播放| 欧美va亚洲va香蕉在线| 日韩视频免费| 91久久在线播放| 欧美婷婷久久| 欧美一级在线视频| 欧美一区二区三区免费视频| 国内免费精品永久在线视频| 欧美成人伊人久久综合网| 欧美激情在线观看| 性色av一区二区三区在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 国产三级精品在线不卡| 蜜桃视频一区| 欧美日韩国产精品一区二区亚洲| 在线亚洲一区观看| 欧美一区二区在线| 99成人精品| 欧美影院在线| 91久久中文| 午夜一区不卡| 亚洲精品在线观| 欧美亚洲专区| 日韩午夜av| 久久久亚洲国产天美传媒修理工 | 久久精品国产91精品亚洲| 亚洲免费大片| 久久久综合免费视频| 亚洲天堂免费观看| 久久性天堂网| 性欧美大战久久久久久久久| 免费观看一级特黄欧美大片| 午夜老司机精品| 欧美精品三级在线观看| 久久综合色综合88| 国产精品亚洲а∨天堂免在线| 亚洲电影免费观看高清| 国产欧美日韩不卡免费| 亚洲免费成人| 亚洲人成在线观看一区二区| 欧美一级播放| 亚洲欧美日韩国产一区二区| 欧美成人一区二区在线| 久久嫩草精品久久久久| 国产精品入口福利| 日韩一区二区免费看| 99re这里只有精品6| 男人的天堂成人在线| 乱人伦精品视频在线观看| 国产欧美精品xxxx另类| 亚洲一区二区三区四区视频| 这里只有精品丝袜| 欧美不卡一卡二卡免费版| 欧美1区2区| 国产精品系列在线播放| 一区二区三区四区国产| 蜜桃av一区二区在线观看| 久久人人精品| 黄色成人在线网址| 午夜国产精品影院在线观看| 亚洲欧美成人一区二区在线电影| 欧美极品aⅴ影院| 亚洲日本成人在线观看| 亚洲毛片一区二区| 欧美高清视频一二三区| 亚洲国产精品成人一区二区| 亚洲欧洲综合另类| 欧美精品久久久久a| 亚洲日本在线观看| 一级成人国产| 国产精品h在线观看| 亚洲五月婷婷| 欧美在线关看| 激情综合色综合久久| 久久精品国产亚洲精品| 久久久久久久综合色一本| 精品电影在线观看| 欧美成人精品一区二区| 亚洲美女区一区| 久久www成人_看片免费不卡| 国产欧美一区二区精品秋霞影院| 欧美在线视频观看免费网站| 噜噜爱69成人精品| 日韩视频一区二区| 国产精品高清在线| 亚洲女人天堂av| 蜜臀av性久久久久蜜臀aⅴ| 亚洲激情在线| 国产精品日韩欧美一区二区| 久久成人精品一区二区三区| 欧美激情第8页| 亚洲一区二区三区激情| 国产欧美精品一区二区三区介绍| 久久裸体视频| 一区二区三区四区五区视频| 久久久精品日韩欧美| 亚洲人在线视频| 国产精品日日摸夜夜添夜夜av| 欧美中文字幕| 欧美激情1区| 欧美在线中文字幕| 日韩视频在线一区二区三区| 国产精品永久免费视频| 美日韩精品视频| 亚洲自拍偷拍网址| 欧美xart系列高清| 欧美亚洲一区在线| 亚洲国内在线| 国产精品亚洲人在线观看| 久久五月天婷婷| 夜夜嗨av色综合久久久综合网 | 欧美黄色小视频| 午夜国产精品视频免费体验区| 国产一区高清视频| 欧美金8天国| 久久免费高清视频| 亚洲一区中文字幕在线观看| 欧美激情中文字幕一区二区| 久久精品水蜜桃av综合天堂| 亚洲精品欧美在线| 国产一区二区日韩精品| 欧美区一区二区三区| 久久综合色影院| 久久久91精品国产一区二区精品| 亚洲综合国产精品| 日韩视频在线你懂得| 日韩视频免费在线| 国产欧美一区二区三区沐欲 |