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

天行健 君子當(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>
            亚洲国产成人精品视频| 欧美午夜在线观看| 亚洲欧美日韩精品久久久久| 久久国产88| 亚洲国产精品精华液2区45 | 伊人久久久大香线蕉综合直播 | 国产精品一区二区视频| 国内精品久久久久影院 日本资源| 欧美大尺度在线| 久久爱www久久做| 国产日韩欧美日韩| 久久久精品国产免费观看同学 | 美女久久一区| 亚洲午夜av在线| 欧美成人免费小视频| 亚洲国产精品成人精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 午夜精品久久久久久久男人的天堂 | 亚洲综合社区| 亚洲国产精品123| 久色婷婷小香蕉久久| 亚洲精品日韩精品| 牛人盗摄一区二区三区视频| 国产精品一区在线播放| 最近中文字幕日韩精品| 欧美激情精品久久久久| 亚洲人成网站777色婷婷| 一个色综合导航| 欧美成人免费视频| 亚洲一区二区三区777| 亚洲精品自在久久| 国产精品高清在线| 久久精品国产成人| 亚洲精品影视| 欧美区高清在线| 亚洲精品欧美日韩| 欧美在线不卡视频| 亚洲福利视频一区二区| 欧美~级网站不卡| 亚洲人成高清| 久久九九精品| 美女性感视频久久久| 久久精品国产亚洲一区二区| 欧美性做爰猛烈叫床潮| 亚洲主播在线| 免费在线欧美视频| 亚洲国产天堂网精品网站| 香蕉视频成人在线观看 | 99在线精品观看| 亚洲精品免费在线观看| 国产精品美女www爽爽爽| 亚洲一区二区三区免费视频| 影音先锋成人资源站| 欧美成人免费小视频| 亚洲激情不卡| 欧美日韩在线大尺度| 亚洲人成网站精品片在线观看| 禁久久精品乱码| 国产精品普通话对白| 久久全国免费视频| 亚洲欧美日韩精品久久亚洲区| 午夜一区在线| 亚洲欧洲一区| 欧美成人一品| 一本大道久久a久久精品综合| 国产精品午夜春色av| 国产精品白丝jk黑袜喷水| 午夜欧美视频| 毛片基地黄久久久久久天堂| 欧美综合国产精品久久丁香| 久久亚洲欧美| 欧美日韩亚洲不卡| 蜜臀久久99精品久久久久久9| 欧美三级在线| 影音先锋久久精品| 91久久久在线| 欧美午夜不卡| 国产嫩草一区二区三区在线观看| 午夜久久电影网| 一本色道久久精品| 久久久免费观看视频| 欧美激情导航| 亚洲一区二区欧美日韩| 亚洲图片你懂的| 欧美粗暴jizz性欧美20| 亚洲精品资源美女情侣酒店| 久久久久久亚洲精品中文字幕 | 亚洲五月婷婷| 欧美亚洲三区| 久热精品在线视频| 在线亚洲免费| 欧美日本久久| 国产一区导航| 校园激情久久| 亚洲一区日韩在线| 久久久夜精品| 激情视频亚洲| 激情成人av| 欧美在线综合视频| 亚洲福利视频一区| 免费成人黄色| 在线欧美亚洲| 亚洲国产精品一区二区www| 亚洲精品中文字幕在线观看| 欧美激情精品久久久久久大尺度| 国产专区综合网| 久久综合狠狠综合久久综青草 | 国产日韩一区在线| 欧美中文字幕久久| 老司机午夜精品视频| 在线亚洲欧美视频| 国产精品久久久久免费a∨| 久久av免费一区| 久久久噜噜噜久久久| 亚洲日本欧美日韩高观看| 蜜桃av综合| 久久久亚洲欧洲日产国码αv| 欧美视频日韩视频| 欧美在线不卡| 久久精品一区二区三区四区| 亚洲第一精品久久忘忧草社区| 亚洲乱码国产乱码精品精| 国产精品www网站| 在线亚洲国产精品网站| 国产精品国产三级国产专播品爱网| 欧美风情在线观看| 91久久久久久久久| 亚洲欧美视频在线观看| 国产亚洲在线| 欧美专区在线观看| 久久综合电影| 影音先锋久久| 午夜在线一区| 亚洲在线观看| 欧美日韩亚洲综合| 中文av一区特黄| aa级大片欧美| 欧美日韩精品一区二区在线播放| 亚洲人屁股眼子交8| 亚洲色图在线视频| 在线看日韩av| 欧美激情视频一区二区三区在线播放 | 久久久久欧美精品| 一区二区三区四区五区视频| 国产精品伦理| 欧美顶级大胆免费视频| 久久精品国产久精国产爱| 国内久久婷婷综合| 欧美综合二区| 亚洲九九精品| 国产日韩欧美精品在线| 久久精品国产亚洲5555| 亚洲视频碰碰| 欧美激情视频给我| 亚洲国产一区在线| 亚洲第一精品夜夜躁人人躁| 久久久久久伊人| 亚洲免费在线看| 欧美a级片网站| 欧美在线看片| 亚洲欧美在线网| 国产在线乱码一区二区三区| 欧美高清视频一二三区| 欧美诱惑福利视频| 亚洲人成在线影院| 日韩系列在线| 国产亚洲欧美一区| 欧美日韩免费一区二区三区| 欧美日韩综合网| 欧美国产精品中文字幕| 亚洲欧美综合一区| 性色一区二区三区| 欧美中文在线观看| 欧美高清在线| 久久免费视频网站| 99热免费精品在线观看| 国产日韩视频一区二区三区| 欧美日韩一视频区二区| 欧美激情综合色综合啪啪| 久久精品综合| 欧美理论在线| 欧美日韩国产色站一区二区三区| 另类天堂av| 久久综合色影院| 国产日韩欧美一二三区| 欧美日韩卡一卡二| 国产精品亚洲综合久久| 国产精品成人在线观看| 亚洲欧美中日韩| 久久一区二区三区国产精品| 亚洲国产女人aaa毛片在线| 亚洲精品一区二区三区99| 亚洲人久久久| 欧美福利精品| 国产精品v日韩精品v欧美精品网站| 国产精品v日韩精品| 日韩一区二区精品视频| 亚洲日本理论电影| 欧美先锋影音| 久久av老司机精品网站导航|