-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Space Odyssey претставува едноставна 2D игра/апликација која е развиена како семинарска задача - проект, по предметот Визуелно Програмирање, 2019 година, на Факултетот за Информатички Науки и Компјутерско Инженерство (ФИНКИ) од страна на Константин Богданоски, Бојан Јованоски и Владимир Блажески.
Space Odyssey is a simple 2D application/game which was developed as a seminar task for the subject Visual Programming, 2019, at the Faculty of Computer Science and Engineering in Skopje, Macedonia, by Konstantin Bogdanoski, Bojan Jovanoski and Vladimir Blazheski.
Целта на оваа игра, е играчот да ги победи напаѓачките сили и да ги избегнува космичките објекти, додека не стигне до главниот непријател, кој се крие зад неколку бранови од своите летала. Играта е едноставна, а во ова repository се наоѓа и извршна верзија од истата (.exe) и можете да ја испробате во целосната нејзина слава.
Извршна верзија од играта (.exe): Space Odyssey
The goal of this game is, for the player to destroy the attacking forces while avoiding the cosmic objects roaming around space and reach the mother ship of the enemies. It is a simple game and in this repository you can find an executable app of the same which you can try it out in all of it's glory.
Game Executable (.exe): Space Odyssey
Светот е во опасност, вие сте тие кои се одбрани меѓу најдобрите за да одите на тајна мисија да го уништите главниот брод, пред да стигнат до вашиот дом.
Со кликање на Start New Game
ќе бидете пречекани од нов екран на кој можете да го одберете вашето преферирано летало. Следниот чекор е да се започне мисијата.
Доколку не ги знаете контролите, слободно кликнете на Instructions
за да се запознаете целосно со едноставните контроли.
The world is in danger, you are the chosen one as one of all the pilots to go on a secret mission to destroy the Mother ship, before it arrives at your doorstep.
By clicking
Start New Game
you will be greeted by a new screen in which you can choose the spaceship of your taste. Next step, save planet Earth!.
If you do not know the controls, feel free to click on the
Instructions
button, so you can get used to the controls.
The mission has a couple of levels
Одбранете се од големиот број на непријателски летала кои имаат цел да ве уништат, истовремено и одбегнувајте метеори кои ќе ве уништат со само еден удар.
Level 1 Defend yourself from the vast number of enemies that are trying to protect their Momma, while simultaneously avoiding meteors and asteroids which will destroy you with a single hit.
Се наоѓате во метеорски појас, односно голем број на метеори и астероиди се движат кон ваша насока, избегнете ги, преживејте и соочете се со последниот предизвик од оваа мала игра.
Level 2 You have been caught in a meteor belt, that means that a lot of cosmic rocks are coming your way, evade them, destroy them, SURVIVE and face the last challenge of this teeny tiny game.
Стигнавте до последниот предизвик, време е да го уништите главниот брод и да ја спасите вашата планета. Само неколку чекори ве делат од победа.
Level 3 You have reached the final challenge, it is time to destroy the Mother ship and save your planet. You are a couple of steps away from victory, soldier!
За да ја постигнеме посакуваната функционалност, се потпревме на веќе познатите податочни структури и техники кои ги научивме на ФИНКИ. Со користење на колекции (List
, Array
, итн) ние успеавме оптимално да ја користиме достапната меморија.
Друг предизвик со кој се соочивме беа hit boxes од леталата, односно невидливите граници кои служат да не‘ информираат дека соодветното летало/метеор било погодено од проектил или погодено од метеор. (во продолжение можете и да го видите примерот)
За да ги претставиме соодветните граници, користиме Rectangle
кој ни ја нуди методата .IntersectsWith(Rectangle r)
, а таа ни кажува дали имаме пресек помеѓу тие правоаголници.
foreach (HeroBullet bullet in Hero.bullets)
{
foreach (Enemy enemy in Enemies)
{
Rectangle b = new Rectangle(bullet.Location.X, bullet.Location.Y, bullet.BulletImg.Width, bullet.BulletImg.Height);
Rectangle h = new Rectangle(enemy.Location.X, enemy.Location.Y, 37, 35);
if (b.IntersectsWith(h))
{
bullet.Hit = true;
enemy.Health -= 50;
}
}
for (int i = 0; i < Enemies.Count; i++)
if (Enemies.ElementAt(i).Health <= 0)
Enemies.RemoveAt(i);
}
По голем број пати на trial and error успеавме да најдеме солидна претстава на нашите космички објекти. Кратко објаснување за кодот:
Бидејќи нашиот херој се соочува со повеќе непријатели, ние мораме да провериме за секој од нив дали имаме колизија. Затоа преку foreach
ние ги изминуваме сите непријатели и ги добиваме нивните граници. По добивањето на границата, ние мораме да ја исцртаме и границата на проектилите од нашиот херој. Тоа го правиме со
Rectangle b = new Rectangle(bullet.Location.X, bullet.Location.Y, bullet.BulletImg.Width, bullet.BulletImg.Height);
и тоа го правиме за секој проектил од нашиот Херој. Откако ги имаме добиено правоаголниците - границите, правиме едноставна проверка со Rectangle.IntersectsWith(Rectangle)
и знаеме дали имаме колизија или не. Доколку имаме колизија, проектилот се губи - бидејќи го погоди непријателот, а непријателот прима соодветна штета од проектилот.
Бидејќи сакаме нашата игра да можеме да ја зачуваме и отвориме (Save & Load
) ние мораме да овозможиме серијализација на секој објект од нашата игра (Hero
,Enemy
,Boss
,HeroBullet
,Bullet
), а тоа и го правиме преку:
namespace VP_Project
{
[Serializable]
public class Game
{
Предефинираните методи од Visual Studio 2017 не беа доволни за да ги добиеме потребните функционалности, па моравме да креираме наши.
Пример:
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
this.Shoot();
}
public void Shoot()
{
this.Bullets.Add(new Bullet(this.Location));
}
Овие методи служат за непријателите да можат на одреден интервал да пукаат проектил кон Херојот.
Целосната имплементација се наоѓа во ова git repository. Чувствувајте се слободни и споделувајте го доколку сакате и мислите дека може да помогне и да усреќи некоја душа.
Апликацијата е open source со GNU лиценца. Подетални информации можете да најдете во GNU Public Licence