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

天行健 君子當自強而不息

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| 国产精品白丝av嫩草影院| 欧美三区在线观看| 国产精品xxxxx| 国产精品外国| 在线免费观看一区二区三区| 激情av一区二区| 亚洲黄色影片| 亚洲午夜免费视频| 欧美在线一级va免费观看| 亚洲砖区区免费| 久久亚洲捆绑美女| 亚洲国产影院| 亚洲欧美99| 久久久福利视频| 欧美日韩精品综合在线| 国产视频一区三区| 91久久国产精品91久久性色| 一本色道久久综合狠狠躁篇的优点| 一区二区三区日韩精品视频| 久久精品免费看| 9色国产精品| 老司机午夜精品| 国产欧美日本一区二区三区| 亚洲精品美女在线观看| 欧美另类在线观看| 国产精品久久久久久久免费软件| 国产丝袜一区二区| 亚洲深夜影院| 欧美大片第1页| 亚洲一级一区| 欧美激情综合网| 在线看欧美视频| 久久精品国产免费观看| 亚洲精品一区二区网址 | 一区二区三区四区国产| 久久久久久电影| 亚洲深夜福利视频| 欧美激情在线狂野欧美精品| 国产在线成人| 久久精品国产亚洲高清剧情介绍| 亚洲美女精品成人在线视频| 久色婷婷小香蕉久久| 国语自产精品视频在线看一大j8| 亚洲一卡久久| 99国产精品99久久久久久| 免费观看30秒视频久久| 韩国一区二区在线观看| 欧美一区二区三区免费视频| 在线亚洲免费视频| 欧美午夜影院| 亚洲欧美清纯在线制服| 中文欧美字幕免费| 国产精品扒开腿爽爽爽视频 | 欧美精品久久一区二区| 亚洲激情偷拍| 欧美国产日本在线| 可以免费看不卡的av网站| 在线免费观看日本欧美| 免费成人黄色| 欧美成人精品| 一区二区高清在线| 亚洲乱码精品一二三四区日韩在线| 欧美**人妖| 一区二区不卡在线视频 午夜欧美不卡在 | 久久久久国产一区二区三区| 国产一区二区日韩精品| 久久躁日日躁aaaaxxxx| 久久视频在线视频| 亚洲高清不卡av| 亚洲国产日本| 欧美日韩一区二区三区免费看| 在线一区二区日韩| 亚洲永久在线| 国内久久精品| 亚洲国产一二三| 国产精品人成在线观看免费 | 欧美日韩综合另类| 亚洲最新在线| 亚洲一卡久久| 国模套图日韩精品一区二区| 久热精品视频在线观看一区| 欧美不卡在线视频| 亚洲综合视频一区| 久久国产精品久久w女人spa| 亚洲国产一区二区a毛片| 亚洲每日在线| 国产自产在线视频一区| 亚洲国产日韩欧美一区二区三区| 欧美午夜一区二区| 欧美r片在线| 国产精品久久九九| 欧美3dxxxxhd| 国产精品女同互慰在线看| 久久久噜噜噜久久人人看| 欧美成人精品在线视频| 性高湖久久久久久久久| 你懂的成人av| 久久精品99国产精品日本| 欧美mv日韩mv亚洲| 久久精品女人| 国产精品九九久久久久久久| 欧美成人日本| 国产亚洲欧美日韩日本| 亚洲精品欧美一区二区三区| 国产一二三精品| 在线视频亚洲| 亚洲精品一区二区在线观看| 欧美一区二视频| 亚洲男人的天堂在线| 欧美大片免费久久精品三p| 久久精品国产在热久久 | 久久九九全国免费精品观看| 欧美激情日韩| 欧美高清免费| 狠狠色综合网| 亚洲欧美日本国产专区一区| 日韩午夜三级在线| 久久综合伊人| 女同性一区二区三区人了人一 | 韩日成人av| 亚洲一区二区三区久久| 亚洲午夜国产成人av电影男同| 免费欧美网站| 男人的天堂亚洲在线| 国内精品视频666| 欧美一区激情| 久久九九99视频| 国产综合香蕉五月婷在线| 午夜视频在线观看一区二区| 午夜精品久久久久久| 国产精品xxxav免费视频| 一本久道久久久| 亚洲欧美日韩在线综合| 国产精品视频大全| 亚洲免费一区二区| 久久www免费人成看片高清| 99re6这里只有精品视频在线观看| 亚洲激情视频| 亚洲人成绝费网站色www| 欧美成人精品h版在线观看| 亚洲国产精品一区二区www| 亚洲精品国产日韩| 欧美欧美天天天天操| 99在线热播精品免费99热| 亚洲综合色婷婷| 国产精品午夜久久| 久久福利一区| 亚洲二区免费| 亚洲午夜小视频| 国产美女一区| 久久香蕉国产线看观看av| 亚洲国产精品激情在线观看| 日韩亚洲欧美一区| 国产精品视频区| 久久久久五月天| 亚洲欧洲视频| 欧美在线1区| 亚洲国产高清aⅴ视频| 欧美日本在线播放| 亚欧成人在线| 亚洲国产一区二区a毛片| 亚洲欧美在线视频观看| 在线观看亚洲视频啊啊啊啊| 欧美精品一级| 久久高清福利视频| 亚洲久久一区二区| 久久精品久久综合| 夜夜嗨av一区二区三区四区 | 六月丁香综合| 日韩亚洲视频在线| 久久一日本道色综合久久| 日韩一级裸体免费视频| 国产午夜亚洲精品理论片色戒| 美女精品视频一区| 亚洲免费在线看| 最新成人在线| 久久久久久久久蜜桃| 一区二区三区黄色| 在线成人亚洲| 国产欧美日韩综合精品二区| 欧美精品精品一区| 久久久久女教师免费一区| 亚洲视频一二| 亚洲精品视频在线观看免费| 久热精品视频在线| 久久国产精品72免费观看| 亚洲天堂av综合网| 亚洲免费黄色| 亚洲高清av在线| 黄色精品在线看| 国产日韩欧美精品一区| 欧美日韩在线一二三| 欧美激情亚洲精品| 久久综合五月天婷婷伊人| 久久精品欧洲| 久久超碰97中文字幕| 中文日韩欧美|