Skip to content
Konstantin Bogdanoski edited this page Dec 21, 2019 · 16 revisions

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 за да се запознаете целосно со едноставните контроли.

Storyline

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.

Main Menu Choose Plane

Предизвикот се одвива во неколку нивоа.

The mission has a couple of levels

Ниво 1

Одбранете се од големиот број на непријателски летала кои имаат цел да ве уништат, истовремено и одбегнувајте метеори кои ќе ве уништат со само еден удар.

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 1

Ниво 2

Се наоѓате во метеорски појас, односно голем број на метеори и астероиди се движат кон ваша насока, избегнете ги, преживејте и соочете се со последниот предизвик од оваа мала игра.

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 2

Ниво 3

Стигнавте до последниот предизвик, време е да го уништите главниот брод и да ја спасите вашата планета. Само неколку чекори ве делат од победа.

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!

Level 3


Документација

Имплементација

За да ја постигнеме посакуваната функционалност, се потпревме на веќе познатите податочни структури и техники кои ги научивме на ФИНКИ. Со користење на колекции (List, Array, итн) ние успеавме оптимално да ја користиме достапната меморија.

Друг предизвик со кој се соочивме беа hit boxes од леталата, односно невидливите граници кои служат да не‘ информираат дека соодветното летало/метеор било погодено од проектил или погодено од метеор. (во продолжение можете и да го видите примерот)

Пример

Hit Box

За да ги претставиме соодветните граници, користиме 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) и знаеме дали имаме колизија или не. Доколку имаме колизија, проектилот се губи - бидејќи го погоди непријателот, а непријателот прима соодветна штета од проектилот.

Serializable

Бидејќи сакаме нашата игра да можеме да ја зачуваме и отвориме (Save & Load) ние мораме да овозможиме серијализација на секој објект од нашата игра (Hero,Enemy,Boss,HeroBullet,Bullet), а тоа и го правиме преку:

namespace VP_Project
{
    [Serializable]
    public class Game
    {

Custom методи

Предефинираните методи од 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