Skip to content
This repository has been archived by the owner on Jul 15, 2024. It is now read-only.

stefpankov/dragon-slayer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dragon Slayer

simple 2D sidescroller project
Играта се вика Dragon Slayer, слична со концептот на игрите Castlevania, Ghouls & Ghosts и слични retro sidescroller-и. Целта во играта е да се поминат сите нивоа. Поминувањето на едно ниво се состои од тоа да стигнете до крајот на нивото, односно десниот долен ќош. Притоа мора да ги "убиете" сите непријатели кои постојат на тоа ниво. Во спротивно нема да ви биде дозволено да преминете на следното ниво иако сте стигнале во долниот десен ќош. Секое ниво си има свои препреки.

Иако има многу вакви слични игри, изворниот код е пишуван 99% од нас.
За играње пуштете го .exe од фолдерот Release

Проблематика

  • Почнувајќи со проектот, проблемот како да направиме 2D Sidescroller го поделивме на неколку подпроблеми:
    • имлементација на Game Loop
    • креирање Game менаџер
    • креирање левели и прогресија низ истите
    • креирање ликови односно херој и непријатели
    • исцртување
    • движење, скокање, паѓање и колизија
    • анимација
  • Game loop-от беше имплементиран преку елементот Timer кој пука Tick евент околу 60 пати во секунда и соодветниот хендлер ги повикува методите Update и Draw во Game менаџерот(натаму GM).
  • GM содржи:
    • информации за можните левели,
    • метод Update кој ги повикува сите потребни методи на херојот и непријателите со цел да се обноват информациите кои се потребни за пресметки за релациите на објектите во сцената и исцртување на истите,
    • метод Draw кој ги повикува сите Draw методи на објектите во левелот,
    • метод Exit кој проверува дали херојот може да премина на следниот левел,
    • метод GenerateLevel кој ги генерира левелите според претходно зададени услови
  • Класата Level содржи информации за сите непријатели, платформи и препреки во стазата како и за позадината и метод * Draw кој го повикува исцртувањето на сите објекти поединечно.
  • Херојот и непријателите се изведени од класата Character која содржи информации за местоположбата, граници за колизија, брзина и насока на движење и абстрактни методи за Цртање и Движење.
  • Најголемиот дел од кодот е во класата Hero која беше значително проширена со информации кои ни кажуваат дали херојот напаѓа, се движи, е приземјен, се наоѓа на платформа, скока, кој е моменталниот фрејм во анимацијата и кои се границите за колизија на оружјето.
  • Херојот содржи методи за движење, скокање, гравитација, анимација и интеракција со сите објекти на сцената преку проверки за колизија со истите. Еден таков метод е PlatformCheck
public void PlatformCheck(List<Platform> colPlt)
  {
      if (colPlt.Count > 0)
      {
          foreach (Platform p in colPlt)
          {
              if (location.X < p.location.X + p.bounds.Width &&
                     location.X + bounds.Width + 8 > p.location.X &&
                     location.Y + 47 < p.location.Y + 47 &&
                     bounds.Height + location.Y > p.location.Y)
              {
                  isPlatformed = true;
                  p.isOnThis = true;
                  isGrounded = true;
                  isJumping = false;
                  jump = new Vector(0, 50f);
                  location.Y = p.location.Y - 47;
                  weapon = WeaponUpdate(direction);
                  
              }
              else if (isPlatformed && p.isOnThis)
              {
                  isPlatformed = false;
                  isGrounded = false;
                  p.isOnThis = false;
              }
          }
      }
  }

PlatformCheck проверува колизија со секоја платформа во левелот и ако детектира дека херојот се наоѓа на платформата поставува true на променливите isPlatformed и isGrounded го прицврстува херојот врз платформата, му кажува дека не е во скок и го ресетира векторот на скок кој се користи во методот за скокање. При излез од платформата ги му кажуваме на херојот дека не се наоѓа на платформа и не е приземјен.

  • Еден проблем настана при воведување на повеќе платформи во левелот при што кога херојот тестира колизија тоа го прави со изминување на листа на можни платформи и ако се наоѓа на која било платформа освен последната, секој следен тест детектира дека ликот не е врз тестираната платформа и влегува во else блок со му се кажува на ликот дека не е приземјен и не е врз платформа. Ова го решивме со воведување на променлива isOnThis со која херојот знае на која платформа се наоѓа па кога ги тестира останатите знае дека е на платформа и кога не детектира колизија со следните платформи во низата.
  • Најтешкиот дел од креирањето на играта е движење на главниот лик(Марко) и негова интеракција со околината, односно вметнување на физичките појави од реалниот свет во играта. Пример за ова е проблемот на гравитација, кој го решивме така што Марко секогаш кога нема да е во допир со некаква платформа, треба да почне да паѓа надолу.
public void Gravity()
  {
      if (!isGrounded && !isJumping)
      {
          float newLoc = location.Y + 6 * gravity.Y * 0.32f;
          location = new Vector(location.X, newLoc);
          weapon = WeaponUpdate(direction);
      }
  }

Screenshots и кратко упатство

  • Прво ниво


level1

- Второ ниво

level2

- Упатство

How to play

About

simple 2D sidescroller project

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages