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

天行健 君子當自強而不息

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>
            欧美大香线蕉线伊人久久国产精品| 乱人伦精品视频在线观看| 亚洲精品美女| 欧美精品久久99| 一本一本久久a久久精品综合麻豆| 亚洲国语精品自产拍在线观看| 免费一级欧美在线大片| 一区二区三区**美女毛片 | 在线精品视频一区二区三四| 欧美成人午夜激情在线| 欧美精品一区二区三区久久久竹菊| 99re这里只有精品6| 在线综合亚洲欧美在线视频| 国产午夜久久久久| 欧美国产激情| 国产精品美女| 欧美成人精品h版在线观看| 欧美日本中文字幕| 久久免费国产| 欧美精品在线观看播放| 久久丁香综合五月国产三级网站| 久久综合色婷婷| 亚洲视频网在线直播| 久久精品99国产精品| 99国产精品久久久久久久久久| 亚洲影音先锋| 亚洲国内高清视频| 亚洲在线观看| 亚洲精品男同| 性色av香蕉一区二区| 99re热这里只有精品视频| 亚洲欧美日韩另类| 一本大道久久精品懂色aⅴ| 先锋资源久久| 亚洲午夜久久久久久久久电影网| 久久不射电影网| 亚洲一区久久久| 免费成人高清| 另类图片国产| 国产麻豆精品theporn| 亚洲久久在线| 亚洲国产精品v| 欧美一级视频免费在线观看| 在线亚洲免费视频| 欧美 日韩 国产在线| 久久精品亚洲乱码伦伦中文| 欧美性猛交xxxx乱大交退制版 | 亚洲国产精品一区在线观看不卡| 一本色道久久综合| 99视频在线观看一区三区| 久久久久久亚洲精品杨幂换脸| 亚洲欧美卡通另类91av| 欧美精品激情| 亚洲国产一成人久久精品| 在线成人免费观看| 欧美在线免费播放| 欧美一区二区久久久| 国产精品xnxxcom| 99国产精品久久久久老师| 99视频一区二区三区| 欧美久久久久久久久久| 91久久嫩草影院一区二区| 亚洲三级影片| 欧美高清视频在线播放| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美成人免费大片| 亚洲电影自拍| 牛牛国产精品| 最新热久久免费视频| 亚洲毛片网站| 欧美精品免费视频| av成人激情| 欧美一区二区黄色| 韩国欧美国产1区| 久久久久网址| 亚洲国产色一区| 日韩香蕉视频| 欧美午夜精品久久久久免费视| 一道本一区二区| 欧美在线视频二区| 精品不卡视频| 欧美精品二区| 亚洲一区二区三区涩| 久久精品毛片| 亚洲国产高清一区二区三区| 欧美成人一区二区三区在线观看| 亚洲国产精品综合| 亚洲欧美国产日韩天堂区| 国产专区精品视频| 欧美国产亚洲视频| 亚洲男人的天堂在线aⅴ视频| 久久精精品视频| 亚洲国产欧美一区二区三区同亚洲 | 欧美成人中文| 亚洲一区精品在线| 欧美1区视频| 亚洲午夜av| 国产在线视频欧美| 欧美日韩国产精品一区二区亚洲| 亚洲在线电影| 最新国产の精品合集bt伙计| 亚洲欧美综合精品久久成人 | 欧美国产视频日韩| 午夜精品久久久久久久白皮肤| 女人色偷偷aa久久天堂| 亚洲小视频在线观看| 在线观看日韩一区| 国产精品久久久久aaaa樱花| 久久久久久久一区| 亚洲午夜视频| 亚洲高清在线观看| 久久九九热re6这里有精品| 99精品国产在热久久| 狠狠久久五月精品中文字幕| 欧美色另类天堂2015| 久久影视精品| 性欧美video另类hd性玩具| 亚洲免费成人av电影| 欧美高清视频在线观看| 久久精品视频免费| 午夜一区二区三视频在线观看| 亚洲精品一二| 亚洲国产日韩在线| 国产在线播精品第三| 欧美午夜影院| 欧美日韩亚洲在线| 欧美精品123区| 久久一区二区三区四区| 欧美自拍偷拍午夜视频| 国产精品99久久久久久久vr | 久久久www成人免费无遮挡大片| 中文精品一区二区三区 | 国产精品久久久久久久久免费桃花| 欧美成年人视频网站欧美| 久久亚洲影音av资源网| 欧美在线黄色| 久久激情久久| 久久av老司机精品网站导航| 亚洲欧美日韩一区二区三区在线观看| 夜夜嗨网站十八久久| 一区二区三区久久精品| 日韩视频在线播放| 日韩一级精品视频在线观看| 亚洲精品一区二区三区在线观看| 亚洲黄色一区| 亚洲理论在线观看| 日韩午夜在线播放| 亚洲视频欧洲视频| 亚洲欧洲av一区二区| 午夜精品影院| 久久久久久精| 欧美高清视频在线| 欧美日韩精品久久| 国产精品乱子乱xxxx| 国产欧美视频一区二区三区| 国产三区二区一区久久| 韩国亚洲精品| 亚洲人成人一区二区三区| 99re6这里只有精品视频在线观看| 99国产精品久久久久老师| 亚洲综合色在线| 久久成人一区| 欧美国产日韩精品| 艳妇臀荡乳欲伦亚洲一区| 亚洲一区欧美| 久久综合狠狠综合久久激情| 欧美激情91| 国产精品久久看| 在线视频国产日韩| 亚洲一区二区三区四区中文| 欧美影院视频| 欧美激情视频在线播放| 亚洲毛片播放| 久久国产88| 欧美日韩影院| 国产在线精品一区二区中文| 亚洲精品国产日韩| 先锋影音国产精品| 欧美风情在线| 亚洲一区二区免费在线| 另类激情亚洲| 国产精品专区h在线观看| 亚洲第一主播视频| 亚洲欧美中文在线视频| 欧美成人中文| 亚洲欧美一区二区视频| 欧美激情视频在线播放| 国产婷婷一区二区| 夜夜狂射影院欧美极品| 久久在线91| 亚洲天堂成人| 欧美激情精品久久久久久免费印度| 国产精自产拍久久久久久| 亚洲精品免费在线播放| 久久久久女教师免费一区| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲激情在线视频| 久久精品欧洲| 国产欧美一区二区三区沐欲 | 国产亚洲亚洲|