Проектна задача по предметот Визуелно програмирање изработена од:
- Емилијана Јовковска (193079)
- Јана Наумоска (193018)
Windows Forms апликацијата што ја изработивме претставува едноставна верзија на познатата arcade игра Pac-Man дополнета со одредени функционланости.
Главната цел на играта е Pac-Man да изеде што е можно повеќе Pac-Dots движејќи се низ лавиринтот. Играта се состои од само едно ниво и заедно со своите правила за играње претставува вистински предизвик.
При стартување на апликацијата се прикажува почетниот екран на кој се наоѓа progress bar и при негово исполнување играта е подготвена и се прикажува нов прозорец.
Главното мени на играта се состои од Start и Instructions, со кои играчот соодветно може или да ја започне играта или пак да ги прочита правилата за играње. Дополнително е овозможено и аудио во позадина при отварање на самата форма - познатата интро мелодија на Pac-Man.
-
Играта ја започнувате со три животи
-
Се движите лево-десно-горе-доле со помош на стрелките на тастатурата (arrow keys)
-
Соберете што е можно повеќе Pac-Dots притоа:
- Одбегнувајте ги духовите !
- Не ги допирајте ѕидовите од лавиринтот !
-
При секој допир со духовите или некој од ѕидовите, губите живот !
-
Играта завршува кога го губите и последниот живот
-
Соодветно доколку ги соберете сите предвидени поени победувате
- Еден Pac-Dot носи 1 поен
- Екстра 15 поени носат црешите поставени на специфични места од лавиринтот
- Вкупно 100 поени
Започнувајќи од стартната позиција, Pac-Man треба да собере што е можно повеќе поени движејќи се низ лавиринтот. Секој дух е во различен дел од лавиринтот и има различна насока на движење. Дополнителна препрека се и движечките ѕидови од двете страни на лавиринтот. При секое собирање на Pac-Dots и цреши се вклучуваат различни аудиа, исто како и при допир на дух или ѕид. При губење на живот, Pac-Man се враќа на почетната позиција и трепка како дополнителен знак дека е изгубен живот.
Во текот на целата игра поените се пресметуваат во Score, додека највисокиот освоен score се прикажува во High Score и важи се додека е подигната апликацијата. Кога започнатата играта завршува се прикажува group box со соодветните информации како и соодветното аудио.
Доколку не сакаме да продолжиме со играње притискаме "Quit", каде што дополнително се отвара custom message box за потврда. Истиот message box се вклучува доколку сакаме да ја прекинеме веќе започнатата игра со притискање на копчето "Escape". Исто така за време на играње ако се изгубени еден или два живота и сакаме да започнеме одново притискаме на копчето "R", а доколку се изгубени сите животи, за започнување на нова игра се притиска "Enter".
Заедничко за сите класи е начинот на отварање на нова форма. Најпрво треба да се иницијализира нова форма, да се сокрие моменталната, па дури потоа да се прикаже ново иницијализираната форма и на крај да се затвори старата форма. Овие чекори се неопходни за да овозможиме убав тек на приказ на формите.
Покрај обичните слики во .png формат, се со цел за да се овозможи анимација на Pac-Man и на духовите, искористени се слики во .gif формат кои исто така се прикажуваат преку алатката PictureBox. Секој picture box во зависност од содржина на сликата, имаат одредена вредност за својството Tag со која се овозможува полесна манипулација на истите.
Дополнително за да се овозможи аудио за класите се користи библиотеката System.Media. Аудио фајловите се во формат .wav и се embedded in .resx за потоа со помош на SoundPlayer да се пуштат.
Во оваа класа е дефиниран изгледот и акцијата на progress bar преку тајмер. На секое отчукување на тајмерот се зголемува opacity за одредена вредност и кога ќе се постигне максималната вредност тајмерот се прекинува и се прикажува новата форма (затвора старата).
Menu класата е класа во која се дефинираат акциите при клик на копчињата "Start" и "Instructuions" - отварање/затварање на форми.
Едноставна класа во која е дефинирата акцијата при клик на копчето "Back" - отварање/затварање на формa.
Класа во која се креира custom message box. Креирана е обична Windows форма, на која покрај естетскиот изглед и се додадени и две копчиња за Yes и No со соодветните вредности за DialogResult = Yes/No. Дополнително на самата форма и се додадени својства како на message box:
- Locked = True
- StartPosition = CenterScreen
- CancelButton = btnNo (името на копчето No)
- MaximizeBox & MinimizeBoxe = False
Во самата класа е креирана функција ShowBox() со која се иницијалицира нов message box со соодветната лабела поставена во формата како порака, за потоа на ново иницијализираниот message box да се повика ShowDialog().
static MessageBox newMessageBox;
public void ShowBox(string txtMessage)
{
newMessageBox = new MessageBox();
newMessageBox.lblMessage.Text = txtMessage;
newMessageBox.ShowDialog();
}Главна класа која што ја содржи логиката за функционалностите на играта.
-
keyDown() & keyUp() - ги дефинираат акциите при клик на соодветните копчиња од тастатурата
-
life_index() - проверка на бројот на животи и извршување на соодветната акција
-
gameTimer() - функција во која се одвиваат сите акции кои се од голема важност за самата игра
- менување на вредностите на Score и High Score, како и проверка на тоа дали е достигнат предвидениот score, за потоа превземање на соодветните акции (вклучување аудио, означување крај на играта, прекинување на тајмерот и приказ на group box со соодветната порака)
- одредување на брзината и насоката на движење на духовите, ѕидовите и на Pac-Man
- проверка дали Pac-Man е во судир со нешто и во зависност од тоа со кој има интеракција, се превземаат различни акции (вклучување различно аудио, зголемување на score за одредена вредност, повикување на дополнителен тајмер, одредување на нова почетна позиција на Pac-Man, повикување на функцијата life_index() или намалување на бројот на животи)
-
gameReset() - поставување на почетни вредности за брзина, локација и видливост на елементите како и започнување на тајмерот
-
gameOver() - прекин на играта (означување крај на играта, прекинување на тајмерот и приказ на group box со соодветната порака)
-
HighScore() - помошна функција која овозможува обновување на high score, со тоа што поставува 0 за соодветната променлива која е динамички зачувана во Settings
-
PacmanTimer() - го дефинира дополнителниот тајмер и го започнува истиот
private void PacmanTimer()
{
if (blinkTimer.Enabled == false)
{
blinkTimer.Interval = 80;
blinkTimer.Tick += new EventHandler(blinkTimer_Tick);
timerMax = 0;
blinkTimer.Start();
}
else
{
timerMax = 0;
}
} Дополнителниот тајмер е вклучен за помош при симулирање на анимација - трепкање. Првично тајмерот не е вклучен и се дефинира интервал на тајмерот во милисекунди, акцијата на секој негов тик, поставување на вредноста на timerMax да е 0, се со цел да се "контролира анимацијата" и на крај започнување на тајмерот. Дополнително доколку тајмерот е веќе вклучен, вредноста на timerMax повторно да се постави на 0
- blinkTimer_Tick() - овозможува "трепкање" на Pac-Man
private void blinkTimer_Tick(object sender, EventArgs e)
{
if (timerMax < 10)
{
pacman.Visible = !pacman.Visible;
timerMax++;
}
}При секој тик на дополнителниот тајмер, да се менува видливоста на picture box именуван pacman и со тоа да се зголемува максималната вредност на тајмерот
- btnQuit_Click() - отварање на нов custom message box
private void btnQuit_Click(object sender, EventArgs e)
{
MessageBox messageBox = new MessageBox();
if (messageBox.ShowDialog() == DialogResult.Yes)
{
HighScore();
Application.Exit();
}
else
{
this.ActiveControl = null;
}
}Кога играта ќе заврши, доколку корисникот го притисне копчето "Quit" се прикажува message box со порака "Are you sure you want to exit?". Доколку се притисне "Yes", се повикува функцијата HighScore() со која "го пребришува" највисокиот score постигнат за време на играње, апликацијата се затвара и со тоа играта е спремна за повторно стартување на апликацијата. Но доколку корисникот погрешка стиснал на копчето "Quit" или првично сакал да ја затвори апликацијата, се предомислил и притиснал "No", тогаш message box се затвара и може да притисне "Enter" за започнување на нова игра. Ваков тек на настани се постигнува со тоа што ActiveControl на message box (кој потекнува од формата MessageBox) се поставува на null, од причина што целиот фокус на формата Game по default го превзема ново отворената форма MessageBox и доколку се обидеме да притиснеме "Enter" без притоа да го тргнеме фокусот од MessageBox, цело време ќе се притиска копчето "Quit".
- Game_FormClosed() - доколку апликацијата се затвори на "X" од самата форма, повторно да се повика HighScore()







