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

天行健 君子當自強而不息

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| 日韩一级在线| 久久久久高清| 国产精品久久久一区二区| 欧美日韩国产在线播放网站| 国产欧美日韩三区| 亚洲调教视频在线观看| 欧美护士18xxxxhd| 久久精品国产亚洲a| 国产精品欧美精品| 亚洲日本理论电影| 亚洲国产黄色| 久久久久网址| 久久激情五月婷婷| 国产精品久久久久免费a∨大胸| 一区二区av在线| 亚洲区一区二区三区| 久久精品国产综合| 久久综合狠狠| 久久久www| 精品动漫3d一区二区三区| 欧美在线观看一区二区| 亚洲精品视频一区二区三区| 美女国产一区| 国产精品成人一区二区| 亚洲图片欧美日产| 日韩午夜在线电影| 国产精品久久久久77777| 中文在线资源观看网站视频免费不卡| 久久婷婷激情| 一本一道久久综合狠狠老精东影业| 亚洲午夜日本在线观看| 女女同性精品视频| 夜夜夜久久久| 久久久精品日韩欧美| 免费成年人欧美视频| 欧美一级艳片视频免费观看| 欧美体内谢she精2性欧美| 一本久道久久综合狠狠爱| 亚洲美女区一区| 欧美日韩精品欧美日韩精品一| 激情综合色综合久久| 欧美激情亚洲激情| 欧美国产日韩二区| 亚洲午夜一区二区| 欧美一区日韩一区| 亚洲精品中文字幕有码专区| 最新国产の精品合集bt伙计| 亚洲一区日本| 精品动漫3d一区二区三区免费| 欧美激情第三页| 欧美午夜欧美| 久久激情视频久久| 国产精品久久久久久久久免费| 日韩视频在线一区二区三区| 亚洲人永久免费| 国产精品二区三区四区| 午夜精品三级视频福利| 久久久久久久久久久久久女国产乱 | 国产精品久久久99| 久久久久久一区| 久久久久久久久久看片| 日韩视频永久免费观看| 亚洲综合日韩中文字幕v在线| 欧美大片网址| 欧美一区二区三区啪啪| 久久综合久久综合久久| 亚洲一区激情| 久久久人成影片一区二区三区| 国内精品一区二区| 亚洲卡通欧美制服中文| 红桃视频国产精品| 在线一区日本视频| 亚洲人成亚洲人成在线观看图片 | 韩国精品久久久999| 欧美成人午夜影院| 久久久午夜视频| 久久亚洲精品一区二区| 亚洲性线免费观看视频成熟| 久久久精品国产免大香伊| 亚洲一区二区视频在线观看| 久久深夜福利| 国内精品美女在线观看| 亚洲综合欧美日韩| 99亚洲一区二区| 久久婷婷国产综合精品青草| 黄色另类av| 一区二区三区免费观看| 日韩午夜高潮| 久久成年人视频| 亚洲自拍电影| 欧美sm重口味系列视频在线观看| 久久大逼视频| 国产精品成人免费| 一本色道久久综合亚洲精品不 | 久久精品亚洲一区| 久久精品一本久久99精品| 国产精品av一区二区| 久久久精品2019中文字幕神马| 欧美日韩高清在线一区| 日韩一级视频免费观看在线| 99热精品在线观看| 亚洲欧美电影院| 亚洲一区二区三区在线看| 国产精品久久久久久久久久免费看| 亚洲精品日韩精品| 国产精品人成在线观看免费 | 国内精品久久久久久久影视蜜臀| 中文国产一区| 香蕉视频成人在线观看| 亚洲欧美在线免费观看| 国产午夜亚洲精品不卡| 香蕉成人啪国产精品视频综合网| 亚洲日本欧美天堂| 国产精品久久久久久久久久ktv | 免费观看亚洲视频大全| 亚洲精品中文字幕女同| 久久久国产精品亚洲一区| 日韩午夜电影| 一区在线播放| 国产精品日韩精品欧美在线| 男人的天堂成人在线| 亚洲淫性视频| 亚洲免费观看在线观看| 欧美成ee人免费视频| 久久精品夜色噜噜亚洲aⅴ| 亚洲特色特黄| 99国产精品久久久| 亚洲国产精品电影| 激情久久一区| 国产在线视频欧美| 国产九区一区在线| 国产精自产拍久久久久久| 欧美日韩一区在线观看视频| 欧美国产精品v| 麻豆成人综合网| 另类专区欧美制服同性| 欧美在线播放视频| 亚洲男人天堂2024| 亚洲专区一区二区三区| 亚洲私拍自拍| 午夜国产不卡在线观看视频| 亚洲网站在线| 亚洲一区图片| 午夜精品一区二区三区在线| 亚洲欧美中文日韩在线| 亚洲一区欧美二区| 午夜精品一区二区三区在线视 | 一本色道久久综合精品竹菊 | 欧美激情亚洲| 亚洲国产老妈| 亚洲日本在线观看| 一区二区三区精品视频| 一区二区欧美在线观看| 在线一区免费观看| 午夜精品三级视频福利| 久久狠狠久久综合桃花| 久久免费视频网站| 欧美激情免费观看| 国产精品久久久久久久一区探花| 国产精品久久福利| 狠狠色伊人亚洲综合成人| 在线日韩成人| 一区二区久久久久久| 亚洲欧美精品在线观看| 久久精品夜色噜噜亚洲aⅴ| 久久伊人一区二区| 亚洲欧洲三级| 欧美一级视频免费在线观看| 久久在线免费观看| 欧美日韩亚洲一区二区三区四区| 国产精品久久久久aaaa九色| 国语自产精品视频在线看抢先版结局| 精品不卡一区| 宅男66日本亚洲欧美视频| 久久久久久久欧美精品| 亚洲高清影视| 午夜国产欧美理论在线播放 | 亚洲一区bb| 久久久久久一区二区三区| 欧美另类videos死尸| 国产婷婷一区二区| 亚洲精品一级| 久久精品国亚洲| 99riav久久精品riav| 久久久久一区| 国产精品免费一区二区三区观看| 在线视频国产日韩| 欧美一区二区三区在线观看视频| 欧美 日韩 国产精品免费观看| 国产亚洲视频在线| 99国产一区| 久久亚洲综合网| 亚洲午夜电影| 欧美激情一区二区三级高清视频| 国产一区二区三区久久| 亚洲一卡久久| 亚洲激情影院| 免费人成精品欧美精品|