Compare commits

..

No commits in common. "main" and "v1.0.6" have entirely different histories.
main ... v1.0.6

96 changed files with 333 additions and 620 deletions

View File

@ -1,31 +0,0 @@
name: Deploy to GitHub Pages
on:
push:
branches:
- main
permissions:
contents: write
jobs:
deploy:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Clone fonts repository
run: git clone https://github.com/touying-typ/fonts.git fonts --depth=1
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install Touying Exporter
run: pip install touying
- name: Build HTML File
run: |
mkdir build
touying compile presentation.typ --output build/index.html --format html --font-paths fonts --font-paths assets/fonts
- name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@v4
with:
branch: gh-pages
folder: build

View File

@ -11,27 +11,36 @@ on:
type: string type: string
permissions: permissions:
contents: write contents: write
packages: read
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v3
- name: Install Typst - name: Install required fonts
uses: typst-community/setup-typst@v3
with:
typst-version: 0.12
cache-dependency-path: requirements.typ
- name: Compile Typst files
run: | run: |
typst compile --font-path=assets/fonts main.typ Cagulis_Kristians.Francis_kc22015.pdf sudo apt-get update
typst compile --font-path=assets/fonts documentary_page.typ reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf # Install Times New Roman
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
sudo apt-get install -y ttf-mscorefonts-installer
mkdir -p ~/.local/share/fonts
cp -r assets/fonts/* ~/.local/share/fonts/
fc-cache -f -v
- name: Compile main.typ
uses: lvignoli/typst-action@main
with:
source_file: |
main.typ
documentary_page.typ
- name: Rename main.pdf
run: mv main.pdf kval_darbs_kristians_cagulis_kc22015.pdf
- name: Upload PDF file - name: Upload PDF file
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: PDF name: PDF
path: "*.pdf" path: |
*.pdf
- name: Get current date - name: Get current date
id: date id: date
run: echo "DATE=$(date +%Y-%m-%d-%H:%M)" >> $GITHUB_ENV run: echo "DATE=$(date +%Y-%m-%d-%H:%M)" >> $GITHUB_ENV
@ -40,6 +49,4 @@ jobs:
if: github.ref_type == 'tag' if: github.ref_type == 'tag'
with: with:
name: "${{ github.ref_name }} — ${{ env.DATE }}" name: "${{ github.ref_name }} — ${{ env.DATE }}"
files: | files: "*.pdf"
Cagulis_Kristians.Francis_kc22015.pdf
reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf

View File

@ -0,0 +1,3 @@
#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Default, Reflect)]
#[reflect(Component)]
pub struct Player;

View File

@ -39,6 +39,7 @@ pub(super) fn spawn_maze(
Visibility::Visible, Visibility::Visible,
)) ))
.insert_if(CurrentFloor, || *floor == 1) // Only floor 1 gets CurrentFloor .insert_if(CurrentFloor, || *floor == 1) // Only floor 1 gets CurrentFloor
.insert_if(NextFloor, || *floor != 1) // All other floors get NextFloor
.id(); .id();
let assets = MazeAssets::new(&mut meshes, &mut materials, &global_config); let assets = MazeAssets::new(&mut meshes, &mut materials, &global_config);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 983 B

View File

@ -1,4 +1,5 @@
#import "@preview/tablex:0.0.9": tablex #import "@preview/tablex:0.0.9": tablex
#import "@preview/dashy-todo:0.0.1": todo
#import "src/layout.typ": project, indent-par #import "src/layout.typ": project, indent-par
#import "src/layout.typ": indent #import "src/layout.typ": indent
@ -49,7 +50,7 @@
#let long-underline = underline(box(width: 1fr, repeat(sym.space))) #let long-underline = underline(box(width: 1fr, repeat(sym.space)))
#set page(numbering: none) #set page(numbering: none)
#heading(level: 1, outlined: false, numbering: none, "Dokumentārā lapa") = Dokumentārā lapa
Kvalifikācijas darbs "*Spēles izstrāde, izmantojot Bevy spēļu dzinēju*" ir Kvalifikācijas darbs "*Spēles izstrāde, izmantojot Bevy spēļu dzinēju*" ir
izstrādāts Latvijas Universitātes Eksakto zinātņu un tehnoloģiju fakultātē, izstrādāts Latvijas Universitātes Eksakto zinātņu un tehnoloģiju fakultātē,
@ -68,18 +69,18 @@ izdrukai un/vai recenzentam uzrādītajai darba versijai.
) )
v(vspace / 2) v(vspace / 2)
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~06.01.2025.*] [Autors: *Kristiāns Francis Cagulis, kc22015 ~~\_\_.01.2025.*]
v(vspace) v(vspace)
[Rekomendēju darbu aizstāvēšanai\ [Rekomendēju darbu aizstāvēšanai\
Darba vadītājs: *Mg. dat. Jānis Iljins ~~06.01.2025.*] Darba vadītājs: *prof. Mg. dat. Jānis Iljins ~~\_\_.01.2025.*]
v(vspace) v(vspace)
[Recenzents: *Artūrs Driķis*] [Recenzents: *Artūrs Driķis*]
v(vspace) v(vspace)
[Darbs iesniegs *06.01.2025.*\ [Darbs iesniegs *\_\_.01.2025.*\
Kvalifikācijas darbu pārbaudījumu komisijas sekretārs (elektronisks paraksts) Kvalifikācijas darbu pārbaudījumu komisijas sekretārs (elektronisks paraksts)
] ]

476
main.typ
View File

@ -15,41 +15,34 @@
thesis_type: "Kvalifikācijas darbs", thesis_type: "Kvalifikācijas darbs",
title: [Spēles izstrāde, izmantojot\ Bevy spēļu dzinēju], title: [Spēles izstrāde, izmantojot\ Bevy spēļu dzinēju],
authors: ("Kristiāns Francis Cagulis, kc22015",), authors: ("Kristiāns Francis Cagulis, kc22015",),
advisor: "Mg. dat. Jānis Iljins", advisor: "prof. Mg. dat. Jānis Iljins",
date: "Rīga 2025", date: "Rīga 2025",
) )
#set heading(numbering: none) #set heading(numbering: none)
= Apzīmējumu saraksts = Apzīmējumu saraksts
/ Audio: skaņas komponentes, kas ietver gan skaņas efektus, gan fona mūziku; / Audio: Skaņas komponentes, kas ietver gan skaņas efektus, gan fona mūziku;
/ CI/CD: nepārtraukta integrācija un nepārtraukta izvietošana; / CI/CD: nepārtraukta integrācija un nepārtraukta izvietošana;
/ DPD: datu plūsmas diagramma; / DPD: datu plūsmas diagramma;
/ ECS: entitāšu-komponenšu sistēma (angl. Entity-Component-System)@ecs; / ECS: entitāšu-komponenšu sistēma (angl. Entity-Component-System)@ecs;
/ Entitāte: unikāls identifikators, kas apvieno saistītās komponentes; / Interpolācija: starpvērtību atrašana pēc funkcijas doto vērtību virknes;
/ Jaucējtabula#footnote[https://lv.wikipedia.org/wiki/Jauc%C4%93jtabula]: jeb heštabula (angl. hash table)#footnote[https://en.wikipedia.org/wiki/Hash_table] ir datu struktūra, kas saista identificējošās vērtības ar piesaistītajām vērtībām; / Jaucējtabula#footnote[https://lv.wikipedia.org/wiki/Jauc%C4%93jtabula]: jeb heštabula (angl. hash table)#footnote[https://en.wikipedia.org/wiki/Hash_table] ir datu struktūra, kas saista identificējošās vērtības ar piesaistītajām vērtībām;
/ Komponente: datu struktūra, kas satur tikai datus bez loģikas; / Laidiens: Programmatūras versija, kas ir gatava izplatīšanai lietotājiem un satur īpašas funkcijas, uzlabojumus vai labojumus;
/ Notikums: īslaicīga ziņojuma struktūra, kas tiek izmantota komunikācijai starp sistēmām;
/ PPA: programmatūras projektējuma apraksts; / PPA: programmatūras projektējuma apraksts;
/ PPS: programmatūras prasību specifikācija; / PPS: programmatūras prasību specifikācija;
/ Papildspēja: spēles mehānika, kas spēlētājam piešķir īslaicīgas priekšrocības vai papildu spējas (angl. power-up)#footnote[https://en.wikipedia.org/wiki/Power-up]<power-up>; / Papildspēja: objekts, kas kā spēles mehānika spēlētājam piešķir īslaicīgas priekšrocības vai papildu spējas (angl. power-up)#footnote[https://en.wikipedia.org/wiki/Power-up]<power-up>;
/ Pirmkods: cilvēkam lasāmas programmēšanas instrukcijas, kas nosaka programmatūras darbību; / Pirmkods: Cilvēkam lasāmas programmēšanas instrukcijas, kas nosaka programmatūras darbību;
/ Procedurāla ģenerēšana: algoritmisks satura radīšanas process, kas automātiski ģenerē datus izpildes laikā, nevis izmanto manuāli, iepriekš veidotu saturu; / Procedurāla ģenerēšana: datu algoritmiskas izstrādes metode, kurā tiek kombinēts cilvēka radīts saturs un algoritmi, kas apvienoti ar datora ģenerētu nejaušību;
/ Renderēšana: process, kurā tiek ģenerēta vizuāla izvade; / Renderēšana: Process, kurā tiek ģenerēts vizuāla izvade;
/ Resurss: globāli pieejama datu struktūra, kas nav piesaistīta konkrētai entitātei; / Režģis: Strukturēts šūnu izkārtojums, kas veido spēles pasaules pamata struktūru;
/ Režģis: strukturēts šūnu izkārtojums, kas veido spēles pasaules pamata struktūru; / Spēlētājs: lietotāja ieraksts vienas virtuālās istabas kontekstā;
/ Sistēma: loģikas vienība, kas apstrādā entitātes ar specifiskām komponentēm; / Sēkla: Skaitliska vērtība, ko izmanto nejaušo skaitļu ģeneratora inicializēšanai;
/ Spēlētājs: entitāte, kas reprezentē lietotāja vadāmo objektu spēlē; / Šūna: Sešstūraina režģa viena pozīcija, kas definē telpu, kuru var aizņemt viena plāksne.
/ Sēkla: skaitliska vērtība, ko izmanto nejaušo skaitļu ģeneratora inicializēšanai;
/ Šūna: sešstūraina režģa viena pozīcija, kas definē telpu, kuru var aizņemt viena plāksne;
/ WASM: WebAssembly -- zema līmeņa assemblera tipa kods, kas var darboties modernos tīmekļa pārlūkos. / WASM: WebAssembly -- zema līmeņa assemblera tipa kods, kas var darboties modernos tīmekļa pārlūkos.
= Ievads = Ievads
== Nolūks == Nolūks
Šī programmatūras prasību specifikācija (PPS) ir izstrādāta, lai definētu un Šī dokumenta mērķis ir raksturot sešstūru labirinta spēles "Maze Ascension"
dokumentētu procedurāli ģenerētas sešstūru labirinta spēles "Maze Ascension" programmatūras prasības un izpētīt Bevy spēļu dzinēja iespējas.
programmatūras prasības, arhitektūru un tehnisko implementāciju. Dokumenta
galvenais uzdevums ir nodrošināt skaidru un visaptverošu projekta aprakstu, kas
kalpo gan kā tehniskā specifikācija, gan kā izpētes dokumentācija Bevy spēļu
dzinēja iespēju demonstrēšanai.
== Darbības sfēra == Darbības sfēra
Darba galvenā uzmanība ir vērsta uz būtisku spēles mehāniku ieviešanu, tostarp Darba galvenā uzmanība ir vērsta uz būtisku spēles mehāniku ieviešanu, tostarp
@ -58,7 +51,7 @@ integrāciju un vertikālās progresijas mehāniku, vienlaikus ievērojot minim
dizaina filozofiju. dizaina filozofiju.
Spēles pamatā ir procedurāli ģenerēti sešstūra labirinti, kas katrā spēlē rada Spēles pamatā ir procedurāli ģenerēti sešstūra labirinti, kas katrā spēlē rada
unikālu vizuālu un navigācijas izaicinājumu. Procedurālās ģenerēšanas sistēma unikālu vizuālo un navigācijas izaicinājumu. Procedurālās ģenerēšanas sistēma
nodrošina, ka: nodrošina, ka:
- katrs labirints tiek unikāli ģenerēts "uzreiz"#footnote[Attiecas uz gandrīz - katrs labirints tiek unikāli ģenerēts "uzreiz"#footnote[Attiecas uz gandrīz
@ -71,7 +64,7 @@ nodrošina, ka:
- uzglabāšanas prasības tiek samazinātas līdz minimumam, ģenerējot labirintus reāllaikā. - uzglabāšanas prasības tiek samazinātas līdz minimumam, ģenerējot labirintus reāllaikā.
#indent-par[ #indent-par[
Spēlētāju uzdevums ir pārvietoties pa šiem procedurāli ģenerētajiem labirintiem, Spēlētāju uzdevums ir pārvietoties pa šiem procesuāli ģenerētajiem labirintiem,
lai sasniegtu katra līmeņa beigas. Turpinot progresēt, spēlētāji saskaras ar lai sasniegtu katra līmeņa beigas. Turpinot progresēt, spēlētāji saskaras ar
arvien sarežģītākiem labirintiem, kuros nepieciešama stratēģiskā domāšana, arvien sarežģītākiem labirintiem, kuros nepieciešama stratēģiskā domāšana,
izpēte un papildu prasmju izmantošana. izpēte un papildu prasmju izmantošana.
@ -83,9 +76,9 @@ pieredzi, veicinot izpēti un eksperimentēšanu ar dažādām spēju kombināci
radot dinamiskākus un aizraujošākus spēles scenārijus. radot dinamiskākus un aizraujošākus spēles scenārijus.
No tehniskā viedokļa darbā tiek pētīta šo funkciju īstenošana, izmantojot No tehniskā viedokļa darbā tiek pētīta šo funkciju īstenošana, izmantojot
Bevy entitāšu-komponenšu sistēmas (turpmāk tekstā -- ECS) arhitektūru. Bevy entitāšu-komponentu sistēmas (tuprmāk tekstā -- ECS) arhitektūru.
Tas ietver stabilu spēles vides sistēmu izstrādi, stāvokļa pārvaldības Tas ietver stabilu spēles vides sistēmu izstrādi, stāvokļa pārvaldības
mehānismus un efektīvu Bevy iebūvēto funkciju izmantošanu. mehānismus un efektīvu Bevy iebūvēto funkcionalitāšu izmantošanu.
No darbības sfēras apzināti izslēgta daudzspēlētāju funkcionalitāte un sarežģīti No darbības sfēras apzināti izslēgta daudzspēlētāju funkcionalitāte un sarežģīti
grafiskie efekti, koncentrējoties uz pulētu viena spēlētāja pieredzi ar skaidru, grafiskie efekti, koncentrējoties uz pulētu viena spēlētāja pieredzi ar skaidru,
@ -112,8 +105,8 @@ sešstūrainu lauku, kas piedāvā unikālu spēles pieredzi katrā spēles reiz
Tiek skaidrota arī spēles vertikālās progresijas sistēma un papildspēju Tiek skaidrota arī spēles vertikālās progresijas sistēma un papildspēju
mehānikas, kas padara spēli izaicinošāku un interesantāku. mehānikas, kas padara spēli izaicinošāku un interesantāku.
Programmatūras prasību specifikācijas sadaļa detalizētāk apraksta sistēmas Programmatūras prasību specifikācijas sadaļa detalizē sistēmas funkcionālās
funkcionālās prasības un arhitektūru. prasības un arhitektūru.
Izmantojot datu plūsmas diagrammas, tiek ilustrēta sistēmas moduļu mijiedarbība Izmantojot datu plūsmas diagrammas, tiek ilustrēta sistēmas moduļu mijiedarbība
un datu plūsmas starp tiem. un datu plūsmas starp tiem.
Šajā sadaļā tiek aprakstīti pieci galvenie moduļi: spēles stāvokļa pārvaldības Šajā sadaļā tiek aprakstīti pieci galvenie moduļi: spēles stāvokļa pārvaldības
@ -125,7 +118,7 @@ funkciju tabulas.
Programmatūras projektējuma sadaļa sniedz detalizētu tehnisko specifikāciju. Programmatūras projektējuma sadaļa sniedz detalizētu tehnisko specifikāciju.
Datu struktūru projektējuma apakšsadaļā tiek aprakstītas ECS arhitektūras Datu struktūru projektējuma apakšsadaļā tiek aprakstītas ECS arhitektūras
komponentes, notikumi un resursi. komponentes, notikumi un resursi.
Daļējā funkciju projektējuma apakšsadaļā tiek detalizēta šūnu pārvaldības Daļējā funkciju projektējuma apakšsadaļā tiek detalizēta plākšņu pārvaldības
sistēma un citas būtiskas funkcijas. sistēma un citas būtiskas funkcijas.
Saskarņu projektējuma apakšsadaļā tiek aprakstīta lietotāja saskarnes Saskarņu projektējuma apakšsadaļā tiek aprakstīta lietotāja saskarnes
arhitektūra un implementācija. arhitektūra un implementācija.
@ -133,9 +126,9 @@ arhitektūra un implementācija.
Testēšanas dokumentācijas sadaļa aptver gan statisko, gan dinamisko testēšanu. Testēšanas dokumentācijas sadaļa aptver gan statisko, gan dinamisko testēšanu.
Statiskās testēšanas apakšsadaļā tiek aprakstītas koda kvalitātes pārbaudes Statiskās testēšanas apakšsadaļā tiek aprakstītas koda kvalitātes pārbaudes
metodes un rīki. metodes un rīki.
Dinamiskās testēšanas apakšsadaļā tiek detalizētāk izskatīta gan manuālā Dinamiskās testēšanas apakšsadaļā tiek detalizēta gan manuālā integrācijas
integrācijas testēšana, gan automatizēto testu implementācija, sniedzot testēšana, gan automatizēto testu implementācija, sniedzot konkrētus piemērus un
konkrētus piemērus un rezultātus. rezultātus.
Projekta organizācijas sadaļa apraksta projekta pārvaldības aspektus. Projekta organizācijas sadaļa apraksta projekta pārvaldības aspektus.
Kvalitātes nodrošināšanas apakšsadaļa detalizē izmantotās metodes un rīkus koda Kvalitātes nodrošināšanas apakšsadaļa detalizē izmantotās metodes un rīkus koda
@ -154,10 +147,10 @@ ieteikumi turpmākai projekta attīstībai.
== Esošā stāvokļa apraksts == Esošā stāvokļa apraksts
Pašreizējo spēļu izstrādes ainavu raksturo pieaugoša interese pēc neatkarīgajām Pašreizējo spēļu izstrādes ainavu raksturo pieaugoša interese pēc neatkarīgajām
spēlēm un modernu, efektīvu spēļu dzinēju izmantošana. Izstrādātāji arvien spēlēm un modernu, efektīvu spēļu dzinēju izmantošana. Izstrādātāji arvien
biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu. biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu. Spēļu
Spēļu dzinējs Bevy ar savu moderno arhitektūru un Rust programmēšanas valodas dzinējs Bevy ar savu moderno arhitektūru un Rust programmēšanas valodas
izmantošanu gūst arvien lielāku popularitāti izstrādātāju vidū, pateicoties tā izmantošanu gūst arvien lielāku popularitāti izstrādātāju vidū, pateicoties tā
drošām, paralēlām sistēmām. drošām un vienlaicīgām funkcijām.
== Pasūtītājs == Pasūtītājs
Sistēma nav izstrādāta pēc konkrēta pasūtītāja pieprasījuma, tā ir raksturota un Sistēma nav izstrādāta pēc konkrēta pasūtītāja pieprasījuma, tā ir raksturota un
@ -176,27 +169,41 @@ un saistošu pieredzi dažādās operētājsistēmās un vidēs.
Spēle tiek izplatīta, izmantojot "GitHub Spēle tiek izplatīta, izmantojot "GitHub
releases"#footnote[https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases]<gh-release> releases"#footnote[https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases]<gh-release>
un itch.io platformas,#footnote[https://itch.io/]<itch-io> kas ir un itch.io,#footnote[https://itch.io/]<itch-io> kas ir
populāra neatkarīgo spēļu platforma, kas ļauj viegli piekļūt un izplatīt spēles populāra neatkarīgo spēļu platforma, kas ļauj viegli piekļūt un izplatīt spēles
visā pasaulē. visā pasaulē. Izmantojot šīs platformas, datorspēle gūst dažādu maksājumu modeļu
un kopienas iesasaistes funkcijas, tādējādi palielinot spēles sasniedzamību un
atpazīstamību.
/* Lai gan spēle neizmanto mākoņpakalpojumus datu uzglabāšanai vai
analīzei, CI/CD cauruļvads nodrošina, ka atjauninājumus un jaunas funkcijas var
izvietot efektīvi un droši. Šāda konfigurācija ļauj ātri veikt iterāciju un
nepārtraukti uzlabot spēli, nodrošinot, ka spēlētājiem vienmēr ir pieejama
jaunākā versija ar jaunākajiem uzlabojumiem un kļūdu labojumiem. */
== Darījumprasības == Darījumprasības
Sistēmas izstrādē tiek izvirzītas sekojošas darījumprasības, kas nodrošinās Sistēmas izstrādē galvenā uzmanība tiks pievērsta sekojošu darījumprasību
kvalitatīvu lietotāja pieredzi: īstenošanai, lai nodrošinātu stabilu un saistošu lietotāja pieredzi:
- Līmeņu pārvaldība: Sistēma nodrošinās automātisku spēles līmeņu pārvaldību un + Spēles progresēšana un līmeņu pārvaldība: Sistēma automātiski pārvaldīs
vienmērīgu pāreju starp tiem, veidojot pakāpenisku grūtības pieaugumu. spēlētāju virzību pa spēles līmeņiem, nodrošinot vienmērīgu pāreju, kad
- Līmeņu ģenerēšana: Sistēma nodrošinās procedurālu līmeņu ģenerēšanu, radot spēlētāji progresē un saskaras ar jauniem izaicinājumiem. Progress tiks
unikālus sešstūrainus labirintus katram spēles stāvam, garantējot, ka katrs saglabāts lokāli spēlētāja ierīcē.
labirints ir pilnībā izejams. + Nevainojama piekļuve spēlēm: Spēlētāji varēs piekļūt spēlei un spēlēt to bez
- Tieša piekļuve: Spēle būs pieejama bez lietotāja konta izveides vai nepieciešamības izveidot lietotāja kontu vai pieteikties. Tas nodrošina
autentifikācijas, nodrošinot tūlītēju piekļuvi spēles saturam. netraucētu piekļuvi spēlei, ļaujot spēlētājiem nekavējoties sākt spēlēt.
- Platformu atbalsts: Sistēma tiks izstrādāta ar daudzplatformu atbalstu, // + Paziņošanas sistēma: Spēlētāji saņems paziņojumus par svarīgiem spēles
ietverot Linux, macOS, Windows un WebAssembly platformas. // atjauninājumiem, sasniegumiem un citu svarīgu informāciju, lai saglabātu viņu
- Kopienas integrācija: Izmantojot itch.io@itch-io platformu, tiks nodrošināta // iesaisti un informētību.
spēlētāju atsauksmju apkopošana un kopienas atbalsts. + Savietojamība ar vairākām platformām: sistēma būs pieejama vairākās
- Nepārtraukta izstrāde: Izmantojot CI/CD risinājumus, tiks nodrošināta regulāra platformās, tostarp Linux, macOS, Windows un WebAssembly, nodrošinot plašu
spēles atjaunināšana un uzturēšana. pieejamību un sasniedzamību.
+ Kopienas iesaiste: Spēle izmantos itch.io@itch-io kopienas
funkcijas, lai sadarbotos ar spēlētājiem, apkopotu atsauksmes un veicinātu
atbalstošu spēlētāju kopienu.
+ Regulāri atjauninājumi un uzturēšana: CI/CD cauruļvadu veicinās regulārus
atjauninājumus un uzturēšanu, nodrošinot, ka spēle ir atjaunināta ar jaunākajām
funkcijām un uzlabojumiem.
== Sistēmas lietotāji == Sistēmas lietotāji
Sistēma ir izstrādāta, ņemot vērā vienu lietotāja tipu -- spēlētājs. Spēlētāji Sistēma ir izstrādāta, ņemot vērā vienu lietotāja tipu -- spēlētājs. Spēlētāji
@ -205,7 +212,10 @@ Tā kā spēlei nav nepieciešami lietotāja konti vai autentifikācija, visiem
spēlētājiem ir vienlīdzīga piekļuve spēles funkcijām un saturam no spēles sākuma spēlētājiem ir vienlīdzīga piekļuve spēles funkcijām un saturam no spēles sākuma
brīža. brīža.
Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa DPD /* "Sistēma" lietotājs ir atbildīgs par notikumu apstrādātāju izsaukšanu, kas
nepieciešams automātiskai spēles gaitas pārvaldībai. */
Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa DPD
(sk. @fig:dpd-0). (sk. @fig:dpd-0).
#figure( #figure(
@ -226,29 +236,10 @@ Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa
) <dpd-0> ) <dpd-0>
== Vispārējie ierobežojumi == Vispārējie ierobežojumi
// + Izstrādes vides un tehnoloģijas ierobežojumi:
// + Programmēšanas valodas un Bevy spēles dzinēja tehniskie ierobežojumi;
// + Responsivitāte;
// + Starpplatformu savietojamība: Linux, macOS, Windows un WebAssembly.
+ Izstrādes vides un tehnoloģijas ierobežojumi: + Izstrādes vides un tehnoloģijas ierobežojumi:
+ Bevy dzinēja tehniskie ierobežojumi: + Programmēšanas valodas un Bevy spēles dzinēja tehniskie ierobežojumi;
+ ECS arhitektūras specifika un tās ierobežojumi datu organizācijā; + Responsivitāte;
+ "Render Graph"#footnote[https://docs.rs/bevy_render/latest/bevy_render/render_graph/struct.RenderGraph.htmlhttps://docs.rs/bevy_render/latest/bevy_render/render_graph/struct.RenderGraph.html] sistēmas ierobežojumi grafisko elementu attēlošanā; + Starpplatformu savietojamība: Linux, macOS, Windows un WebAssembly.
+ atkarība no "wgpu"#footnote[https://wgpu.rs/] grafikas bibliotēkas iespējām.
+ Rust programmēšanas valodas ierobežojumi:
+ stingra atmiņas pārvaldība (angl. memory management) un īpašumtiesību (angl. ownership) sistēma;
+ kompilācijas laika pārbaudes un to ietekme uz izstrādes procesu;
+ WebAssembly kompilācijas specifika.
+ Platformu atbalsta ierobežojumi:
+ Nepieciešamība nodrošināt savietojamību ar:
+ darbvirsmas platformām (Linux, macOS, Windows);
+ tīmekļa pārlūkprogrammām caur WebAssembly.
+ Platformu specifiskās prasības attiecībā uz:
+ grafikas renderēšanu;
+ ievades apstrādi;
+ veiktspējas optimizāciju.
#indent-par[ #indent-par[
Dokumentācijas izstrādei ir izmantots Typst rīks, kas nodrošina efektīvu darbu Dokumentācijas izstrādei ir izmantots Typst rīks, kas nodrošina efektīvu darbu
@ -259,11 +250,11 @@ Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa
== Pieņēmumi un atkarības == Pieņēmumi un atkarības
- Tehniskie pieņēmumi: - Tehniskie pieņēmumi:
- Spēlētāja ierīcei jāatbilst minimālajām aparatūras prasībām, lai varētu - Spēlētāja ierīcei jāatbilst minimālajām aparatūras prasībām, lai varētu
palaist uz Bevy spēles dzinēja balstītas spēles; palaist uz Bevy spēles dzinēja balstītas spēles.
- ierīcei jāatbalsta WebGL2 #footnote("https://registry.khronos.org/webgl/specs/latest/2.0/"); - ierīcei jāatbalsta WebGL2 #footnote("https://registry.khronos.org/webgl/specs/latest/2.0/"),
lai nodrošinātu pareizu atveidošanu @webgl2; lai nodrošinātu pareizu atveidošanu @webgl2.
- tīmekļa spēļu spēlēšanai (WebAssembly versija) pārlūkprogrammai jābūt mūsdienīgai un saderīgai ar WebAssembly; - tīmekļa spēļu spēlēšanai (WebAssembly versija) pārlūkprogrammai jābūt mūsdienīgai un saderīgai ar WebAssembly.
- ekrāna izšķirtspējai jābūt vismaz $800 times 600$ pikseļi. - ekrāna izšķirtspējai jābūt vismaz 800x600 pikseļu, lai spēle būtu optimāla.
- Veiktspējas atkarība: - Veiktspējas atkarība:
- Spēle ir atkarīga no Bevy spēles dzinēja (0.15). - Spēle ir atkarīga no Bevy spēles dzinēja (0.15).
- Veiksmīga kompilēšana un izvietošana ir atkarīga no CI/CD darbplūsmai saderības ar: - Veiksmīga kompilēšana un izvietošana ir atkarīga no CI/CD darbplūsmai saderības ar:
@ -288,7 +279,7 @@ Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa
\1. līmeņa datu plūsmas diagramma (sk. @fig:dpd-1) ilustrē galvenos \1. līmeņa datu plūsmas diagramma (sk. @fig:dpd-1) ilustrē galvenos
procesus spēles "Maze Ascension" sistēmā. procesus spēles "Maze Ascension" sistēmā.
Diagrammā attēloti seši galvenie procesi, viens izstrādes process un viens Diagrammā attēloti seši galvenie procesi, viens izstrādes process un viens
ārējs (bibliotēkas) process(-i): ārējs (bibliotēkas) process(-i) process:
stāva pārvaldības modulis, stāva pārvaldības modulis,
labirinta ģenerēšanas un pārvaldības moduļi, labirinta ģenerēšanas un pārvaldības moduļi,
spēlētāja modulis, spēlētāja modulis,
@ -298,16 +289,17 @@ un izstrādes rīku modulis.
Šie procesi mijiedarbojas ar vienu datu krātuvi -- operatīvo atmiņu (RAM) -- un vienu Šie procesi mijiedarbojas ar vienu datu krātuvi -- operatīvo atmiņu (RAM) -- un vienu
ārējo lietotāju -- spēlētājs. ārējo lietotāju -- spēlētājs.
Bevy spēļu dzinējs diagrammā ir attēlots kā ārējs process vairāku iemeslu dēļ. Ievades apstrādes modulis uztver un apstrādā spēlētāja ievades datus.
Pirmkārt, Bevy nodrošina pamata infrastruktūru spēles darbībai, ieskaitot Spēles stāvokļa modulis pārrauga vispārējo spēles stāvokli.
ievades apstrādi, renderēšanu un audio atskaņošanu. Labirinta ģeneratora modulis izveido un pārvalda labirinta struktūras.
Tā rezultātā visa lietotāja mijiedarbība ar spēli (tastatūras, peles ievade) Spēlētāja modulis apstrādā visas ar spēlētāju saistītās kustības, sadursmes un papildspēju mijiedarbības.
vispirms tiek apstrādāta caur Bevy sistēmām, pirms tā nonāk līdz spēles Spēles līmeņu pārvaldnieks kontrolē līmeņu virzību un stāvokli.
specifiskajiem moduļiem. Renderēšanas un audio moduļi pārvalda attiecīgi vizuālo un audio izvadi.
Operatīvā atmiņa (RAM) ir vienīgā datu krātuve diagrammā, jo Bevy ECS // Visas datu plūsmas starp procesiem tiek nodrošinātas, izmantojot operatīvo
arhitektūra balstās uz komponenšu datiem, kas tiek glabāti operatīvajā atmiņā un // atmiņu, ievērojot atbilstošas datu plūsmas diagrammas konvencijas. Šī
spēles stāvoklis netiek pastāvīgi saglabāts diskā. // arhitektūra nodrošina efektīvu datu pārvaldību un skaidru interešu nodalīšanu
// starp dažādām spēles sastāvdaļām.
#figure( #figure(
caption: [\1. līmeņa DPD], caption: [\1. līmeņa DPD],
@ -367,6 +359,7 @@ spēles stāvoklis netiek pastāvīgi saglabāts diskā.
(0, -3), (0, -3),
[Bevy], [Bevy],
inset: 20pt, inset: 20pt,
extrude: (-4pt, 0),
stroke: (thickness: 1pt, dash: "dashed"), stroke: (thickness: 1pt, dash: "dashed"),
) )
dpd-edge("uu", align(center)[Vizuālās\ izvades dati]) dpd-edge("uu", align(center)[Vizuālās\ izvades dati])
@ -488,22 +481,6 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu.
=== Izstrādes rīku modulis === Izstrādes rīku modulis
Dotais modulis ir izstrādes rīks, kas paredzēts lietotāja saskarnes elementu
attēlošanai un apstrādei, lai konfigurētu labirinta parametrus.
Šis modulis, izmantojot "bevy_egui"@bevy-egui un "inspector-egui"@bevy-inspector-egui
bibliotēkas, izveido logu "Maze Controls" (labirinta vadības
elementi), kurā tiek parādītas dažādas
konfigurācijas opcijas, piemēram, sēkla, rādiuss, augstums, labirinta izmērs,
orientācija un sākuma/galapunkta pozīcijas (sk @tbl:dev_tools-F01).
Lietotāji var mijiedarboties ar šiem vadības elementiem, lai mainītu labirinta
izkārtojumu un izskatu.
Modulis pārbauda, vai konfigurācijā nav notikušas izmaiņas, un izraisa attiecīgus
notikumus, lai atjauninātu labirintu un spēlētāja pozīciju, kad notiek izmaiņas.
Svarīgi atzīmēt, ka šis modulis ir paredzēts lietošanai spēles izstrādes procesā.
Laidiena versijās šī lietotāja saskarne nebūs pieejama, nodrošinot, ka
gala lietotāji nevar piekļūt šīm uzlabotajām konfigurācijas opcijām.
#figure( #figure(
caption: [Izstrādes rīku moduļa 2. līmeņa DPD], caption: [Izstrādes rīku moduļa 2. līmeņa DPD],
diagram( diagram(
@ -520,18 +497,44 @@ gala lietotāji nevar piekļūt šīm uzlabotajām konfigurācijas opcijām.
), ),
) <dpd-2-dev_tools> ) <dpd-2-dev_tools>
Dotais modulis ir izstrādes rīks, kas paredzēts lietotāja saskarnes elementu
attēlošanai un apstrādei, lai konfigurētu labirinta parametrus.
Šis modulis, izmantojot "egui"@bevy-egui un "inspector-egui"@bevy-inspector-egui
bibliotēkas, izveido logu "Maze Controls" (labirinta vadības
elementi), kurā tiek parādītas dažādas
konfigurācijas opcijas, piemēram, sēkla, rādiuss, augstums, labirinta izmērs,
orientācija un sākuma/galapunkta pozīcijas (sk @tbl:dev_tools-F01).
Lietotāji var mijiedarboties ar šiem vadības elementiem, lai mainītu labirinta
izkārtojumu un izskatu.
Modulis pārbauda, vai konfigurācijā nav notikušas izmaiņas, un izraisa attiecīgus
notikumus, lai atjauninātu labirintu un spēlētāja pozīciju, kad notiek izmaiņas.
Svarīgi atzīmēt, ka šis modulis ir paredzēts lietošanai spēles izstrādes procesā.
Laidiena versijās šī lietotāja saskarne nebūs pieejama, nodrošinot, ka
gala lietotāji nevar piekļūt šīm uzlabotajām konfigurācijas opcijām.
// Moduļa funkcionalitāti var vizualizēt, izmantojot datu plūsmas diagrammu (DFD),
// kurā būtu parādītas ievades no spēles pasaules (piemēram, pašreizējā stāva un
// labirinta konfigurācija), apstrāde lietotāja saskarnes sistēmā un izejas kā
// atjauninātas labirinta konfigurācijas un respawn notikumi.
#function-table( #function-table(
"Labirinta pārvadības saskarne", "Labirinta pārvadības saskarne",
"IRMF01", "IRMF01",
[Apstrādā un izvada labirinta konfigurācijas vadības elementus lietotāja saskarnē.], [Apstrādā un izvada labirinta konfigurācijas vadības elementus lietotāja saskarnē.],
[ [
+ "`EguiContext`" komponente;#footnote[https://docs.rs/bevy_egui/latest/bevy_egui/]<bevy_egui> Ievades dati tiek saņemti no pasaules resursiem un komponentēm:
+ Labirinta spraudņa resurss;
+ "EguiContext" komponente;#footnote[https://docs.rs/bevy_egui/latest/bevy_egui/]<bevy_egui>
+ Labirinta konfigurācija un stāva komponentes saistībā ar pašreizējā stāva + Labirinta konfigurācija un stāva komponentes saistībā ar pašreizējā stāva
komponenti; komponenti;
+ Globālais labirinta konfigurācijas resurss. + Globālais labirinta konfigurācijas resurss.
], ],
[ [
+ Saņem "`EguiContext`" komponenti no primārā loga. + Pārbauda, vai labirinta straudņa resurss eksistē pasaulē.
+ Ja nav, iziet no sistēmas un nedara neko.
+ Saņem `EguiContext` komponenti no primārā loga.
+ Saņem labirinta konfigurāciju un stāvu komponentes no pašreizējā stāva. + Saņem labirinta konfigurāciju un stāvu komponentes no pašreizējā stāva.
+ Izveido jaunu "Maze Controls" logu, izmantojot "egui". + Izveido jaunu "Maze Controls" logu, izmantojot "egui".
+ Ja globālais labirinta konfigurācijas resurss ir pieejams: + Ja globālais labirinta konfigurācijas resurss ir pieejams:
@ -560,7 +563,7 @@ Modulis sastāv no divām galvenajām funkcijām (sk. @fig:dpd-2-floor):
stāvu kustības (sk. @tbl:floor-F01) un stāvu stāvu kustības (sk. @tbl:floor-F01) un stāvu
pārejas apstrādes (sk. @tbl:floor-F02). pārejas apstrādes (sk. @tbl:floor-F02).
Stāvu kustības sistēma nodrošina plūstošu vertikālo pārvietošanos starp Stāvu kustības sistēma nodrošina plūstošu vertikālo pārvietošanos starp
līmeņiem, savukārt pārejas apstrādes sistēma koordinē pārejas starp pašreizējo līmeņiem, savukārt pārejas apstrādes sistema koordinē pārejas starp pašreizējo
un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-floor). un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-floor).
#figure( #figure(
@ -610,6 +613,7 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
+ Pārejas notikums. + Pārejas notikums.
+ Stāvas entitātes. + Stāvas entitātes.
+ Pašreizējais stāvs. + Pašreizējais stāvs.
+ Nākamais stāvs.
], ],
[ [
+ Pārbauda vai ir aktīva pāreja. + Pārbauda vai ir aktīva pāreja.
@ -618,7 +622,8 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
+ Pievieno mērķa komponentes stāvu entitātēm. + Pievieno mērķa komponentes stāvu entitātēm.
+ Atjauno stāvu statusus: + Atjauno stāvu statusus:
+ Noņem pašreizējā stāva komponenti no pašreizējā stāva entitātes. + Noņem pašreizējā stāva komponenti no pašreizējā stāva entitātes.
+ Pievieno pašreizējā stāva komponenti nākamā stāva entitātei. + Pievieno nākamā stāva komponenti nākamā entitātei.
+ Noņem nākamā stāva komponenti no nākamā stāva entitātes.
], ],
[ [
+ Atjaunināts stāvs. + Atjaunināts stāvs.
@ -628,10 +633,10 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
=== Labirinta ģenerēšanas modulis === Labirinta ģenerēšanas modulis
Moduļa funkcionalitāte ir izmantota sešstūraina labirinta ģenerēšanai, Moduļa funkcionalitāte ir izmantota sešstūraina labirinta ģenerēšanai,
balstoties uz "Hexagonal Grids" balstoties uz Amit Patel's "Hexagonal Grids"
rakstu @hex-grid, kas jau ir rakstu @hex-grid, kas jau ir
kļuvis par _de facto_ standartu sešstūrainu režģu matemātikas un algoritmu kļuvis par _de facto_ standartu sešstūrainu režģu matemātikas un algoritmu
implementācijai. implementācijai izstrādē.
Moduļa funkciju datu plūsmas ir parādītas 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-hexlab). Moduļa funkciju datu plūsmas ir parādītas 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-hexlab).
Labirinta būvēšanas funkcija ir aprakstītas atsevišķā tabulā (sk. @tbl:hexlab-F01). Labirinta būvēšanas funkcija ir aprakstītas atsevišķā tabulā (sk. @tbl:hexlab-F01).
@ -676,21 +681,21 @@ programmu.
], ],
[ [
+ Validē ievades parametrus: + Validē ievades parametrus:
+ Pārbauda rādiusa esamību un derīgumu. + Pārbauda rādiusa esamību un derīgumu;
+ Validē sākuma pozīciju, ja tāda norādīta. + Validē sākuma pozīciju, ja tāda norādīta;
+ Izveido sākotnējo labirinta struktūru: + Izveido sākotnējo labirinta struktūru:
+ Inicializē tukšu labirintu ar norādīto rādiusu. + Inicializē tukšu labirintu ar norādīto rādiusu;
+ Katrai šūnai iestata sākotnējās (visas) sienas. + Katrai šūnai iestata sākotnējās (visas) sienas.
+ Validē sākuma pozīciju, ja tāda norādīta. + Validē stākuma prozīciju, ja tāda norādīta.
+ Ģenerē labirintu: + Ģenerē labirintu:
+ Rekursīvi izveido ceļus, noņemot sienas starp šūnām. + Rekursīvi izveido ceļus, noņemot sienas starp šūnām;
+ Izmanto atpakaļizsekošanu, kad sasniegts strupceļš. + Izmanto atpakaļizsekošanu, kad sasniegts strupceļš.
], ],
[ [
+ Jaucējtabulu, kas satur: + Jaucējtabulu, kas satur:
+ Sešstūra koordinātes kā atslēgās. + Sešstūra koordinātes kā atslēgās;
+ Sešstūra objekti ar: + Sešstūra objekti ar:
+ Pozīcijas koordinātēm ($x$, $y$). + Pozīcijas koordinātēm ($x$, $y$);
+ Sienu konfigurāciju (8-bitu maska). + Sienu konfigurāciju (8-bitu maska).
], ],
[ [
@ -702,8 +707,8 @@ programmu.
=== Labirinta pārvaldības modulis === Labirinta pārvaldības modulis
Labirinta pārvaldības modulis ir atbildīgs par labirintu ģenerēšanu un Labirinta pārvaldības modulis ir atbildīgs par labirintu ģenerēšanu un
pārvaldību katrā spēles stāvā. Moduļa funkciju datu plūsmas ir attēlotas 2. pārvaldību katrā spēles stāvā. Moduļa darbības plūsma ir attēlota 2. līmeņa datu
līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-maze). plūsmas diagrammā (sk. @fig:dpd-2-maze).
Modulis nodrošina divas galvenās funkcijas: labirinta izveidi Modulis nodrošina divas galvenās funkcijas: labirinta izveidi
(sk. @tbl:maze-F01) un labirinta atjaunošanu (sk. @tbl:maze-F02). (sk. @tbl:maze-F01) un labirinta atjaunošanu (sk. @tbl:maze-F02).
@ -713,8 +718,7 @@ Funkcija ģenerē jaunu labirintu, izmantojot norādīto konfigurāciju, un izvi
to atbilstošā augstumā spēles pasaulē. to atbilstošā augstumā spēles pasaulē.
Labirinta atjaunošanas funkcija ļauj pārģenerēt esošā stāva labirintu, Labirinta atjaunošanas funkcija ļauj pārģenerēt esošā stāva labirintu,
saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes ID.
identifikatoru.
#figure( #figure(
caption: [Labirinta pārvaldības moduļa 2. līmeņa DPD], caption: [Labirinta pārvaldības moduļa 2. līmeņa DPD],
@ -750,8 +754,8 @@ identifikatoru.
+ Aprēķina vertikālo nobīdi jaunajam stāvam. + Aprēķina vertikālo nobīdi jaunajam stāvam.
+ Izveido jaunu entitāti, kas pārstāv labirinta stāvu, pievienojot tam + Izveido jaunu entitāti, kas pārstāv labirinta stāvu, pievienojot tam
atbilstošās komponente. atbilstošās komponente.
+ Atkarībā no tā, vai tas ir pašreizējais stāvs, pievieno + Atkarībā no tā, vai tas ir pašreizējais vai nākamais stāvs, pievieno
pašreizējā stāva komponenti. attiecīgo komponenti.
+ Izveido jaunas entitātes, kas pārstāv labirinta šūnas, kā bērnu + Izveido jaunas entitātes, kas pārstāv labirinta šūnas, kā bērnu
elementus labirinta entitātei. elementus labirinta entitātei.
+ Katrai labirinta šūnai atbilstoši labirinta konfigurācijai, izveido + Katrai labirinta šūnai atbilstoši labirinta konfigurācijai, izveido
@ -762,7 +766,7 @@ identifikatoru.
], ],
[ [
+ "Stāvs $x$ jau eksistē." + "Stāvs $x$ jau eksistē."
// + "Neizdevās ģenerēt labirintu stāvam $x$." + "Neizdevās ģenerēt labirintu stāvam $x$."
], ],
) <maze-F01> ) <maze-F01>
@ -795,20 +799,18 @@ identifikatoru.
=== Spēlētāja modulis === Spēlētāja modulis
Spēlētāja modulis ir atbildīgs par spēlētāja entītijas pārvaldību, kas ietver Spēlētāja modulis ir atbildīgs par spēlētāja entītijas pārvaldību, kas ietver
tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi. tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi. Moduļa darbības
Moduļa datu plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk. plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-player), kas
@fig:dpd-2-player), kas parāda četras galvenās funkcijas un to mijiedarbību ar parāda četras galvenās funkcijas un to mijiedarbību ar datu glabātuvi.
datu glabātuvi.
Spēlētāja kustība tiek realizēta divās daļās: ievades apstrāde Spēlētāja kustība tiek realizēta divās daļās: ievades apstrāde
(@tbl:player-F02) un kustības izpilde (@tbl:player-F03). (@tbl:player-F02) un kustības izpilde (@tbl:player-F03).
Ievades apstrādes funkcija pārbauda tastatūras ievadi Ievades apstrādes funkcija pārbauda tastatūras ievadi
un, ņemot vērā labirinta sienu izvietojumu, nosaka nākamo kustības mērķi. un, ņemot vērā labirinta sienu izvietojumu, nosaka nākamo kustības mērķi.
Kustības izpildes funkcija nodrošina plūstošu pārvietošanos uz mērķa pozīciju, Kustības izpildes funkcija nodrošina plūstošu pārvietošanos uz mērķa pozīciju,
izmantojot interpolāciju#footnote[Matemātiska metode, kas aprēķina starpvērtības izmantojot interpolāciju starp pašreizējo un mērķa pozīciju.
starp diviem zināmiem punktiem.] starp pašreizējo un mērķa pozīciju.
Stāvu pārejas apstrāde nepārtraukti uzrauga spēlētāja pozīciju Stāvu pārejas apstrāde (#link(<player-F04>)[SPMF04]) nepārtraukti uzrauga spēlētāja pozīciju
attiecībā pret stāva izeju un sākumu. Kad spēlētājs sasniedz kādu no šiem attiecībā pret stāva izeju un sākumu. Kad spēlētājs sasniedz kādu no šiem
punktiem, funkcija izsauc atbilstošu pārejas notikumu. punktiem, funkcija izsauc atbilstošu pārejas notikumu.
@ -987,23 +989,22 @@ punktiem, funkcija izsauc atbilstošu pārejas notikumu.
) <player-F04> ) <player-F04>
=== Spēles stāvokļa pārvaldības modulis === Spēles stāvokļa pārvaldības modulis
Spēles stāvokļa pārvaldības modulis nodrošina spēles dažādu stāvokļu pārvaldību Spēles stāvokļa pārvaldības modulis nodrošina spēles dažādu stāvokļu pārvaldību
un pārejas starp tiem. Modulis sastāv no trim galvenajām funkcijām: un pārejas starp tiem. Modulis sastāv no trim galvenajām funkcijām: spēles
spēles sākšana (@tbl:screen-F01), sākšana (@tbl:screen-F01), atgriešanās uz sākumekrānu
atgriešanās uz sākumekrānu (@tbl:screen-F02) un (@tbl:screen-F02) un sākumekrāna attēlošanas
sākumekrāna attēlošanas (@tbl:screen-F03). (@tbl:screen-F03). Katra no šīm funkcijām apstrādā specifiskus
Katra no šīm funkcijām apstrādā specifiskus lietotāja ievades datus un lietotāja ievades datus un atbilstoši atjaunina spēles stāvokli operatīvajā
atbilstoši atjaunina spēles stāvokli. atmiņā.
Moduļa 2. līmeņa DPD diagramma (sk. @fig:dpd-2-screen) parāda, ka lietotājs Moduļa 2. līmeņa DPD diagramma (sk. @fig:dpd-2-screen) parāda, ka lietotājs
mijiedarbojas ar sistēmu izmantojot divus galvenos ievades veidus: pogu izvēli mijiedarbojas ar sistēmu caur diviem galvenajiem ievades veidiem: pogu izvēli
sākumekrānā un "Escape" taustiņa nospiešanu spēles laikā. sākumekrānā un "Escape" taustiņa nospiešanu spēles laikā.
Spēles sākšanas funkcija inicializē nepieciešamos resursus un Spēles sākšanas funkcija inicializē nepieciešamos resursus un
sistēmas, kad lietotājs izvēlas sākt jaunu spēli. sistēmas, kad lietotājs izvēlas sākt jaunu spēli. Atgriešanās funkcija
Atgriešanās funkcija apstrādā lietotāja pieprasījumu pārtraukt aktīvo spēli un apstrādā lietotāja pieprasījumu pārtraukt aktīvo spēli un atgriežas uz
atgriežas uz sākumekrānu. sākumekrānu.
#figure( #figure(
caption: [Spēles stāvokļa pārvaldības moduļa 2. līmeņa DPD], caption: [Spēles stāvokļa pārvaldības moduļa 2. līmeņa DPD],
@ -1029,7 +1030,7 @@ atgriežas uz sākumekrānu.
dpd-database((6, 0), [Operatīvā\ atmiņa]) dpd-database((6, 0), [Operatīvā\ atmiņa])
dpd-edge( dpd-edge(
"d,lll", "d,lll",
align(center)[Spēles\ stāvokļa dati], align(center)[Atjaunoti spēles\ stāvokļa dati],
label-pos: 0.7, label-pos: 0.7,
shift: -20pt, shift: -20pt,
) )
@ -1217,13 +1218,12 @@ Uz sistēmas veiktspēju ir sekojošas prasības:
- Jebkura izmēra labirintam jātiek uzģenerētam ātrāk kā 1 sekundē. - Jebkura izmēra labirintam jātiek uzģenerētam ātrāk kā 1 sekundē.
- Spēlei jāstartējas ātrāk par 3 sekundēm. - Spēlei jāstartējas ātrāk par 3 sekundēm.
- Spēlei jādarbojas ar vismaz 60 kadriem sekundē. - Spēlei jādarbojas ar vismaz 60 kadriem sekundē.
- Spēlētāja kustībām jātiek apstrādātā bez manāmas aizkaves ($<16$ms). - Spēlētāja kustībām jātiek apstrādātām bez manāmas aizkaves ($<16$ms).
=== Uzticamība === Uzticamība
Uz sistēmas uzticamību ir sekojošas prasības: Uz sistēmas uzticamību ir sekojošas prasības:
- Kļūdu apstrāde: spēlei jāapstrādā kļūdas graciozi, bez sistēmas atteicēm. - Kļūdu apstrāde: spēlei jāapstrādā kļūdas graciozi, bez sistēmas atteicēm.
// - Saglabāšana: spēles progresam jātiek automātiski saglabātam pēc katra līmeņa. - Saglabāšana: spēles progresam jātiek automātiski saglabātam pēc katra līmeņa.
// - Atjaunošanās: spēlei jāspēj atjaunoties pēc negaidītas aizvēršanas. - Atjaunošanās: spēlei jāspēj atjaunoties pēc negaidītas aizvēršanas.
=== Atribūti === Atribūti
==== Izmantojamība ==== Izmantojamība
@ -1256,7 +1256,7 @@ ir noteiktas, lai nodrošinātu plašu pieejamību, vienlaikus saglabājot veikt
== Datu struktūru projektējums == Datu struktūru projektējums
Spēle ir veidota, izmantojot Bevy spēles dzinēju, kas īstenu Spēle ir veidota, izmantojot Bevy spēles dzinēju, kas īstenu
entitāšu-komponenšu sistēmu (ECS) arhitektūras modeli. entitāšu komponenšu sistēmu (ECS) arhitektūras modeli.
Šis modelis sadala spēles loģiku trīs galvenajās daļās: entitātes jeb spēles Šis modelis sadala spēles loģiku trīs galvenajās daļās: entitātes jeb spēles
objekti, komponentes jeb dati un sistēmas -- loģika, kas darbojas ar entitātēm objekti, komponentes jeb dati un sistēmas -- loģika, kas darbojas ar entitātēm
ar konkrētām komponentēm @ecs @bevy-ecs @bevy-cheatbook[nod. ~14.7]. ar konkrētām komponentēm @ecs @bevy-ecs @bevy-cheatbook[nod. ~14.7].
@ -1279,7 +1279,7 @@ spēlētāju saistītās komponentes, kā redzams @tbl:components-floor[],
Stāva komponentes pārvalda vertikālo progresu un kustību spēlē. Stāva komponentes pārvalda vertikālo progresu un kustību spēlē.
Kā redzams @tbl:components-floor[tabulā], šīs komponentes pārvalda stāvu numurus, Kā redzams @tbl:components-floor[tabulā], šīs komponentes pārvalda stāvu numurus,
pašreizējā stāva stāvokli un vertikālās kustības mehāniku. pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
#components-table( #components-table(
caption: "Ar stāviem saistītās komponentes", caption: "Ar stāviem saistītās komponentes",
@ -1289,6 +1289,9 @@ pašreizējā stāva stāvokli un vertikālās kustības mehāniku.
`CurrentFloor`, `CurrentFloor`,
"Atzīmē pašreizējo stāvu", "Atzīmē pašreizējo stāvu",
"Identificē pašreizējo stāvu.", "Identificē pašreizējo stāvu.",
`NextFloor`,
"Atzīmē nākamo stāvu",
"Identificē progresa mērķa līmeni, uz kuru jāpāriet. Var būt arī līmenis zemāk.",
`FloorYTarget`, `FloorYTarget`,
"Stāva nākamā Y pozīcija", "Stāva nākamā Y pozīcija",
"Identificē stāva Y koordināti, uz kuru tas jāpārvieto.", "Identificē stāva Y koordināti, uz kuru tas jāpārvieto.",
@ -1296,9 +1299,10 @@ pašreizējā stāva stāvokli un vertikālās kustības mehāniku.
==== Labirinta komponentes ==== Labirinta komponentes
Labirinta struktūru pārvalda vairāki savstarpēji saistītas komponentes, Labirinta struktūru pārvalda vairāki savstarpēji saistītas komponentes.
kas ir atbildīgas par labirinta uzturēšanu (sk. @tbl:components-maze). Tabulā @tbl:components-maze[] ir redzamas sastāvdaļas, kas ir atbildīgas par
#pagebreak() labirinta izveidi un uzturēšanu.
#components-table( #components-table(
caption: "Ar labirintiem saistītās komponentes", caption: "Ar labirintiem saistītās komponentes",
`HexMaze`, `HexMaze`,
@ -1314,12 +1318,12 @@ kas ir atbildīgas par labirinta uzturēšanu (sk. @tbl:components-maze).
"Glabā labirinta parametrus", "Glabā labirinta parametrus",
"Konfigurē labirinta ģenerēšanu ar rādiusu, pozīcijām un izkārtojumu.", "Konfigurē labirinta ģenerēšanu ar rādiusu, pozīcijām un izkārtojumu.",
`Maze`, `Maze`,
"Glabā sešstūra labirinta datus", "Glabā sešstūra labirinta datu",
"Glabā pilnu labirinta struktūru, izmantojot jaucējtabulu.", "Glabā pilnu labirinta struktūru, izmantojot jaucējtabulu.",
`Walls`, `Walls`,
"Apzīmē sienu konfigurāciju", "Apzīmē sienu konfigurāciju",
[Pārvalda sienas stāvokļus, izmantojot bitu karodziņus [Pārvalda sienas stāvokļus, izmantojot bitu karodziņus.
@begginer-patterns.], @begginer-patterns],
) <components-maze> ) <components-maze>
==== Spēlētāja komponentes ==== Spēlētāja komponentes
@ -1334,8 +1338,8 @@ spēlētāju saistītās funkcijas.
"Apzīmē spēlētāja entitāti", "Apzīmē spēlētāja entitāti",
"Identificē spēlētāju un pieprasa nepieciešamās sastāvdaļas.", "Identificē spēlētāju un pieprasa nepieciešamās sastāvdaļas.",
`CurrentPosition`, `CurrentPosition`,
"Glabā spēlētājs pozīciju", "Glabā spēlētāj pozīciju",
"Nosaka pašreizējo atrašanās vietu labirintā.", "nosaka pašreizējo atrašanās vietu labirintā.",
`MovementSpeed`, `MovementSpeed`,
"Glabā kustības ātrumu", "Glabā kustības ātrumu",
"Nosaka spēlētāja pārvietošanās ātrumu.", "Nosaka spēlētāja pārvietošanās ātrumu.",
@ -1360,8 +1364,8 @@ un ar spēlētāju saistīti notikumi, kas redzams @tbl:events-maze[],
==== Labirintu notikumi ==== Labirintu notikumi
Labirinta notikumi pārvalda labirinta entitāšu dzīves ciklu spēlē. Kā redzams Labirinta notikumi pārvalda labirinta entitāšu dzīves ciklu spēlē. Kā redzams
@tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi un @tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi, atjaunošanu
atjaunošanu. un likvidēšanu.
#events-table( #events-table(
caption: "Ar labirintiem saistīti notikumi", caption: "Ar labirintiem saistīti notikumi",
@ -1371,6 +1375,9 @@ atjaunošanu.
`RespawnMaze`, `RespawnMaze`,
"Atjauno esošo labirintu", "Atjauno esošo labirintu",
"Atjauno labirintu.", "Atjauno labirintu.",
`DespawnMaze`,
"Noņem labirintu",
"Izdzēš labirinta entitātes norādītajam stāvam.",
) <events-maze> ) <events-maze>
==== Stāvu notikumi ==== Stāvu notikumi
@ -1399,8 +1406,8 @@ Stāvu pārejas sistēma izmanto vienu uzskaitītu notikumu tipu (sk.
Ar spēlētāju saistītie notikumi pārvalda spēlētāja entitātes dzīves ciklu (sk. Ar spēlētāju saistītie notikumi pārvalda spēlētāja entitātes dzīves ciklu (sk.
@tbl:events-player). @tbl:events-player).
Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu un Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu, atjaunošanu
atjaunošanu. un likvidēšanu.
#events-table( #events-table(
caption: "Ar spēlētaju saistīti notikumi", caption: "Ar spēlētaju saistīti notikumi",
@ -1410,29 +1417,36 @@ atjaunošanu.
`RespawnPlayer`, `RespawnPlayer`,
"Atjauno spēlētāju", "Atjauno spēlētāju",
"Atiestata spēlētāju uz pašreizējā stāva sākuma pozīciju.", "Atiestata spēlētāju uz pašreizējā stāva sākuma pozīciju.",
`DespawnPlayer`,
"Noņem spēlētāju",
"Izdzēš spēlētāja entitātes.",
) <events-player> ) <events-player>
=== Resursi === Resursi
Bevy resursi kalpo kā globāli stāvokļa konteineri, kuriem var piekļūt jebkura Bevy resursi kalpo kā globāli stāvokļa konteineri, kuriem var piekļūt jebkura
sistēma. sistēma.
Atšķirībā no komponentēm, kas ir piesaistīti konkrētām entitātēm, resursi Atšķirībā no komponentiem, kas ir piesaistīti konkrētām entitātēm, resursi
nodrošina spēles mēroga datus un konfigurāciju. nodrošina spēles mēroga datus un konfigurāciju.
Tie ir īpaši noderīgi kopīgu stāvokļu un iestatījumu pārvaldībai, kas var Tie ir īpaši noderīgi kopīgu stāvokļu un iestatījumu pārvaldībai, kas var
ietekmēt vairākas sistēmas @bevy-cheatbook[nod. ~14.6]. ietekmē vairākas sistēmas @bevy-cheatbook[nod. ~14.6].
Spēle izmanto vienu resursu globālās konfigurācijas un stāvokļa pārvaldībai Spēle izmanto vairākus resursus globālās konfigurācijas un stāvokļa pārvaldībai
(sk. @tbl:resources) (sk. @tbl:resources)
#resources-table( #resources-table(
caption: "Globālie resursi", caption: "Globālie resursi",
`MazePluginLoaded`,
"Spraudņa stāvokļa marķieris",
"Norāda labirinta spraudņa inicializāciju.",
`GlobalMazeConfig`, `GlobalMazeConfig`,
"Labirinta vizuālie iestatījumi", "Labirinta vizuālie iestatījumi",
"Uzglabā globālos labirinta izskata parametrus.", "Uzglabā globālos labirinta izskata parametrus.",
) <resources> ) <resources>
#indent-par[ #indent-par[
Dotais resurss pārvalda labirinta vizuālo attēlojumu, ietverot tādus Resurss "`GlobalMazeConfig`" ir īpaši svarīgs, jo tas pārvalda labirinta vizuālo
parametrus kā sešstūra lielums, sienu biezums un vertikālais augstums. attēlojumu, ietverot tādus parametrus kā sešstūra lielums, sienu biezums un
vertikālais augstums.
] ]
== Daļējs funkciju projektējums == Daļējs funkciju projektējums
@ -1598,7 +1612,7 @@ atgriežas un mēģina citu ceļu.
Labajā pusē ir attēlota stāvu pārejas loģika, kas tiek izpildīta, kad neviens Labajā pusē ir attēlota stāvu pārejas loģika, kas tiek izpildīta, kad neviens
stāvs nekustās. stāvs nekustās.
Šī daļa aprēķina jaunās $Y$ koordinātes visiem stāviem, pievieno tiem Šī daļa aprēķina jaunās $Y$ koordinātes visiem stāviem, pievieno tiem
galamērķa komponentes un atjaunina pašreizējā stāva marķierus. galamērķa komponentes un atjaunina pašreizējā un nākamā stāva marķierus.
] ]
#figure( #figure(
caption: "Stāva kustības sistēma", caption: "Stāva kustības sistēma",
@ -1645,21 +1659,21 @@ atgriežas un mēģina citu ceļu.
action-node((1, 4), [Pievienot stāva galamērķa\ komponenti katram stāvam]) action-node((1, 4), [Pievienot stāva galamērķa\ komponenti katram stāvam])
std-edge() std-edge()
action-node((1, 5), [Atjaunina pašreizējā marķieri]) action-node((1, 5), [Atjaunina pašreizējā un\ nākamā stāvu marķierus])
std-edge("l,uu,l") std-edge("l,uu,l")
}), }),
), ),
) <floor-transition-diagram> ) <floor-transition-diagram>
=== Plākšņu pārvaldības sistēma === Plākšņu pārvaldas sistēma
Projekta sākotnējā plānošanas posmā tika apsvēra iespēja labirinta elementu Projekta sākotnējā plānošanas posmā tika apsvēra iespēja labirinta elementu
pārvaldībai izmantot pārvaldībai izmantot
"bevy_ecs_tilemap" bibliotēku.#footnote[https://crates.io/crates/bevy_ecs_tilemap]<bevy-ecs-tilemap> "`bevy_ecs_tilemap`" bibliotēku.#footnote[https://crates.io/crates/bevy_ecs_tilemap]<bevy-ecs-tilemap>
Tomēr pēc rūpīgas izvērtēšanas tika secināts, ka tā neatbilst konkrētajam Tomēr pēc rūpīgas izvērtēšanas tika secināts, ka tā neatbilst konkrētajam
projekta lietojuma gadījumam sekojošu iemeslu dēļ: projekta lietojuma gadījumam sekojošu iemeslu dēļ:
+ Uz failiem balstīta plākšņu ielāde: "bevy_ecs_tilemap" galvenokārt paļaujas uz + Uz failiem balstīta plākšņu ielāde: "`bevy_ecs_tilemap`" galvenokārt paļaujas uz
plākšņu ielādi no ārējiem failiem. Šajā projektā ir nepieciešami dinamiski, plākšņu ielādi no ārējiem failiem. Šajā projektā ir nepieciešami dinamiski,
procedurāli ģenerēti labirinti, tāpēc šī pieeja nav īsti piemērota. procedurāli ģenerēti labirinti, tāpēc šī pieeja nav īsti piemērota.
+ Elastības ierobežojumi: bibliotēkas plākšņu datu struktūra nav viegli + Elastības ierobežojumi: bibliotēkas plākšņu datu struktūra nav viegli
@ -1667,14 +1681,14 @@ projekta lietojuma gadījumam sekojošu iemeslu dēļ:
sarežģītākām telpiskām attiecībām starp šūnām. sarežģītākām telpiskām attiecībām starp šūnām.
+ Prasības attiecībā uz sienu veidošanu: katrai sistēmas labirinta šūnai + Prasības attiecībā uz sienu veidošanu: katrai sistēmas labirinta šūnai
var būt 0-6 sienas, kas tiek ģenerētas nejauši. Šādu dinamisku sienu ģenerēšanas var būt 0-6 sienas, kas tiek ģenerētas nejauši. Šādu dinamisku sienu ģenerēšanas
līmeni nav viegli sasniegt izmantojot "bevy_ecs_tilemap". līmeni nav viegli sasniegt izmantojot "`bevy_ecs_tilemap`".
#indent-par[ #indent-par[
Tā vietā, lai izmantotu "bevy_ecs_tilemap", tika izlemts izstrādāt pielāgotu Tā vietā, lai izmantotu "`bevy_ecs_tilemap`", tika izlemts izstrādāt pielāgotu
risinājumu, kas tieši integrējas ar labirinta ģenerēšanas algoritmu. Šī risinājumu, kas tieši integrējas ar labirinta ģenerēšanas algoritmu. Šī
pieeja ļauj: pieeja ļauj:
] ]
- vienkāršāku integrācija ar procedurālo labirintu ģenerēšanu; - vienkāršāku integrācija ar procesuālo labirintu ģenerēšanu;
- optimālāku veiktspēja projekta lietošanas gadījumam; - optimālāku veiktspēja projekta lietošanas gadījumam;
- lielāku kontroli pār labirinta vizuālo attēlojumu. - lielāku kontroli pār labirinta vizuālo attēlojumu.
@ -1712,7 +1726,7 @@ pogas.
=== Spēles skats === Spēles skats
Spēles skats apvieno pašu spēles pasauli ar minimālistisku lietotāja saskarni Spēles skats apvieno pašu spēles pasauli ar minimālistisku lietotāja saskarni
(sk. @fig:game-ui). (sk, @fig:game-ui).
Centrālo daļu aizņem spēles pasaule ar sešstūra labirintu, kas veido spēles Centrālo daļu aizņem spēles pasaule ar sešstūra labirintu, kas veido spēles
galveno interaktīvo elementu. galveno interaktīvo elementu.
Ekrāna kreisajā apakšējā stūrī ir izvietoti papildspēju statusa indikatori, kas Ekrāna kreisajā apakšējā stūrī ir izvietoti papildspēju statusa indikatori, kas
@ -1727,7 +1741,7 @@ atjaunošanās laiku.
=== Izstrādes rīki === Izstrādes rīki
Izstrādes rīki, kas redzami @fig:dev-tools-ui[attēlā], ir implementēti Izstrādes rīki, kas redzami @fig:dev-tools-ui[attēlā], ir implementēti
izmantojot "bevy_egui" bibliotēku @bevy_egui. izmantojot "egui" bibliotēku @bevy_egui.
Pirmais "Bevy Inspector Egui" noklusētais skats @bevy-inspector-egui, kas Pirmais "Bevy Inspector Egui" noklusētais skats @bevy-inspector-egui, kas
nodrošina detalizētu piekļuvi spēles entitāšu hierarhijai, komponenšu nodrošina detalizētu piekļuvi spēles entitāšu hierarhijai, komponenšu
inspektoram un resursu pārvaldniekam. inspektoram un resursu pārvaldniekam.
@ -1746,22 +1760,30 @@ testēšana, izmantojot gan automatizētus rīkus, gan manuālu pārbaudi.
== Statiskā testēšana <static-tests> == Statiskā testēšana <static-tests>
Statiskā testēšana ir svarīga daļa no projekta kvalitātes nodrošināšanas. Statiskā testēšana ir svarīga daļa no projekta kvalitātes nodrošināšanas.
"Clippy" tiek izmantots koda analīzei, meklējot potenciālas problēmas un "Clippy"
neoptimālus risinājumus. tiek izmantots koda analīzei, meklējot potenciālas problēmas un
Papildus noklusētajiem noteikumiem, tika aktivizēti stingrāki koda kvalitātes neoptimālus risinājumus. Papildus noklusētajiem noteikumiem, tika aktivizēti
pārbaudes līmeņi: "pedantic" režīms nodrošina padziļinātu koda stila pārbaudi, stingrāki koda kvalitātes pārbaudes līmeņi: "`pedantic`" režīms nodrošina
"nursery" aktivizē eksperimentālās pārbaudes, un "unwrap_used" un "expect_used" padziļinātu koda stila pārbaudi, "`nursery`" aktivizē eksperimentālās pārbaudes,
brīdina par potenciāli nedrošu kļūdu apstrādi. Šie papildu noteikumi palīdz un "`unwrap_used`" un "`expect_used`" brīdina par potenciāli nedrošu kļūdu
uzturēt augstāku koda kvalitāti un samazināt potenciālo kļūdu skaitu apstrādi. Šie papildu noteikumi palīdz uzturēt augstāku koda kvalitāti un
(sk. @clippy-hexlab[] un @clippy-maze-ascension[pielikumus]) @clippy. samazināt potenciālo kļūdu skaitu @clippy.
/* Programmatūras statiskai testēšanai ir izmantots rīks „clang-tidy“, kas analizē
programmatūru, meklējot kļūdas un problēmas pirmkodā. [12] Rīks satur vairākas specifiskas
problēmu kopas, kas var tikt izmantotas analīzē. Tika izmantota „clang-analyzer“ problēmu
kopa. Vieglākai statisko testu darbināšanai tika izmantots vienkāršs programmēšanas valodas
„Python“ skripts, kas atlasa visus failus, kuru paplašinājums ir „cpp“ (valodas „C++“ pirmkoda
fails) vai „h“ (galvenes fails) un darbina statiskās analīzes rīku ar katru failu atsevišķi (sk.
izpildes rezultātu attēlā 4.3.). */
== Dinamiskā testēšana == Dinamiskā testēšana
Lai novērtētu programmatūras uzvedību darbības laikā, tika veikta dinamiskā Lai novērtētu programmatūras uzvedību darbības laikā, tika veikta dinamiskā
testēšana. testēšana. Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot
Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot lietotāja lietotāja saskarnes mijiedarbību, gan automatizētus testu komplektus, lai
saskarnes mijiedarbību, gan automatizētus testu komplektus, lai nodrošinātu nodrošinātu visaptverošu spēles funkcionalitātes pārklājumu.
visaptverošu spēles funkcionalitātes pārklājumu.
=== Manuālā integrācijas testēšana === Manuālā integrācijas testēšana
@ -1770,7 +1792,7 @@ Katrs testa scenārijs ir dokumentēta strukturētas tabulas formātā, ievēroj
būtisku informāciju, piemēram, test nosaukumu, unikālo identifikatoru, aprakstu, būtisku informāciju, piemēram, test nosaukumu, unikālo identifikatoru, aprakstu,
izpildes soļus, gaidāmo rezultātu un faktisko rezultātu (veiksmīga testa izpildes soļus, gaidāmo rezultātu un faktisko rezultātu (veiksmīga testa
gadījumā apzīmēts ar "Ok", bet neveiksmīgu -- "Err"). gadījumā apzīmēts ar "Ok", bet neveiksmīgu -- "Err").
Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā]. Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
#figure( #figure(
@ -1804,24 +1826,22 @@ Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
"Stāvu pāreja (uz augšu)", "Stāvu pāreja (uz augšu)",
[ [
+ Nokļūt līdz beigu šūnai + Nokļūt līdz beigu šūnai
+ Nospiest taustiņu "E"
+ Novērot animāciju + Novērot animāciju
], ],
[ [
+ Jauna stāva ģenerēšana
+ Plūstoša pāreja starp stāviem uz augšu + Plūstoša pāreja starp stāviem uz augšu
+ Jauna stāva ģenerēšana
], ],
"Ok", "Ok",
"MT04", "MT04",
"Stāvu pāreja (uz leju)", "Stāvu pāreja (uz leju)",
[ [
+ Nokļūt līdz sākuma šūnai + Nokļūt līdz sākuma šūnai
+ Nospiest taustiņu "E"
+ Novērot animāciju + Novērot animāciju
], ],
[ [
+ Jauns stāvs netiek ģenerēts
+ Plūstoša pāreja starp stāviem uz leju + Plūstoša pāreja starp stāviem uz leju
+ Jauns stāvs netiek ģenerēts
], ],
"Ok", "Ok",
"MT05", "MT05",
@ -1854,7 +1874,7 @@ Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
"MT08", "MT08",
[Spēlētāja kustība], [Spēlētāja kustība],
[ [
+ Izmantot "WASD" kustības taustiņus + Izmantot WASD vadību
+ Mēģināt šķērsot sienas + Mēģināt šķērsot sienas
], ],
[ [
@ -1867,7 +1887,7 @@ Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
[ [
+ Kompilēt spēli Windows platformai + Kompilēt spēli Windows platformai
+ Palaist .exe failu + Palaist .exe failu
+ Veikt pamata funkcionalitātes testus + Veikt pamata funkcionalitātes testu
], ],
[Spēle darbojas Windows vidē bez kļūdām], [Spēle darbojas Windows vidē bez kļūdām],
"Ok", "Ok",
@ -1876,7 +1896,7 @@ Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
[ [
+ Kompilēt spēli Linux platformai + Kompilēt spēli Linux platformai
+ Palaist bināro failu + Palaist bināro failu
+ Veikt pamata funkcionalitātes testus + Veikt pamata funkcionalitātes testu
], ],
[Spēle darbojas Linux vidē bez kļūdām], [Spēle darbojas Linux vidē bez kļūdām],
"Ok", "Ok",
@ -1885,7 +1905,7 @@ Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
[ [
+ Kompilēt spēli macOS platformai + Kompilēt spēli macOS platformai
+ Palaist .dmg pakotni + Palaist .dmg pakotni
+ Veikt pamata funkcionalitātes testus + Veikt pamata funkcionalitātes testu
], ],
[Spēle darbojas macOS vidē bez kļūdām], [Spēle darbojas macOS vidē bez kļūdām],
"Err", "Err",
@ -1894,7 +1914,7 @@ Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
[ [
+ Kompilēt spēli WASM mērķim + Kompilēt spēli WASM mērķim
+ Atvērt pārlūkā + Atvērt pārlūkā
+ Veikt pamata funkcionalitātes testus + Veikt pamata funkcionalitātes testu
], ],
[ [
+ Spēle ielādējas pārlūkā + Spēle ielādējas pārlūkā
@ -1926,12 +1946,12 @@ Testēšanas stratēģijā ir ieviesti vairāki pārbaudes līmeņi: dokumentāc
no drošina piemēra koda pareizību, moduļu testi pārbauda iekšējo no drošina piemēra koda pareizību, moduļu testi pārbauda iekšējo
funkcionalitāti, savukārt testu mapē esošie vienībtesti un integrācijas testi funkcionalitāti, savukārt testu mapē esošie vienībtesti un integrācijas testi
pārbauda sarežģītākus gadījumus. pārbauda sarežģītākus gadījumus.
Daļējs automatizēto testu izpildes rezultāts ir redzams @fig:tests-hexlab, savukārt Automatizēto testu izpildes rezultātu kopsavilkums ir redzams
detalizēts testu izpildes pārskats ir redzams piejams pielikumā (sk. pieejams @tests-hexlab-full[pielikumā].
@tests-hexlab-full). @fig:tests-hexlab[attēlā], savukārt detalizēts testu izpildes pārskats ir
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (sk. Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (116 no 142
@tarpaulin-hexlab[pielikumu]), tomēr šis rādītājs iekļautajām rindiņām) (sk. @tarpaulin-hexlab[pielikumu]), tomēr šis rādītājs
pilnībā neatspoguļo faktisko pārklājumu, jo rīkam ir ierobežojumi attiecībā uz pilnībā neatspoguļo faktisko pārklājumu, jo rīkam ir ierobežojumi attiecībā uz
"inline"#footnote[https://doc.rust-lang.org/nightly/reference/attributes/codegen.html?highlight=inline] "inline"#footnote[https://doc.rust-lang.org/nightly/reference/attributes/codegen.html?highlight=inline]
funkcijām un citi tehniski ierobežojumi @cargo-tarpaulin. funkcijām un citi tehniski ierobežojumi @cargo-tarpaulin.
@ -1974,22 +1994,19 @@ Viens no galvenajiem rīkiem, kas tiek izmantots ir "Clippy"@clippy, kas analiz
iespējamās problēmas un iesaka uzlabojumus (sk. @static-tests nodaļu). iespējamās problēmas un iesaka uzlabojumus (sk. @static-tests nodaļu).
Kopā ar "Clippy" tiek arī izmantots "Rustfmt" @rustfmt, koda formatētājs, lai Kopā ar "Clippy" tiek arī izmantots "Rustfmt" @rustfmt, koda formatētājs, lai
uzturētu vienotu koda formatējumu visā projektā. uzturētu vienotu koda formatējumu visā projektā. Šis rīks automātiski formatē
Šis rīks automātiski formatē kodu saskaņā ar Rust stila vadlīnijām @rust-style. kodu saskaņā ar Rust stila
vadlīnijām @rust-style.
Turklāt visas publiskās funkcijas un datu struktūras "hexlab" bibliotēkā ir Turklāt visas publiskās funkcijas un datu struktūras "hexlab" bibliotēkā ir
dokumentētas#footnote[https://docs.rs/hexlab/latest/hexlab/]<hexlab-docs>. dokumentētas#footnote[https://docs.rs/hexlab/latest/hexlab/]<hexlab-docs>.
Šajā dokumentācijā ir ietverti detalizēti apraksti un lietošanas piemēri, kas ne Šajā dokumentācijā ir ietverti detalizēti apraksti un lietošanas piemēri, kas ne
tikai palīdz saprast kodu, bet arī atvieglo bibliotēkas testēšanu un kļūdu tikai palīdz saprast kodu, bet programmatūras prasības specifikācija ir
labošanu. izstrādāta, ievērojot LVS 68:1996 standarta "Programmatūras prasību
specifikācijas ceļvedis" @lvs_68 un LVS 72:1996 standarta "Ieteicamā prakse
Programmatūras prasības specifikācija ir izstrādāta, ievērojot LVS 68:1996 programmatūras projektējuma aprakstīšanai" standarta prasības @lvs_72.
standarta "Programmatūras prasību specifikācijas ceļvedis" @lvs_68 un LVS Programmatūras projektējuma aprakstā iekļautās aktivitāšu diagrammas ir veidotas
72:1996 standarta "Ieteicamā prakse programmatūras projektējuma aprakstīšanai" atbilstoši UML (Unified Modeling Language) 2.5 specifikācijai @omg-uml.
standarta prasības @lvs_72.
// Programmatūras projektējuma aprakstā iekļautās
// aktivitāšu diagrammas ir veidotas atbilstoši UML (Unified Modeling Language) 2.5
// specifikācijai @omg-uml.
== Konfigurācijas pārvaldība == Konfigurācijas pārvaldība
@ -2002,7 +2019,7 @@ Rīku konfigurācija ir definēta vairākos failos:
- laidiena kompilācijas ar iespējotu optimizāciju. - laidiena kompilācijas ar iespējotu optimizāciju.
- "GitHub Actions" darbplūsmas, kas apstrādā @gh-actions: - "GitHub Actions" darbplūsmas, kas apstrādā @gh-actions:
- koda kvalitātes pārbaudes (vienībtesti, statiskie testi, formatēšana, - koda kvalitātes pārbaudes (vienībtesti, statiskie testi, formatēšana,
dokumentācijas izveide); dokumentācijas izveide).
- kompilācijas un izvietotošanas darbplūsma, kas: - kompilācijas un izvietotošanas darbplūsma, kas:
- izveido Windows, Linux, macOS un WebAssembly versijas; - izveido Windows, Linux, macOS un WebAssembly versijas;
- publicē bināros failus GitHub platformā; - publicē bināros failus GitHub platformā;
@ -2015,17 +2032,18 @@ Versiju specifikācija notiek pēc semantiskās versiju atlases (MAJOR.MINOR.PAT
== Darbietilpības novērtējums == Darbietilpības novērtējums
Projekta darbietilpības novērtēšanai tika izmantota QSM (angl. Quantitative Projekta darbietilpības novērtēšanai tika izmantota QSM (angl. Quantitative
Software Management, latv. kvantitatīvā programmatūras vadība) metodoloģija, kas Software Management, latv. kvantitatīvā programmatūra vadība) metodoloģija, kas
balstās uz $550$ verificētu programmatūras projektu datubāzi @QSM. balstās uz $550$ verificētu programmatūras projektu datubāzi @QSM.
Izmantojot "tokei" rīku @tokei, tika veikta detalizēta projekta koda analīze, Izmantojot "tokei" rīku @tokei, tika veikta detalizēta projekta koda analīze,
kas parādija, ka "Maze Ascension" projekts satur $2686$ koda rindiņas (sk. @tokei-maze-ascension), bet kas parādija, ka "Maze Ascension" projekts satur $1927$ koda rindiņas, bet
saistītā "hexlab" bibliotēka -- $979$ rindiņas (sk. @tokei-hexlab), kopā saistītā "hexlab" bibliotēka -- $979$ rindiņas, kopā veidojot $2906$ loģiskās koda
veidojot $3236$ pirmkoda rindiņas, neiekļaujot tukšās rindiņas un komentārus. rindiņas, neiekļaujot tukšās rindiņas un komentārus (sk. @tokei-maze-ascension[]
un @tokei-hexlab[pielikumus]).
Saskaņā ar QSM etalontabulu "Business Systems Implementation Unit (New and Saskaņā ar QSM etalontabulu "Business Systems Implementation Unit (New and
Modified IU) Benchmarks", pirmās kvartiles projekti ($25%$ mazākie no $550$ Modified IU) Benchmarks", pirmās kvartiles projekti ($25%$ mazākie no $550$
biznesa sistēmu projektiem) vidēji ilgst $3.2$ mēnešus, ar vidēji $1.57$ biznesa sistēmu projektiem) vidēji ilgst $3.2$ mēnešus, ar vidēji $1.57$
izstrādātājiem un mediāna projekta apjomu -- $1889$ koda rindiņas @QSM. izstrādātājiem un mediāno projekta apjomu -- $1889$ koda rindiņas @QSM.
Ņemot vērā, ka projekta autors ir students ar ierobežotu pieredzi, tiek Ņemot vērā, ka projekta autors ir students ar ierobežotu pieredzi, tiek
izmantota pirmās kvartiles $50%$ diapazona augšējā robeža -- $466$ rindiņas izmantota pirmās kvartiles $50%$ diapazona augšējā robeža -- $466$ rindiņas
personmēnesī. personmēnesī.
@ -2033,11 +2051,11 @@ Tādējādi minimālais nepieciešamais koda apjoms trīs mēnešu darbam būtu
= 1398$ rindiņas. = 1398$ rindiņas.
Projekta faktiskais koda apjoms ($2906$ rindiņas) vairāk nekā divkārt pārsniedz šo Projekta faktiskais koda apjoms ($2906$ rindiņas) vairāk nekā divkārt pārsniedz šo
minimālo slieksni, kas apliecina projekta atbilstību trīs mēnešu darbietilpības minimālo slieksni, kas nepārprotami apliecina projekta atbilstību trīs mēnešu
prasībai. darbietilpības prasībai.
Turklāt jāņem vērā projekta papildu sarežģītības faktori: Turklāt jāņem vērā projekta papildu sarežģītības faktori:
- Bevy dzinēja un ECS arhitektūras apgūšana; - Bevy dzinēja un ECS arhitektūras apgūšana;
- Procedurālās ģenerēšanas algoritma izstrāde "hexlab" bibliotēkai; - Procesuālās ģenerēšanas algoritma izstrāde "hexlab" bibliotēkai;
- "hexlab" bibliotēkas izstrāde ar plašu dokumentāciju, ieskaitot API - "hexlab" bibliotēkas izstrāde ar plašu dokumentāciju, ieskaitot API
dokumentāciju, lietošanas piemērus un integrācijas vadlīnijas. dokumentāciju, lietošanas piemērus un integrācijas vadlīnijas.
@ -2046,6 +2064,7 @@ Turklāt jāņem vērā projekta papildu sarežģītības faktori:
koda rakstīšanu, bet arī izpēti, dokumentēšanu un optimizāciju. koda rakstīšanu, bet arī izpēti, dokumentēšanu un optimizāciju.
] ]
= Secinājumi = Secinājumi
Kvalifikācijas darba ietvaros tika izstrādāta trīsdimensiju spēle, izmantojot Kvalifikācijas darba ietvaros tika izstrādāta trīsdimensiju spēle, izmantojot
@ -2063,9 +2082,9 @@ pāreju starp dažādiem labirinta līmeņiem.
Bevy spēļu dzinēja izmantošana ļāva efektīvi implementēt entitāšu-komponenšu Bevy spēļu dzinēja izmantošana ļāva efektīvi implementēt entitāšu-komponenšu
sistēmu (ECS), kas nodrošina labu veiktspēju un koda organizāciju. sistēmu (ECS), kas nodrošina labu veiktspēju un koda organizāciju.
Tomēr tika konstatēts, ka Bevy ekosistēma joprojām ir aktīvās izstrādes stadijā, Tomēr tika konstatēts, ka Bevy ekosistēma joprojām ir aktīvās izstrādes stadijā,
ko apliecina darba izstrādes laikā iznākusī jaunā versija (0.15). ko apliecina projekta izstrādes laikā iznākusī jaunā versija (0.15).
Šī versija ieviesa vairākas būtiskas izmaiņas, piemēram, "Required Components" Ši versija ieviesa vairākas būtiskas izmaiņas, piemēram, "Required Components"
(latv. nepieciešamo komponenšu) konceptu uzlabotu animāciju sistēmu un daudz ko (latv. nepieciešamo komponentu) konceptu uzlabotu animāciju sistēmu un daudz ko
citu, kas radīja nepieciešamību pielāgot esošo kodu @bevy-0.15. citu, kas radīja nepieciešamību pielāgot esošo kodu @bevy-0.15.
Šāda strauja attīstība, no vienas puses, nodrošina jaunas iespējas un Šāda strauja attīstība, no vienas puses, nodrošina jaunas iespējas un
uzlabojumus, bet no otras puses, rada izaicinājumus saistībā ar dokumentācijas uzlabojumus, bet no otras puses, rada izaicinājumus saistībā ar dokumentācijas
@ -2089,7 +2108,6 @@ Projekta turpmākās attīstības iespējas ietver:
#include "src/attachments.typ" #include "src/attachments.typ"
#include "src/code.typ" #include "src/code.typ"
#include "documentary_page.typ"
// #pagebreak() // #pagebreak()
// #total-words words // #total-words words

View File

@ -1,283 +0,0 @@
#import "@preview/touying:0.5.5": *
#import themes.university: *
#import "@preview/cetz:0.3.1"
#import "@preview/fletcher:0.5.3" as fletcher: node, edge
#import "@preview/ctheorems:1.1.3": *
#import "@preview/numbly:0.1.0": numbly
#import "src/diagrams.typ": *
#set text(
font: (
"Times New Roman",
"New Computer Modern",
),
size: 12pt,
hyphenate: auto,
lang: "lv",
region: "lv",
)
#show raw: set text(
font: (
"JetBrainsMono NF",
"JetBrains Mono",
"Fira Code",
),
features: (calt: 0),
)
// cetz and fletcher bindings for touying
#let cetz-canvas = touying-reducer.with(
reduce: cetz.canvas,
cover: cetz.draw.hide.with(bounds: true),
)
#let fletcher-diagram = touying-reducer.with(
reduce: fletcher.diagram,
cover: fletcher.hide,
)
#set figure(supplement: none)
// Theorems configuration by ctheorems
#show: thmrules.with(qed-symbol: $square$)
#let theorem = thmbox("theorem", "Theorem", fill: rgb("#eeffee"))
#let corollary = thmplain(
"corollary",
"Corollary",
base: "theorem",
titlefmt: strong,
)
#let definition = thmbox(
"definition",
"Definition",
inset: (x: 1.2em, top: 1em),
)
#let example = thmplain("example", "Example").with(numbering: none)
#let proof = thmproof("proof", "Proof")
#show: university-theme.with(
aspect-ratio: "16-9",
config-info(
title: [Spēles izstrāde, izmantojot Bevy spēļu dzinēju],
subtitle: [Kvalifikācijas darbs],
author: [Kristiāns Francis Cagulis kc22015],
date: [2025],
institution: [Latvijas Universitāte],
),
config-colors(
primary: rgb("#575279"),
secondary: rgb("#797593"),
tertiary: rgb("#286983"),
neutral-lightest: rgb("#faf4ed"),
neutral-darkest: rgb("#575279"),
),
)
#title-slide()
#slide[
= Pārskats
- Entitāšu komponenšu sistēma (ECS)
- Maze Ascension
- Hexlab bibliotēka
- Sešstūru implementācija
- Saskarne
- Rezultāti un secinājumi
]
= Entitāšu komponenšu sistēma (ECS)
== Kas ir ECS?
- Koncentrējas uz kompozīciju, nevis mantošanu.
- Datu orientēta arhitektūra.
- Nodalīti dati (komponentes) un uzvedība (sistēmas).
== Datu izkārtojums
// Here is an illustration to help you visualize the logical structure. The
// checkmarks show what component types are present on each entity. Empty cells
// mean that the component is not present. In this example, we have a player, a
// camera, and several enemies.
#context {
show raw: set text(size: 16pt)
table(
columns: 7,
[*Entity (ID)*],
[*Transform*],
[*Player*],
[*Enemy*],
[*Camera*],
[*Health*],
[*...*],
`...`, "", "", "", "", "", "",
"107",
[#emoji.checkmark.heavy `<translation>`\ `<rotation>`\ `<scale>`],
emoji.checkmark.heavy,
"",
"",
[#emoji.checkmark.heavy `<50.0>`],
"",
"108",
[#emoji.checkmark.heavy `<translation>`\ `<rotation>`\ `<scale>`],
"",
emoji.checkmark.heavy,
"",
[#emoji.checkmark.heavy `<25.0>`],
"",
"109",
[#emoji.checkmark.heavy `<translation>`\ `<rotation>`\ `<scale>`],
"",
"",
[#emoji.checkmark.heavy `<camera data>`],
"",
"",
`...`,
)
}
== Piemērs
#context {
show raw: set text(size: 16pt)
```rust
#[derive(Component)]
struct Player;
#[derive(Component)]
struct Health {
current: u32,
max: u32
}
fn heal_player(
mut query: Query<&mut Health, With<Player>>,
time: Res<Time>,
) {
for mut health in query.iter_mut() {
let new_health = health.current + 2. * time.delta_secs();
health.current = new_health.min(health.max);
}
}
```
}
= Maze Ascension
== 1. Līmeņa DPD
#figure(image("assets/images/diagrams/dpd1.png"))
== Stāva modulis
#figure(image("assets/images/diagrams/floor.png", width: 50%))
= Hexlab bibliotēka
#pagebreak()
#figure(
caption: link("https://crates.io/crates/hexlab"),
image("assets/images/crates/hexlab.png", height: 92%),
)
== Labirinta ģenerēšanas funkcijas projektējums
#grid(
columns: (1fr, 1fr),
figure(image("assets/images/diagrams/maze-gen.png")),
figure(image("assets/images/diagrams/recursive.png")),
)
== Ģenerēšanas algoritms
// recursive backtracking
#figure(
caption: link("https://en.wikipedia.org/wiki/Maze_generation_algorithm"),
image("assets/videos/hexmaze/hexmaze.gif", height: 92%),
)
= Sešstūru implementācija
== Attēlošana
#grid(
columns: 2,
figure(image("assets/images/game/tile-spreadout.png", height: 100%)),
figure(image("assets/images/game/tile.png", height: 100%)),
)
#figure(image("assets/images/game/grid.png", height: 100%))
= Saskarne
#pagebreak()
#grid(
columns: 2,
figure(image("assets/images/game/main-menu.png")),
)
#figure(image("assets/videos/game/maze-game.gif"))
#grid(
columns: (1fr, 1fr),
figure(image("assets/images/game/debug.png")),
figure(image("assets/images/game/dev-tools.png")),
)
#figure(image("assets/videos/game/big-maze.gif"))
= Secinājumi
== Rezultāti
- 3D spēle izmantojot Bevy un Rust:
- Procedurāla sešstūraina labirints ģenerēšana, izmantojot DFS.
- Izveidota atkārtoti lietojama atvērtā pirmkoda bibliotēka "hexlab".
- Efektīva līmeņa pārvaldība:
- Vienmērīga pāreja starp labirinta līmeņiem.
== Turpmākie darbi
- Īstenot vairāk labirintu ģenerēšanas paņēmienus/algoritmus.
- Ieviest jaunas mehānikas un papildspējas.
- Uzlabot vizuālo kvalitāti un spēlētāja izskatu.
- Izstrādāt daudzspēlētāju režīmu.
= Paldies par uzmanību!
Jautājumi?
#show: appendix
= Galavārds
== ECS vs OOP
#grid(
columns: (1fr, 1fr),
gutter: 1em,
[
*ECS*
- Plakana hierarhija
- Datu orientēta
- Kešatmiņai piemērots
- Paralēla apstrāde
],
[
*OOP*
- Dziļa mantojamība (inheritance)
- Objektorientēta
- Kešatmiņa izkliedēts
- Secīga apstrāde
],
)
== Iedvesma
#figure(
caption: link("https://www.redblobgames.com/grids/hexagons/"),
grid(
columns: 2,
figure(image("assets/images/redblogmages/axial-coords.png", height: 92%)),
figure(image("assets/videos/coords/coords.gif", height: 92%)),
),
)

View File

@ -1,7 +0,0 @@
#import "@preview/dashy-todo:0.0.1"
#import "@preview/fletcher:0.5.3"
#import "@preview/headcount:0.1.0"
#import "@preview/i-figured:0.2.4"
#import "@preview/tablex:0.0.9"
#import "@preview/touying:0.5.5"
#import "@preview/wordometer:0.1.3"

View File

@ -8,7 +8,7 @@
"Anotācija", "Anotācija",
) )
Kvalifikācijas darbā ir izstrādāta spēle "Maze Ascension", kas piedāvā Kvalifikācijas darbā ir izstrādāta spēle "Maze Ascension", kas piedāvā
spēlētājiem izaicinājumu iziet cauri procedurāli ģenerētiem sešstūrainam spēlētājiem izaicinājumu iziet cauri proceduāli ģenerētiem sešstūrainam
labirintiem. Spēle ir veidota, izmantojot Rust programmēšanas valodu un Bevy labirintiem. Spēle ir veidota, izmantojot Rust programmēšanas valodu un Bevy
spēļu dzinēju. spēļu dzinēju.
@ -32,7 +32,7 @@ sistēmas prasības,
programmatūras prasību specifikācija, programmatūras prasību specifikācija,
Bevy, Bevy,
ECS, ECS,
papildspējas. papilspējas.
#text( #text(
@ -46,7 +46,16 @@ papildspējas.
numbering: none, numbering: none,
"Abstract", "Abstract",
) )
The qualification work "Game development using Bevy game engine" includes the game "Maze Ascension", which offers #align(
center,
heading(
level: 2,
outlined: false,
numbering: none,
text(13pt, "Game development using Bevy game engine"),
),
)
The qualification work includes the game "Maze Ascension", which offers
players the challenge to pass through procedurally generated hexagons players the challenge to pass through procedurally generated hexagons
mazes. The game is built using the Rust programming language and Bevy mazes. The game is built using the Rust programming language and Bevy
game engine. game engine.
@ -65,7 +74,7 @@ papildspējas.
[*Keywords:*], [*Keywords:*],
) )
Maze, Maze,
computer game, comtuper game,
system requirements, system requirements,
software requirements specification, software requirements specification,
Bevy, Bevy,

View File

@ -5,14 +5,10 @@
#set figure(kind: "attachment", supplement: "pielikums") #set figure(kind: "attachment", supplement: "pielikums")
#figure( #figure(
caption: [Clippy rīka rezultāts "hexlab" bibliotēkai], caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
image("../assets/images/clippy/hexlab.png"), image("../assets/images/tests/hexlab-full.png", height: 90%),
) <clippy-hexlab> ) <tests-hexlab-full>
#figure(
caption: [Clippy rīka rezultāts "Maze Ascension" spēlei],
image("../assets/images/clippy/maze-ascension.png"),
) <clippy-maze-ascension>
#figure( #figure(
caption: [Tarpaulin rīka rezultāts "hexlab" bibliotēkai], caption: [Tarpaulin rīka rezultāts "hexlab" bibliotēkai],
@ -29,8 +25,3 @@
caption: [Tokei rīka rezultāts "hexlab" bibliotēkai], caption: [Tokei rīka rezultāts "hexlab" bibliotēkai],
image("../assets/images/tokei/hexlab.png"), image("../assets/images/tokei/hexlab.png"),
) <tokei-hexlab> ) <tokei-hexlab>
#figure(
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
image("../assets/images/tests/hexlab-full.png", height: 90%),
) <tests-hexlab-full>

View File

@ -32,21 +32,14 @@
paper: "a4", paper: "a4",
) )
set text( set text(
font: ( font: "Times New Roman",
"Times New Roman",
"New Computer Modern",
),
size: 12pt, size: 12pt,
hyphenate: auto, hyphenate: auto,
lang: "lv", lang: "lv",
region: "lv", region: "lv",
) )
show raw: set text( show raw: set text(
font: ( font: "JetBrainsMono Nerd Font Mono",
"JetBrainsMono NF",
"JetBrains Mono",
"Fira Code",
),
features: (calt: 0), features: (calt: 0),
) )
@ -199,26 +192,29 @@
if it.kind == "i-figured-table" { if it.kind == "i-figured-table" {
return align( return align(
end, end,
emph(it.counter.display(it.numbering) + " tabula ") + text( emph(it.counter.display(it.numbering) + " tabula ")
weight: "bold", + text(
it.body, weight: "bold",
), it.body,
),
) )
} }
if it.kind == "i-figured-image" { if it.kind == "i-figured-image" {
return align( return align(
start, start,
emph(it.counter.display(it.numbering) + " att. ") + text( emph(it.counter.display(it.numbering) + " att. ")
weight: "bold", + text(
it.body, weight: "bold",
), it.body,
),
) )
} }
if ( if (
it.kind in ( it.kind
"i-figured-raw", in (
"i-figured-\"attachment\"", "i-figured-raw",
) "i-figured-\"attachment\"",
)
) { ) {
return align( return align(
end, end,
@ -245,7 +241,9 @@
numbering( numbering(
el.numbering, el.numbering,
..counter(heading).at(el.location()), ..counter(heading).at(el.location()),
) + " " + el.body, )
+ " "
+ el.body,
) )
} }
@ -256,7 +254,7 @@
let supplement_map = ( let supplement_map = (
i-figured-table: "tab.", i-figured-table: "tab.",
i-figured-image: "att.", i-figured-image: "att.",
attachment: "pielikumu", attachment: "pielikums",
) )
@ -276,7 +274,8 @@
numbering( numbering(
el.numbering, el.numbering,
..counter(figure.where(kind: kind)).at(el.location()), ..counter(figure.where(kind: kind)).at(el.location()),
) + "." )
+ "."
) // Only add dot for attachments ) // Only add dot for attachments
} else { } else {
numbering( numbering(
@ -288,11 +287,12 @@
// Create counter based on the kind // Create counter based on the kind
return link( return link(
el.location(), el.location(),
number + if supplement != "" { number
" " + supplement + if supplement != "" {
} else { " " + supplement
"" } else {
}, ""
},
) )
} }
@ -301,13 +301,17 @@
} }
/* --- Figure/Table config end --- */ /* --- Figure/Table config end --- */
set list(marker: ( set list(
[•], marker: (
[--], [•],
[\*], [--],
[·], [\*],
)) [·],
set enum(numbering: "1aiA)") // TODO: make the same style as LaTeX: 1. | (a) | i. | A. ),
)
set enum(
numbering: "1aiA)",
) // TODO: make the same style as LaTeX: 1. | (a) | i. | A.
// Abstract // Abstract
include "abstract.typ" include "abstract.typ"