Проект по визуелно програмирање
Изработиле:
Иван Крстев 151202
Ирина Ќосева 151036
Горан Илиоски 151102
7 Minutes In HELL е акциона игра со пукање. Играчот, односно главниот лик, претставува едно мало човече кое мора да преживее 7 минути во пеколот. Но, треба претпазливо да се движи за да преживее, бидејќи демоните во пеколот можат да го убијат со еден допир.
На мапата на играта се исцртуваат на полу-случајни камени пречки кои играчот не може да ги премине, ниту може да пука преку нив.
Играчот е опремен со пиштол со ограничена рата на пукање. За да добиете привремено убрзување на пиштолот, собирајте power-ups! Power-ups имаат некоја шанса да се појават на рандомизирана позиција во мапата и чекаат да бидат собрани 30 секунди, после што исчезнуваат. Ако играчот ги собере, пукањето му е убрзано неколку секунди.
Убивање на демон е наградено со 100 поени, додека демон кој сте го избегнале, но излегол од мапата само со 10.
Ако играчот преживее првите шест минути, во седмата минута почнува да се отвара портал кон надворешниот свет. Последните 30 секунди, порталот е отворен и имате шанса да избегате. Ако не успеете, засекогаш сте заробени во пеколот.
На главното мени, играчот може да започне нова игра, или пак да продолжи со претходно зачувана игра. (Слика 1)
Играта може да се паузира со притискање на копчето Esc. При пауза, се прикажува мени од кое може да се зачува играта. (Слика 3)
Кога се завршува со играта, поените се зачувуваат во Leaderboards, придружени со името кое сте го дале на почетокот на новата игра. Во Leaderboards се зачувани и се прикажуваат играчите со највисоките 10 поени. Играчот може да влезе во Leaderboards и кога не успеал да се врати преку порталот, но преминување во порталот му дава бонус од 10000 поени. (Слика 4)
Губење или победување на играта прикажува нова форма со соодветна порака.
Во класата GameDoc()
се зачувани сите објекти кои се употребуваат во една игра, односно играч (Player), името на играчот, порталот (Portal), како и листи од пречките (Rock), демоните (Demon), проектилите (Projectile) од пиштолот и power-ups (PowerUp) кои што се наоѓаат во моменалната игра.
Оваа класа, (како и останатите класи на елементите во играта од кои се чуваат објекти), поседуваат атрибут serializable, што го овозможува зачувувањето на моменталната/пуштањето на зачувана игра.
При креирање на нова игра, играчот се исцртува во центарот на мапата. Околу него се исцртуваат и пречките.
Во GameDoc()
се дефинирани функции за движење на сите елементи на мапата, кои користат дополнителни функции од соодветните класи.
Во формава се чува објект од типот GameDoc(), кој што се ажурира во два типови моменти:
-
Во зависност од тајмерите на играта
-
Timer1 – се користи за исцртување и проверка на колизии меѓу објектите во мапата на играта (играч/мапа, демон/играч, проектил/демон, играч/пречка, итн.).
-
Timer2 – се користи за одбројување на седумте минути кои ги има играчот, ажурирање на соодветната панела која го прикажува преостанатото време, како и подесување на тешкотијата на играта во зависност од изминување на времето. (See code in part 3)
-
-
При некаков настан
-
KeyDown/KeyUp – за движење се користат копчињата Up, Down, Left, Right и за пукање копчето spacebar. За паузирање на играта се користи копчето ESC.
-
Button clicks – соодветно однесување при клик на некоја од опциите од менито при пауза.
-
Секоја од класите се состои од атрибути за позиција, големина, BitMap (слика која се користи за објектот) и функции за цртање, проверка за колизија, поместување (Move) – каде што е потребно.
Во класата за пречка чуваме битмапа со сликата од камен. Во конструкторот користиме функција MakeTransparent() која ги прави проѕирни пикселите кои ја имаат истата боја со пикселот (1,1).
public Bitmap image;
public Rock(Point center)
{
this.center = center;
image = new Bitmap(Resources.rocks);
image.MakeTransparent();
}
public void Draw(Graphics g)
{
g.DrawImage(image, center.X - width / 2, center.Y - height / 2, width, height);
}
На секои 15 секунди постои 40% шанса да се појави powerup. Тоа е направено со помош на Random r
. Следната функција се наоѓа во функцијата на timer2 кој отчукува (се зголемува secs) на 1 секунда.
if(secs % 15 == 0)
{
if (r.Next(10) < 4)
{
gd.addPowerUp(this.Width, this.Height, pnlStatus.Height, r);
}
}
Секој име-поени пар се зачувува во елемент од типот playerPoints, во листата players во LeaderBoardsList.
[Serializable]
public class playerPoints
{
public String name;
public int points;
public playerPoints(String name, int points)
{
this.name = name;
this.points = points;
}
}
[Serializable]
public class LeaderBoardsList
{
public List<playerPoints> players;
public LeaderBoardsList()
{
players = new List<playerPoints>();
}
public void addNew(String name, int points)
{
if(players.Count >= 10)
{
players.Add(new playerPoints(name, points));
players.Sort((a, b) => b.points.CompareTo(a.points));
players.RemoveAt(10);
}
else
{
players.Add(new playerPoints(name, points));
players.Sort((a, b) => b.points.CompareTo(a.points));
}
}
}