Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d925fd4ce | |||
| f170000db1 | |||
| 9262f98e19 | |||
| 7f7314de81 | |||
| 4ec2ebecf0 | |||
| e1e9346adf | |||
| 09b3e38b52 | |||
| 01f37de1df | |||
| a3ac544af6 | |||
| e6a51832ab | |||
| c9d987f5b6 | |||
| bda058ff59 | |||
| 7217cd110d | |||
| e71ddd761a | |||
| a2dece79d6 | |||
| 4efbf66eb3 | |||
| 5b7d2d0e35 | |||
| 4a095f9631 |
31
.github/workflows/deploy.yml
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
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
|
||||
30
.github/workflows/typst.yml
vendored
@ -11,31 +11,27 @@ on:
|
||||
type: string
|
||||
permissions:
|
||||
contents: write
|
||||
packages: read
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup fonts
|
||||
run: |
|
||||
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
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Typst
|
||||
uses: typst-community/setup-typst@v3
|
||||
with:
|
||||
source_file: |
|
||||
main.typ
|
||||
documentary_page.typ
|
||||
- name: Rename main.pdf
|
||||
run: mv main.pdf kval_darbs_kristians_cagulis_kc22015.pdf
|
||||
typst-version: 0.12
|
||||
cache-dependency-path: requirements.typ
|
||||
- name: Compile Typst files
|
||||
run: |
|
||||
typst compile --font-path=assets/fonts main.typ Cagulis_Kristians.Francis_kc22015.pdf
|
||||
typst compile --font-path=assets/fonts documentary_page.typ reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
|
||||
- name: Upload PDF file
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: PDF
|
||||
path: |
|
||||
*.pdf
|
||||
path: "*.pdf"
|
||||
- name: Get current date
|
||||
id: date
|
||||
run: echo "DATE=$(date +%Y-%m-%d-%H:%M)" >> $GITHUB_ENV
|
||||
@ -44,4 +40,6 @@ jobs:
|
||||
if: github.ref_type == 'tag'
|
||||
with:
|
||||
name: "${{ github.ref_name }} — ${{ env.DATE }}"
|
||||
files: "*.pdf"
|
||||
files: |
|
||||
Cagulis_Kristians.Francis_kc22015.pdf
|
||||
reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Default, Reflect)]
|
||||
#[reflect(Component)]
|
||||
pub struct Player;
|
||||
@ -39,7 +39,6 @@ pub(super) fn spawn_maze(
|
||||
Visibility::Visible,
|
||||
))
|
||||
.insert_if(CurrentFloor, || *floor == 1) // Only floor 1 gets CurrentFloor
|
||||
.insert_if(NextFloor, || *floor != 1) // All other floors get NextFloor
|
||||
.id();
|
||||
|
||||
let assets = MazeAssets::new(&mut meshes, &mut materials, &global_config);
|
||||
|
||||
BIN
assets/fonts/TimesNewRoman/Times.TTF
Normal file
BIN
assets/fonts/TimesNewRoman/Times.ttf
Normal file
BIN
assets/fonts/TimesNewRoman/Timesbd.TTF
Normal file
BIN
assets/fonts/TimesNewRoman/Timesbi.TTF
Normal file
BIN
assets/fonts/TimesNewRoman/Timesi.TTF
Normal file
BIN
assets/images/clippy/hexlab.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
assets/images/clippy/maze-ascension.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
assets/images/crates/hexlab.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
assets/images/diagrams/dpd1.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
assets/images/diagrams/floor.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
assets/images/diagrams/maze-gen.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
assets/images/diagrams/recursive.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
assets/images/game/debug.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
assets/images/game/dev-tools.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
assets/images/game/grid.png
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
assets/images/game/main-menu.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
assets/images/game/tile-spreadout.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
assets/images/game/tile.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
assets/images/redblogmages/axial-coords.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
BIN
assets/videos/coords/coords-fast.gif
Normal file
|
After Width: | Height: | Size: 33 MiB |
BIN
assets/videos/coords/coords-fast.webm
Normal file
BIN
assets/videos/coords/coords.gif
Normal file
|
After Width: | Height: | Size: 36 MiB |
BIN
assets/videos/coords/coords.webm
Normal file
BIN
assets/videos/coords/palette.png
Normal file
|
After Width: | Height: | Size: 952 B |
BIN
assets/videos/game/big-maze.gif
Normal file
|
After Width: | Height: | Size: 42 MiB |
BIN
assets/videos/game/big-maze.mkv
Normal file
BIN
assets/videos/game/maze-game-fast.gif
Normal file
|
After Width: | Height: | Size: 31 MiB |
BIN
assets/videos/game/maze-game-fast.webm
Normal file
BIN
assets/videos/game/maze-game.gif
Normal file
|
After Width: | Height: | Size: 84 MiB |
BIN
assets/videos/game/maze-game.webm
Normal file
BIN
assets/videos/game/palette.png
Normal file
|
After Width: | Height: | Size: 986 B |
BIN
assets/videos/hexmaze/hexmaze-fast.gif
Normal file
|
After Width: | Height: | Size: 3.8 MiB |
BIN
assets/videos/hexmaze/hexmaze-fast.webm
Normal file
BIN
assets/videos/hexmaze/hexmaze.gif
Normal file
|
After Width: | Height: | Size: 3.6 MiB |
BIN
assets/videos/hexmaze/hexmaze.webm
Normal file
BIN
assets/videos/hexmaze/palette.png
Normal file
|
After Width: | Height: | Size: 983 B |
@ -1,5 +1,4 @@
|
||||
#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": indent
|
||||
|
||||
@ -50,7 +49,7 @@
|
||||
#let long-underline = underline(box(width: 1fr, repeat(sym.space)))
|
||||
#set page(numbering: none)
|
||||
|
||||
= Dokumentārā lapa
|
||||
#heading(level: 1, outlined: false, numbering: none, "Dokumentārā lapa")
|
||||
|
||||
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ē,
|
||||
@ -69,18 +68,18 @@ izdrukai un/vai recenzentam uzrādītajai darba versijai.
|
||||
)
|
||||
|
||||
v(vspace / 2)
|
||||
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~\_\_.01.2025.*]
|
||||
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~06.01.2025.*]
|
||||
|
||||
v(vspace)
|
||||
[Rekomendēju darbu aizstāvēšanai\
|
||||
Darba vadītājs: *prof. Mg. dat. Jānis Iljins ~~\_\_.01.2025.*]
|
||||
Darba vadītājs: *Mg. dat. Jānis Iljins ~~06.01.2025.*]
|
||||
|
||||
v(vspace)
|
||||
[Recenzents: *Artūrs Driķis*]
|
||||
|
||||
|
||||
v(vspace)
|
||||
[Darbs iesniegs *\_\_.01.2025.*\
|
||||
[Darbs iesniegs *06.01.2025.*\
|
||||
Kvalifikācijas darbu pārbaudījumu komisijas sekretārs (elektronisks paraksts)
|
||||
]
|
||||
|
||||
|
||||
476
main.typ
@ -15,34 +15,41 @@
|
||||
thesis_type: "Kvalifikācijas darbs",
|
||||
title: [Spēles izstrāde, izmantojot\ Bevy spēļu dzinēju],
|
||||
authors: ("Kristiāns Francis Cagulis, kc22015",),
|
||||
advisor: "prof. Mg. dat. Jānis Iljins",
|
||||
advisor: "Mg. dat. Jānis Iljins",
|
||||
date: "Rīga 2025",
|
||||
)
|
||||
#set heading(numbering: none)
|
||||
= 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;
|
||||
/ DPD: datu plūsmas diagramma;
|
||||
/ ECS: entitāšu-komponenšu sistēma (angl. Entity-Component-System)@ecs;
|
||||
/ Interpolācija: starpvērtību atrašana pēc funkcijas doto vērtību virknes;
|
||||
/ Entitāte: unikāls identifikators, kas apvieno saistītās komponentes;
|
||||
/ 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;
|
||||
/ Laidiens: Programmatūras versija, kas ir gatava izplatīšanai lietotājiem un satur īpašas funkcijas, uzlabojumus vai labojumus;
|
||||
/ Komponente: datu struktūra, kas satur tikai datus bez loģikas;
|
||||
/ Notikums: īslaicīga ziņojuma struktūra, kas tiek izmantota komunikācijai starp sistēmām;
|
||||
/ PPA: programmatūras projektējuma apraksts;
|
||||
/ PPS: programmatūras prasību specifikācija;
|
||||
/ 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;
|
||||
/ 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ēts vizuāla izvade;
|
||||
/ 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ā;
|
||||
/ 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.
|
||||
/ 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>;
|
||||
/ 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;
|
||||
/ Renderēšana: process, kurā tiek ģenerēta 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;
|
||||
/ Sistēma: loģikas vienība, kas apstrādā entitātes ar specifiskām komponentēm;
|
||||
/ Spēlētājs: entitāte, kas reprezentē lietotāja vadāmo objektu spēlē;
|
||||
/ 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.
|
||||
|
||||
= Ievads
|
||||
== Nolūks
|
||||
Šī dokumenta mērķis ir raksturot 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ību specifikācija (PPS) ir izstrādāta, lai definētu un
|
||||
dokumentētu procedurāli ģenerētas sešstūru labirinta spēles "Maze Ascension"
|
||||
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
|
||||
Darba galvenā uzmanība ir vērsta uz būtisku spēles mehāniku ieviešanu, tostarp
|
||||
@ -51,7 +58,7 @@ integrāciju un vertikālās progresijas mehāniku, vienlaikus ievērojot minim
|
||||
dizaina filozofiju.
|
||||
|
||||
Spēles pamatā ir procedurāli ģenerēti sešstūra labirinti, kas katrā spēlē rada
|
||||
unikālu vizuālo un navigācijas izaicinājumu. Procedurālās ģenerēšanas sistēma
|
||||
unikālu vizuālu un navigācijas izaicinājumu. Procedurālās ģenerēšanas sistēma
|
||||
nodrošina, ka:
|
||||
|
||||
- katrs labirints tiek unikāli ģenerēts "uzreiz"#footnote[Attiecas uz gandrīz
|
||||
@ -64,7 +71,7 @@ nodrošina, ka:
|
||||
- uzglabāšanas prasības tiek samazinātas līdz minimumam, ģenerējot labirintus reāllaikā.
|
||||
|
||||
#indent-par[
|
||||
Spēlētāju uzdevums ir pārvietoties pa šiem procesuāli ģenerētajiem labirintiem,
|
||||
Spēlētāju uzdevums ir pārvietoties pa šiem procedurāli ģenerētajiem labirintiem,
|
||||
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,
|
||||
izpēte un papildu prasmju izmantošana.
|
||||
@ -76,9 +83,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.
|
||||
|
||||
No tehniskā viedokļa darbā tiek pētīta šo funkciju īstenošana, izmantojot
|
||||
Bevy entitāšu-komponentu sistēmas (tuprmāk tekstā -- ECS) arhitektūru.
|
||||
Bevy entitāšu-komponenšu sistēmas (turpmāk tekstā -- ECS) arhitektūru.
|
||||
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 funkcionalitāšu izmantošanu.
|
||||
mehānismus un efektīvu Bevy iebūvēto funkciju izmantošanu.
|
||||
|
||||
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,
|
||||
@ -105,8 +112,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
|
||||
mehānikas, kas padara spēli izaicinošāku un interesantāku.
|
||||
|
||||
Programmatūras prasību specifikācijas sadaļa detalizē sistēmas funkcionālās
|
||||
prasības un arhitektūru.
|
||||
Programmatūras prasību specifikācijas sadaļa detalizētāk apraksta sistēmas
|
||||
funkcionālās prasības un arhitektūru.
|
||||
Izmantojot datu plūsmas diagrammas, tiek ilustrēta sistēmas moduļu mijiedarbība
|
||||
un datu plūsmas starp tiem.
|
||||
Šajā sadaļā tiek aprakstīti pieci galvenie moduļi: spēles stāvokļa pārvaldības
|
||||
@ -118,7 +125,7 @@ funkciju tabulas.
|
||||
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
|
||||
komponentes, notikumi un resursi.
|
||||
Daļējā funkciju projektējuma apakšsadaļā tiek detalizēta plākšņu pārvaldības
|
||||
Daļējā funkciju projektējuma apakšsadaļā tiek detalizēta šūnu pārvaldības
|
||||
sistēma un citas būtiskas funkcijas.
|
||||
Saskarņu projektējuma apakšsadaļā tiek aprakstīta lietotāja saskarnes
|
||||
arhitektūra un implementācija.
|
||||
@ -126,9 +133,9 @@ arhitektūra un implementācija.
|
||||
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
|
||||
metodes un rīki.
|
||||
Dinamiskās testēšanas apakšsadaļā tiek detalizēta gan manuālā integrācijas
|
||||
testēšana, gan automatizēto testu implementācija, sniedzot konkrētus piemērus un
|
||||
rezultātus.
|
||||
Dinamiskās testēšanas apakšsadaļā tiek detalizētāk izskatīta gan manuālā
|
||||
integrācijas testēšana, gan automatizēto testu implementācija, sniedzot
|
||||
konkrētus piemērus un rezultātus.
|
||||
|
||||
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
|
||||
@ -147,10 +154,10 @@ ieteikumi turpmākai projekta attīstībai.
|
||||
== Esošā stāvokļa apraksts
|
||||
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
|
||||
biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu. Spēļu
|
||||
dzinējs Bevy ar savu moderno arhitektūru un Rust programmēšanas valodas
|
||||
biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu.
|
||||
Spēļu 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ā
|
||||
drošām un vienlaicīgām funkcijām.
|
||||
drošām, paralēlām sistēmām.
|
||||
|
||||
== Pasūtītājs
|
||||
Sistēma nav izstrādāta pēc konkrēta pasūtītāja pieprasījuma, tā ir raksturota un
|
||||
@ -169,41 +176,27 @@ un saistošu pieredzi dažādās operētājsistēmās un vidēs.
|
||||
|
||||
Spēle tiek izplatīta, izmantojot "GitHub
|
||||
releases"#footnote[https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases]<gh-release>
|
||||
un itch.io,#footnote[https://itch.io/]<itch-io> kas ir
|
||||
un itch.io platformas,#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
|
||||
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. */
|
||||
visā pasaulē.
|
||||
|
||||
== Darījumprasības
|
||||
Sistēmas izstrādē galvenā uzmanība tiks pievērsta sekojošu darījumprasību
|
||||
īstenošanai, lai nodrošinātu stabilu un saistošu lietotāja pieredzi:
|
||||
Sistēmas izstrādē tiek izvirzītas sekojošas darījumprasības, kas nodrošinās
|
||||
kvalitatīvu lietotāja pieredzi:
|
||||
|
||||
+ Spēles progresēšana un līmeņu pārvaldība: Sistēma automātiski pārvaldīs
|
||||
spēlētāju virzību pa spēles līmeņiem, nodrošinot vienmērīgu pāreju, kad
|
||||
spēlētāji progresē un saskaras ar jauniem izaicinājumiem. Progress tiks
|
||||
saglabāts lokāli spēlētāja ierīcē.
|
||||
+ Nevainojama piekļuve spēlēm: Spēlētāji varēs piekļūt spēlei un spēlēt to bez
|
||||
nepieciešamības izveidot lietotāja kontu vai pieteikties. Tas nodrošina
|
||||
netraucētu piekļuvi spēlei, ļaujot spēlētājiem nekavējoties sākt spēlēt.
|
||||
// + Paziņošanas sistēma: Spēlētāji saņems paziņojumus par svarīgiem spēles
|
||||
// atjauninājumiem, sasniegumiem un citu svarīgu informāciju, lai saglabātu viņu
|
||||
// iesaisti un informētību.
|
||||
+ Savietojamība ar vairākām platformām: sistēma būs pieejama vairākās
|
||||
platformās, tostarp Linux, macOS, Windows un WebAssembly, nodrošinot plašu
|
||||
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.
|
||||
- Līmeņu pārvaldība: Sistēma nodrošinās automātisku spēles līmeņu pārvaldību un
|
||||
vienmērīgu pāreju starp tiem, veidojot pakāpenisku grūtības pieaugumu.
|
||||
- Līmeņu ģenerēšana: Sistēma nodrošinās procedurālu līmeņu ģenerēšanu, radot
|
||||
unikālus sešstūrainus labirintus katram spēles stāvam, garantējot, ka katrs
|
||||
labirints ir pilnībā izejams.
|
||||
- Tieša piekļuve: Spēle būs pieejama bez lietotāja konta izveides vai
|
||||
autentifikācijas, nodrošinot tūlītēju piekļuvi spēles saturam.
|
||||
- Platformu atbalsts: Sistēma tiks izstrādāta ar daudzplatformu atbalstu,
|
||||
ietverot Linux, macOS, Windows un WebAssembly platformas.
|
||||
- Kopienas integrācija: Izmantojot itch.io@itch-io platformu, tiks nodrošināta
|
||||
spēlētāju atsauksmju apkopošana un kopienas atbalsts.
|
||||
- Nepārtraukta izstrāde: Izmantojot CI/CD risinājumus, tiks nodrošināta regulāra
|
||||
spēles atjaunināšana un uzturēšana.
|
||||
|
||||
== 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
|
||||
@ -212,10 +205,7 @@ 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
|
||||
brīža.
|
||||
|
||||
/* "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
|
||||
Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa DPD
|
||||
(sk. @fig:dpd-0).
|
||||
|
||||
#figure(
|
||||
@ -236,10 +226,29 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ
|
||||
) <dpd-0>
|
||||
|
||||
== 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:
|
||||
+ Programmēšanas valodas un Bevy spēles dzinēja tehniskie ierobežojumi;
|
||||
+ Responsivitāte;
|
||||
+ Starpplatformu savietojamība: Linux, macOS, Windows un WebAssembly.
|
||||
+ Bevy dzinēja tehniskie ierobežojumi:
|
||||
+ ECS arhitektūras specifika un tās ierobežojumi datu organizācijā;
|
||||
+ "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ā;
|
||||
+ 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[
|
||||
Dokumentācijas izstrādei ir izmantots Typst rīks, kas nodrošina efektīvu darbu
|
||||
@ -250,11 +259,11 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ
|
||||
== Pieņēmumi un atkarības
|
||||
- Tehniskie pieņēmumi:
|
||||
- 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.
|
||||
- ierīcei jāatbalsta WebGL2 #footnote("https://registry.khronos.org/webgl/specs/latest/2.0/"),
|
||||
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.
|
||||
- ekrāna izšķirtspējai jābūt vismaz 800x600 pikseļu, lai spēle būtu optimāla.
|
||||
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/");
|
||||
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;
|
||||
- ekrāna izšķirtspējai jābūt vismaz $800 times 600$ pikseļi.
|
||||
- Veiktspējas atkarība:
|
||||
- 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:
|
||||
@ -279,7 +288,7 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ
|
||||
\1. līmeņa datu plūsmas diagramma (sk. @fig:dpd-1) ilustrē galvenos
|
||||
procesus spēles "Maze Ascension" sistēmā.
|
||||
Diagrammā attēloti seši galvenie procesi, viens izstrādes process un viens
|
||||
ārējs (bibliotēkas) process(-i) process:
|
||||
ārējs (bibliotēkas) process(-i):
|
||||
stāva pārvaldības modulis,
|
||||
labirinta ģenerēšanas un pārvaldības moduļi,
|
||||
spēlētāja modulis,
|
||||
@ -289,17 +298,16 @@ un izstrādes rīku modulis.
|
||||
Šie procesi mijiedarbojas ar vienu datu krātuvi -- operatīvo atmiņu (RAM) -- un vienu
|
||||
ārējo lietotāju -- spēlētājs.
|
||||
|
||||
Ievades apstrādes modulis uztver un apstrādā spēlētāja ievades datus.
|
||||
Spēles stāvokļa modulis pārrauga vispārējo spēles stāvokli.
|
||||
Labirinta ģeneratora modulis izveido un pārvalda labirinta struktūras.
|
||||
Spēlētāja modulis apstrādā visas ar spēlētāju saistītās kustības, sadursmes un papildspēju mijiedarbības.
|
||||
Spēles līmeņu pārvaldnieks kontrolē līmeņu virzību un stāvokli.
|
||||
Renderēšanas un audio moduļi pārvalda attiecīgi vizuālo un audio izvadi.
|
||||
Bevy spēļu dzinējs diagrammā ir attēlots kā ārējs process vairāku iemeslu dēļ.
|
||||
Pirmkārt, Bevy nodrošina pamata infrastruktūru spēles darbībai, ieskaitot
|
||||
ievades apstrādi, renderēšanu un audio atskaņošanu.
|
||||
Tā rezultātā visa lietotāja mijiedarbība ar spēli (tastatūras, peles ievade)
|
||||
vispirms tiek apstrādāta caur Bevy sistēmām, pirms tā nonāk līdz spēles
|
||||
specifiskajiem moduļiem.
|
||||
|
||||
// Visas datu plūsmas starp procesiem tiek nodrošinātas, izmantojot operatīvo
|
||||
// atmiņu, ievērojot atbilstošas datu plūsmas diagrammas konvencijas. Šī
|
||||
// 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.
|
||||
Operatīvā atmiņa (RAM) ir vienīgā datu krātuve diagrammā, jo Bevy ECS
|
||||
arhitektūra balstās uz komponenšu datiem, kas tiek glabāti operatīvajā atmiņā un
|
||||
spēles stāvoklis netiek pastāvīgi saglabāts diskā.
|
||||
|
||||
#figure(
|
||||
caption: [\1. līmeņa DPD],
|
||||
@ -359,7 +367,6 @@ Renderēšanas un audio moduļi pārvalda attiecīgi vizuālo un audio izvadi.
|
||||
(0, -3),
|
||||
[Bevy],
|
||||
inset: 20pt,
|
||||
extrude: (-4pt, 0),
|
||||
stroke: (thickness: 1pt, dash: "dashed"),
|
||||
)
|
||||
dpd-edge("uu", align(center)[Vizuālās\ izvades dati])
|
||||
@ -481,6 +488,22 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu.
|
||||
|
||||
=== 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(
|
||||
caption: [Izstrādes rīku moduļa 2. līmeņa DPD],
|
||||
diagram(
|
||||
@ -497,44 +520,18 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu.
|
||||
),
|
||||
) <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(
|
||||
"Labirinta pārvadības saskarne",
|
||||
"IRMF01",
|
||||
[Apstrādā un izvada labirinta konfigurācijas vadības elementus lietotāja saskarnē.],
|
||||
[
|
||||
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>
|
||||
+ "`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
|
||||
komponenti;
|
||||
+ Globālais labirinta konfigurācijas resurss.
|
||||
],
|
||||
[
|
||||
+ 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 "`EguiContext`" komponenti no primārā loga.
|
||||
+ Saņem labirinta konfigurāciju un stāvu komponentes no pašreizējā stāva.
|
||||
+ Izveido jaunu "Maze Controls" logu, izmantojot "egui".
|
||||
+ Ja globālais labirinta konfigurācijas resurss ir pieejams:
|
||||
@ -563,7 +560,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
|
||||
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
|
||||
līmeņiem, savukārt pārejas apstrādes sistema koordinē pārejas starp pašreizējo
|
||||
līmeņiem, savukārt pārejas apstrādes sistēma koordinē pārejas starp pašreizējo
|
||||
un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-floor).
|
||||
|
||||
#figure(
|
||||
@ -613,7 +610,6 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
|
||||
+ Pārejas notikums.
|
||||
+ Stāvas entitātes.
|
||||
+ Pašreizējais stāvs.
|
||||
+ Nākamais stāvs.
|
||||
],
|
||||
[
|
||||
+ Pārbauda vai ir aktīva pāreja.
|
||||
@ -622,8 +618,7 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
|
||||
+ Pievieno mērķa komponentes stāvu entitātēm.
|
||||
+ Atjauno stāvu statusus:
|
||||
+ Noņem pašreizējā stāva komponenti no pašreizējā stāva entitātes.
|
||||
+ Pievieno nākamā stāva komponenti nākamā entitātei.
|
||||
+ Noņem nākamā stāva komponenti no nākamā stāva entitātes.
|
||||
+ Pievieno pašreizējā stāva komponenti nākamā stāva entitātei.
|
||||
],
|
||||
[
|
||||
+ Atjaunināts stāvs.
|
||||
@ -633,10 +628,10 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
|
||||
=== Labirinta ģenerēšanas modulis
|
||||
|
||||
Moduļa funkcionalitāte ir izmantota sešstūraina labirinta ģenerēšanai,
|
||||
balstoties uz Amit Patel's "Hexagonal Grids"
|
||||
balstoties uz "Hexagonal Grids"
|
||||
rakstu @hex-grid, kas jau ir
|
||||
kļuvis par _de facto_ standartu sešstūrainu režģu matemātikas un algoritmu
|
||||
implementācijai izstrādē.
|
||||
implementācijai.
|
||||
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).
|
||||
|
||||
@ -681,21 +676,21 @@ programmu.
|
||||
],
|
||||
[
|
||||
+ Validē ievades parametrus:
|
||||
+ Pārbauda rādiusa esamību un derīgumu;
|
||||
+ Validē sākuma pozīciju, ja tāda norādīta;
|
||||
+ Pārbauda rādiusa esamību un derīgumu.
|
||||
+ Validē sākuma pozīciju, ja tāda norādīta.
|
||||
+ 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.
|
||||
+ Validē stākuma prozīciju, ja tāda norādīta.
|
||||
+ Validē sākuma pozīciju, ja tāda norādīta.
|
||||
+ Ģ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ļš.
|
||||
],
|
||||
[
|
||||
+ 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:
|
||||
+ Pozīcijas koordinātēm ($x$, $y$);
|
||||
+ Pozīcijas koordinātēm ($x$, $y$).
|
||||
+ Sienu konfigurāciju (8-bitu maska).
|
||||
],
|
||||
[
|
||||
@ -707,8 +702,8 @@ programmu.
|
||||
|
||||
=== Labirinta pārvaldības modulis
|
||||
Labirinta pārvaldības modulis ir atbildīgs par labirintu ģenerēšanu un
|
||||
pārvaldību katrā spēles stāvā. Moduļa darbības plūsma ir attēlota 2. līmeņa datu
|
||||
plūsmas diagrammā (sk. @fig:dpd-2-maze).
|
||||
pārvaldību katrā spēles stāvā. Moduļa funkciju datu plūsmas ir attēlotas 2.
|
||||
līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-maze).
|
||||
|
||||
Modulis nodrošina divas galvenās funkcijas: labirinta izveidi
|
||||
(sk. @tbl:maze-F01) un labirinta atjaunošanu (sk. @tbl:maze-F02).
|
||||
@ -718,7 +713,8 @@ Funkcija ģenerē jaunu labirintu, izmantojot norādīto konfigurāciju, un izvi
|
||||
to atbilstošā augstumā spēles pasaulē.
|
||||
|
||||
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 ID.
|
||||
saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes
|
||||
identifikatoru.
|
||||
|
||||
#figure(
|
||||
caption: [Labirinta pārvaldības moduļa 2. līmeņa DPD],
|
||||
@ -754,8 +750,8 @@ saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes ID.
|
||||
+ Aprēķina vertikālo nobīdi jaunajam stāvam.
|
||||
+ Izveido jaunu entitāti, kas pārstāv labirinta stāvu, pievienojot tam
|
||||
atbilstošās komponente.
|
||||
+ Atkarībā no tā, vai tas ir pašreizējais vai nākamais stāvs, pievieno
|
||||
attiecīgo komponenti.
|
||||
+ Atkarībā no tā, vai tas ir pašreizējais stāvs, pievieno
|
||||
pašreizējā stāva komponenti.
|
||||
+ Izveido jaunas entitātes, kas pārstāv labirinta šūnas, kā bērnu
|
||||
elementus labirinta entitātei.
|
||||
+ Katrai labirinta šūnai atbilstoši labirinta konfigurācijai, izveido
|
||||
@ -766,7 +762,7 @@ saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes ID.
|
||||
],
|
||||
[
|
||||
+ "Stāvs $x$ jau eksistē."
|
||||
+ "Neizdevās ģenerēt labirintu stāvam $x$."
|
||||
// + "Neizdevās ģenerēt labirintu stāvam $x$."
|
||||
],
|
||||
) <maze-F01>
|
||||
|
||||
@ -799,18 +795,20 @@ saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes ID.
|
||||
|
||||
=== 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
|
||||
tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi. Moduļa darbības
|
||||
plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-player), kas
|
||||
parāda četras galvenās funkcijas un to mijiedarbību ar datu glabātuvi.
|
||||
tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi.
|
||||
Moduļa datu plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk.
|
||||
@fig:dpd-2-player), kas parāda četras galvenās funkcijas un to mijiedarbību ar
|
||||
datu glabātuvi.
|
||||
|
||||
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).
|
||||
Ievades apstrādes funkcija pārbauda tastatūras ievadi
|
||||
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,
|
||||
izmantojot interpolāciju starp pašreizējo un mērķa pozīciju.
|
||||
izmantojot interpolāciju#footnote[Matemātiska metode, kas aprēķina starpvērtības
|
||||
starp diviem zināmiem punktiem.] starp pašreizējo un mērķa pozīciju.
|
||||
|
||||
Stāvu pārejas apstrāde (#link(<player-F04>)[SPMF04]) nepārtraukti uzrauga spēlētāja pozīciju
|
||||
Stāvu pārejas apstrāde 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
|
||||
punktiem, funkcija izsauc atbilstošu pārejas notikumu.
|
||||
|
||||
@ -989,22 +987,23 @@ punktiem, funkcija izsauc atbilstošu pārejas notikumu.
|
||||
) <player-F04>
|
||||
|
||||
=== 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
|
||||
un pārejas starp tiem. Modulis sastāv no trim galvenajām funkcijām: spēles
|
||||
sākšana (@tbl:screen-F01), atgriešanās uz sākumekrānu
|
||||
(@tbl:screen-F02) un sākumekrāna attēlošanas
|
||||
(@tbl:screen-F03). Katra no šīm funkcijām apstrādā specifiskus
|
||||
lietotāja ievades datus un atbilstoši atjaunina spēles stāvokli operatīvajā
|
||||
atmiņā.
|
||||
un pārejas starp tiem. Modulis sastāv no trim galvenajām funkcijām:
|
||||
spēles sākšana (@tbl:screen-F01),
|
||||
atgriešanās uz sākumekrānu (@tbl:screen-F02) un
|
||||
sākumekrāna attēlošanas (@tbl:screen-F03).
|
||||
Katra no šīm funkcijām apstrādā specifiskus lietotāja ievades datus un
|
||||
atbilstoši atjaunina spēles stāvokli.
|
||||
|
||||
Moduļa 2. līmeņa DPD diagramma (sk. @fig:dpd-2-screen) parāda, ka lietotājs
|
||||
mijiedarbojas ar sistēmu caur diviem galvenajiem ievades veidiem: pogu izvēli
|
||||
mijiedarbojas ar sistēmu izmantojot divus galvenos ievades veidus: pogu izvēli
|
||||
sākumekrānā un "Escape" taustiņa nospiešanu spēles laikā.
|
||||
|
||||
Spēles sākšanas funkcija inicializē nepieciešamos resursus un
|
||||
sistēmas, kad lietotājs izvēlas sākt jaunu spēli. Atgriešanās funkcija
|
||||
apstrādā lietotāja pieprasījumu pārtraukt aktīvo spēli un atgriežas uz
|
||||
sākumekrānu.
|
||||
sistēmas, kad lietotājs izvēlas sākt jaunu spēli.
|
||||
Atgriešanās funkcija apstrādā lietotāja pieprasījumu pārtraukt aktīvo spēli un
|
||||
atgriežas uz sākumekrānu.
|
||||
|
||||
#figure(
|
||||
caption: [Spēles stāvokļa pārvaldības moduļa 2. līmeņa DPD],
|
||||
@ -1030,7 +1029,7 @@ sākumekrānu.
|
||||
dpd-database((6, 0), [Operatīvā\ atmiņa])
|
||||
dpd-edge(
|
||||
"d,lll",
|
||||
align(center)[Atjaunoti spēles\ stāvokļa dati],
|
||||
align(center)[Spēles\ stāvokļa dati],
|
||||
label-pos: 0.7,
|
||||
shift: -20pt,
|
||||
)
|
||||
@ -1218,12 +1217,13 @@ Uz sistēmas veiktspēju ir sekojošas prasības:
|
||||
- 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ādarbojas ar vismaz 60 kadriem sekundē.
|
||||
- Spēlētāja kustībām jātiek apstrādātām bez manāmas aizkaves ($<16$ms).
|
||||
- Spēlētāja kustībām jātiek apstrādātā bez manāmas aizkaves ($<16$ms).
|
||||
|
||||
=== Uzticamība
|
||||
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.
|
||||
- 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.
|
||||
// - 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.
|
||||
|
||||
=== Atribūti
|
||||
==== 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
|
||||
|
||||
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
|
||||
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].
|
||||
@ -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ē.
|
||||
Kā redzams @tbl:components-floor[tabulā], šīs komponentes pārvalda stāvu numurus,
|
||||
pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
pašreizējā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
|
||||
#components-table(
|
||||
caption: "Ar stāviem saistītās komponentes",
|
||||
@ -1289,9 +1289,6 @@ pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
`CurrentFloor`,
|
||||
"Atzīmē 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`,
|
||||
"Stāva nākamā Y pozīcija",
|
||||
"Identificē stāva Y koordināti, uz kuru tas jāpārvieto.",
|
||||
@ -1299,10 +1296,9 @@ pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
|
||||
==== Labirinta komponentes
|
||||
|
||||
Labirinta struktūru pārvalda vairāki savstarpēji saistītas komponentes.
|
||||
Tabulā @tbl:components-maze[] ir redzamas sastāvdaļas, kas ir atbildīgas par
|
||||
labirinta izveidi un uzturēšanu.
|
||||
|
||||
Labirinta struktūru pārvalda vairāki savstarpēji saistītas komponentes,
|
||||
kas ir atbildīgas par labirinta uzturēšanu (sk. @tbl:components-maze).
|
||||
#pagebreak()
|
||||
#components-table(
|
||||
caption: "Ar labirintiem saistītās komponentes",
|
||||
`HexMaze`,
|
||||
@ -1318,12 +1314,12 @@ labirinta izveidi un uzturēšanu.
|
||||
"Glabā labirinta parametrus",
|
||||
"Konfigurē labirinta ģenerēšanu ar rādiusu, pozīcijām un izkārtojumu.",
|
||||
`Maze`,
|
||||
"Glabā sešstūra labirinta datu",
|
||||
"Glabā sešstūra labirinta datus",
|
||||
"Glabā pilnu labirinta struktūru, izmantojot jaucējtabulu.",
|
||||
`Walls`,
|
||||
"Apzīmē sienu konfigurāciju",
|
||||
[Pārvalda sienas stāvokļus, izmantojot bitu karodziņus.
|
||||
@begginer-patterns],
|
||||
[Pārvalda sienas stāvokļus, izmantojot bitu karodziņus
|
||||
@begginer-patterns.],
|
||||
) <components-maze>
|
||||
|
||||
==== Spēlētāja komponentes
|
||||
@ -1338,8 +1334,8 @@ spēlētāju saistītās funkcijas.
|
||||
"Apzīmē spēlētāja entitāti",
|
||||
"Identificē spēlētāju un pieprasa nepieciešamās sastāvdaļas.",
|
||||
`CurrentPosition`,
|
||||
"Glabā spēlētāj pozīciju",
|
||||
"nosaka pašreizējo atrašanās vietu labirintā.",
|
||||
"Glabā spēlētājs pozīciju",
|
||||
"Nosaka pašreizējo atrašanās vietu labirintā.",
|
||||
`MovementSpeed`,
|
||||
"Glabā kustības ātrumu",
|
||||
"Nosaka spēlētāja pārvietošanās ātrumu.",
|
||||
@ -1364,8 +1360,8 @@ un ar spēlētāju saistīti notikumi, kas redzams @tbl:events-maze[],
|
||||
==== Labirintu notikumi
|
||||
|
||||
Labirinta notikumi pārvalda labirinta entitāšu dzīves ciklu spēlē. Kā redzams
|
||||
@tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi, atjaunošanu
|
||||
un likvidēšanu.
|
||||
@tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi un
|
||||
atjaunošanu.
|
||||
|
||||
#events-table(
|
||||
caption: "Ar labirintiem saistīti notikumi",
|
||||
@ -1375,9 +1371,6 @@ un likvidēšanu.
|
||||
`RespawnMaze`,
|
||||
"Atjauno esošo labirintu",
|
||||
"Atjauno labirintu.",
|
||||
`DespawnMaze`,
|
||||
"Noņem labirintu",
|
||||
"Izdzēš labirinta entitātes norādītajam stāvam.",
|
||||
) <events-maze>
|
||||
|
||||
==== Stāvu notikumi
|
||||
@ -1406,8 +1399,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.
|
||||
@tbl:events-player).
|
||||
Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu, atjaunošanu
|
||||
un likvidēšanu.
|
||||
Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu un
|
||||
atjaunošanu.
|
||||
|
||||
#events-table(
|
||||
caption: "Ar spēlētaju saistīti notikumi",
|
||||
@ -1417,36 +1410,29 @@ un likvidēšanu.
|
||||
`RespawnPlayer`,
|
||||
"Atjauno spēlētāju",
|
||||
"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>
|
||||
|
||||
=== Resursi
|
||||
|
||||
Bevy resursi kalpo kā globāli stāvokļa konteineri, kuriem var piekļūt jebkura
|
||||
sistēma.
|
||||
Atšķirībā no komponentiem, kas ir piesaistīti konkrētām entitātēm, resursi
|
||||
Atšķirībā no komponentēm, kas ir piesaistīti konkrētām entitātēm, resursi
|
||||
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
|
||||
ietekmē vairākas sistēmas @bevy-cheatbook[nod. ~14.6].
|
||||
Spēle izmanto vairākus resursus globālās konfigurācijas un stāvokļa pārvaldībai
|
||||
ietekmēt 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
|
||||
(sk. @tbl:resources)
|
||||
|
||||
#resources-table(
|
||||
caption: "Globālie resursi",
|
||||
`MazePluginLoaded`,
|
||||
"Spraudņa stāvokļa marķieris",
|
||||
"Norāda labirinta spraudņa inicializāciju.",
|
||||
`GlobalMazeConfig`,
|
||||
"Labirinta vizuālie iestatījumi",
|
||||
"Uzglabā globālos labirinta izskata parametrus.",
|
||||
) <resources>
|
||||
|
||||
#indent-par[
|
||||
Resurss "`GlobalMazeConfig`" ir īpaši svarīgs, jo tas pārvalda labirinta vizuālo
|
||||
attēlojumu, ietverot tādus parametrus kā sešstūra lielums, sienu biezums un
|
||||
vertikālais augstums.
|
||||
Dotais resurss pārvalda labirinta vizuālo attēlojumu, ietverot tādus
|
||||
parametrus kā sešstūra lielums, sienu biezums un vertikālais augstums.
|
||||
]
|
||||
|
||||
== Daļējs funkciju projektējums
|
||||
@ -1612,7 +1598,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
|
||||
stāvs nekustās.
|
||||
Šī daļa aprēķina jaunās $Y$ koordinātes visiem stāviem, pievieno tiem
|
||||
galamērķa komponentes un atjaunina pašreizējā un nākamā stāva marķierus.
|
||||
galamērķa komponentes un atjaunina pašreizējā stāva marķierus.
|
||||
]
|
||||
#figure(
|
||||
caption: "Stāva kustības sistēma",
|
||||
@ -1659,21 +1645,21 @@ atgriežas un mēģina citu ceļu.
|
||||
action-node((1, 4), [Pievienot stāva galamērķa\ komponenti katram stāvam])
|
||||
std-edge()
|
||||
|
||||
action-node((1, 5), [Atjaunina pašreizējā un\ nākamā stāvu marķierus])
|
||||
action-node((1, 5), [Atjaunina pašreizējā marķieri])
|
||||
std-edge("l,uu,l")
|
||||
}),
|
||||
),
|
||||
) <floor-transition-diagram>
|
||||
|
||||
|
||||
=== Plākšņu pārvaldas sistēma
|
||||
=== Plākšņu pārvaldības sistēma
|
||||
|
||||
Projekta sākotnējā plānošanas posmā tika apsvēra iespēja labirinta elementu
|
||||
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
|
||||
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,
|
||||
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
|
||||
@ -1681,14 +1667,14 @@ projekta lietojuma gadījumam sekojošu iemeslu dēļ:
|
||||
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
|
||||
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[
|
||||
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. Šī
|
||||
pieeja ļauj:
|
||||
]
|
||||
- vienkāršāku integrācija ar procesuālo labirintu ģenerēšanu;
|
||||
- vienkāršāku integrācija ar procedurālo labirintu ģenerēšanu;
|
||||
- optimālāku veiktspēja projekta lietošanas gadījumam;
|
||||
- lielāku kontroli pār labirinta vizuālo attēlojumu.
|
||||
|
||||
@ -1726,7 +1712,7 @@ pogas.
|
||||
=== Spēles skats
|
||||
|
||||
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
|
||||
galveno interaktīvo elementu.
|
||||
Ekrāna kreisajā apakšējā stūrī ir izvietoti papildspēju statusa indikatori, kas
|
||||
@ -1741,7 +1727,7 @@ atjaunošanās laiku.
|
||||
|
||||
=== Izstrādes rīki
|
||||
Izstrādes rīki, kas redzami @fig:dev-tools-ui[attēlā], ir implementēti
|
||||
izmantojot "egui" bibliotēku @bevy_egui.
|
||||
izmantojot "bevy_egui" bibliotēku @bevy_egui.
|
||||
Pirmais "Bevy Inspector Egui" noklusētais skats @bevy-inspector-egui, kas
|
||||
nodrošina detalizētu piekļuvi spēles entitāšu hierarhijai, komponenšu
|
||||
inspektoram un resursu pārvaldniekam.
|
||||
@ -1760,30 +1746,22 @@ testēšana, izmantojot gan automatizētus rīkus, gan manuālu pārbaudi.
|
||||
|
||||
== Statiskā testēšana <static-tests>
|
||||
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
|
||||
neoptimālus risinājumus. Papildus noklusētajiem noteikumiem, tika aktivizēti
|
||||
stingrāki koda kvalitātes pārbaudes līmeņi: "`pedantic`" režīms nodrošina
|
||||
padziļinātu koda stila pārbaudi, "`nursery`" aktivizē eksperimentālās pārbaudes,
|
||||
un "`unwrap_used`" un "`expect_used`" brīdina par potenciāli nedrošu kļūdu
|
||||
apstrādi. Šie papildu noteikumi palīdz uzturēt augstāku koda kvalitāti un
|
||||
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.). */
|
||||
"Clippy" tiek izmantots koda analīzei, meklējot potenciālas problēmas un
|
||||
neoptimālus risinājumus.
|
||||
Papildus noklusētajiem noteikumiem, tika aktivizēti stingrāki koda kvalitātes
|
||||
pārbaudes līmeņi: "pedantic" režīms nodrošina padziļinātu koda stila pārbaudi,
|
||||
"nursery" aktivizē eksperimentālās pārbaudes, un "unwrap_used" un "expect_used"
|
||||
brīdina par potenciāli nedrošu kļūdu apstrādi. Šie papildu noteikumi palīdz
|
||||
uzturēt augstāku koda kvalitāti un samazināt potenciālo kļūdu skaitu
|
||||
(sk. @clippy-hexlab[] un @clippy-maze-ascension[pielikumus]) @clippy.
|
||||
|
||||
== Dinamiskā testēšana
|
||||
|
||||
Lai novērtētu programmatūras uzvedību darbības laikā, tika veikta dinamiskā
|
||||
testēšana. Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot
|
||||
lietotāja saskarnes mijiedarbību, gan automatizētus testu komplektus, lai
|
||||
nodrošinātu visaptverošu spēles funkcionalitātes pārklājumu.
|
||||
testēšana.
|
||||
Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot lietotāja
|
||||
saskarnes mijiedarbību, gan automatizētus testu komplektus, lai nodrošinātu
|
||||
visaptverošu spēles funkcionalitātes pārklājumu.
|
||||
|
||||
=== Manuālā integrācijas testēšana
|
||||
|
||||
@ -1792,7 +1770,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,
|
||||
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").
|
||||
Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
|
||||
Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
|
||||
|
||||
|
||||
#figure(
|
||||
@ -1826,22 +1804,24 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
"Stāvu pāreja (uz augšu)",
|
||||
[
|
||||
+ Nokļūt līdz beigu šūnai
|
||||
+ Nospiest taustiņu "E"
|
||||
+ Novērot animāciju
|
||||
],
|
||||
[
|
||||
+ Plūstoša pāreja starp stāviem uz augšu
|
||||
+ Jauna stāva ģenerēšana
|
||||
+ Plūstoša pāreja starp stāviem uz augšu
|
||||
],
|
||||
"Ok",
|
||||
"MT04",
|
||||
"Stāvu pāreja (uz leju)",
|
||||
[
|
||||
+ Nokļūt līdz sākuma šūnai
|
||||
+ Nospiest taustiņu "E"
|
||||
+ Novērot animāciju
|
||||
],
|
||||
[
|
||||
+ Plūstoša pāreja starp stāviem uz leju
|
||||
+ Jauns stāvs netiek ģenerēts
|
||||
+ Plūstoša pāreja starp stāviem uz leju
|
||||
],
|
||||
"Ok",
|
||||
"MT05",
|
||||
@ -1874,7 +1854,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
"MT08",
|
||||
[Spēlētāja kustība],
|
||||
[
|
||||
+ Izmantot WASD vadību
|
||||
+ Izmantot "WASD" kustības taustiņus
|
||||
+ Mēģināt šķērsot sienas
|
||||
],
|
||||
[
|
||||
@ -1887,7 +1867,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli Windows platformai
|
||||
+ Palaist .exe failu
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[Spēle darbojas Windows vidē bez kļūdām],
|
||||
"Ok",
|
||||
@ -1896,7 +1876,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli Linux platformai
|
||||
+ Palaist bināro failu
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[Spēle darbojas Linux vidē bez kļūdām],
|
||||
"Ok",
|
||||
@ -1905,7 +1885,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli macOS platformai
|
||||
+ Palaist .dmg pakotni
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[Spēle darbojas macOS vidē bez kļūdām],
|
||||
"Err",
|
||||
@ -1914,7 +1894,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli WASM mērķim
|
||||
+ Atvērt pārlūkā
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[
|
||||
+ Spēle ielādējas pārlūkā
|
||||
@ -1946,12 +1926,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
|
||||
funkcionalitāti, savukārt testu mapē esošie vienībtesti un integrācijas testi
|
||||
pārbauda sarežģītākus gadījumus.
|
||||
Automatizēto testu izpildes rezultātu kopsavilkums ir redzams
|
||||
pieejams @tests-hexlab-full[pielikumā].
|
||||
@fig:tests-hexlab[attēlā], savukārt detalizēts testu izpildes pārskats ir
|
||||
Daļējs automatizēto testu izpildes rezultāts ir redzams @fig:tests-hexlab, savukārt
|
||||
detalizēts testu izpildes pārskats ir redzams piejams pielikumā (sk.
|
||||
@tests-hexlab-full).
|
||||
|
||||
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (116 no 142
|
||||
iekļautajām rindiņām) (sk. @tarpaulin-hexlab[pielikumu]), tomēr šis rādītājs
|
||||
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (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
|
||||
"inline"#footnote[https://doc.rust-lang.org/nightly/reference/attributes/codegen.html?highlight=inline]
|
||||
funkcijām un citi tehniski ierobežojumi @cargo-tarpaulin.
|
||||
@ -1994,19 +1974,22 @@ 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).
|
||||
|
||||
Kopā ar "Clippy" tiek arī izmantots "Rustfmt" @rustfmt, koda formatētājs, lai
|
||||
uzturētu vienotu koda formatējumu visā projektā. Šis rīks automātiski formatē
|
||||
kodu saskaņā ar Rust stila
|
||||
vadlīnijām @rust-style.
|
||||
uzturētu vienotu koda formatējumu visā projektā.
|
||||
Šis rīks automātiski formatē kodu saskaņā ar Rust stila vadlīnijām @rust-style.
|
||||
|
||||
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>.
|
||||
Šajā dokumentācijā ir ietverti detalizēti apraksti un lietošanas piemēri, kas ne
|
||||
tikai palīdz saprast kodu, bet programmatūras prasības specifikācija ir
|
||||
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 projektējuma aprakstīšanai" 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.
|
||||
tikai palīdz saprast kodu, bet arī atvieglo bibliotēkas testēšanu un kļūdu
|
||||
labošanu.
|
||||
|
||||
Programmatūras prasības specifikācija ir 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 projektējuma aprakstīšanai"
|
||||
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
|
||||
|
||||
@ -2019,7 +2002,7 @@ Rīku konfigurācija ir definēta vairākos failos:
|
||||
- laidiena kompilācijas ar iespējotu optimizāciju.
|
||||
- "GitHub Actions" darbplūsmas, kas apstrādā @gh-actions:
|
||||
- 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:
|
||||
- izveido Windows, Linux, macOS un WebAssembly versijas;
|
||||
- publicē bināros failus GitHub platformā;
|
||||
@ -2032,18 +2015,17 @@ Versiju specifikācija notiek pēc semantiskās versiju atlases (MAJOR.MINOR.PAT
|
||||
|
||||
== Darbietilpības novērtējums
|
||||
Projekta darbietilpības novērtēšanai tika izmantota QSM (angl. Quantitative
|
||||
Software Management, latv. kvantitatīvā programmatūra vadība) metodoloģija, kas
|
||||
Software Management, latv. kvantitatīvā programmatūras vadība) metodoloģija, kas
|
||||
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,
|
||||
kas parādija, ka "Maze Ascension" projekts satur $1927$ koda rindiņas, bet
|
||||
saistītā "hexlab" bibliotēka -- $979$ rindiņas, kopā veidojot $2906$ loģiskās koda
|
||||
rindiņas, neiekļaujot tukšās rindiņas un komentārus (sk. @tokei-maze-ascension[]
|
||||
un @tokei-hexlab[pielikumus]).
|
||||
kas parādija, ka "Maze Ascension" projekts satur $2686$ koda rindiņas (sk. @tokei-maze-ascension), bet
|
||||
saistītā "hexlab" bibliotēka -- $979$ rindiņas (sk. @tokei-hexlab), kopā
|
||||
veidojot $3236$ pirmkoda rindiņas, neiekļaujot tukšās rindiņas un komentārus.
|
||||
|
||||
Saskaņā ar QSM etalontabulu "Business Systems Implementation Unit (New and
|
||||
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$
|
||||
izstrādātājiem un mediāno projekta apjomu -- $1889$ koda rindiņas @QSM.
|
||||
izstrādātājiem un mediāna projekta apjomu -- $1889$ koda rindiņas @QSM.
|
||||
Ņ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
|
||||
personmēnesī.
|
||||
@ -2051,11 +2033,11 @@ Tādējādi minimālais nepieciešamais koda apjoms trīs mēnešu darbam būtu
|
||||
= 1398$ rindiņas.
|
||||
|
||||
Projekta faktiskais koda apjoms ($2906$ rindiņas) vairāk nekā divkārt pārsniedz šo
|
||||
minimālo slieksni, kas nepārprotami apliecina projekta atbilstību trīs mēnešu
|
||||
darbietilpības prasībai.
|
||||
minimālo slieksni, kas apliecina projekta atbilstību trīs mēnešu darbietilpības
|
||||
prasībai.
|
||||
Turklāt jāņem vērā projekta papildu sarežģītības faktori:
|
||||
- Bevy dzinēja un ECS arhitektūras apgūšana;
|
||||
- Procesuālās ģenerēšanas algoritma izstrāde "hexlab" bibliotēkai;
|
||||
- Procedurālās ģenerēšanas algoritma izstrāde "hexlab" bibliotēkai;
|
||||
- "hexlab" bibliotēkas izstrāde ar plašu dokumentāciju, ieskaitot API
|
||||
dokumentāciju, lietošanas piemērus un integrācijas vadlīnijas.
|
||||
|
||||
@ -2064,7 +2046,6 @@ Turklāt jāņem vērā projekta papildu sarežģītības faktori:
|
||||
koda rakstīšanu, bet arī izpēti, dokumentēšanu un optimizāciju.
|
||||
]
|
||||
|
||||
|
||||
= Secinājumi
|
||||
|
||||
Kvalifikācijas darba ietvaros tika izstrādāta trīsdimensiju spēle, izmantojot
|
||||
@ -2082,9 +2063,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
|
||||
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ā,
|
||||
ko apliecina projekta izstrādes laikā iznākusī jaunā versija (0.15).
|
||||
Ši versija ieviesa vairākas būtiskas izmaiņas, piemēram, "Required Components"
|
||||
(latv. nepieciešamo komponentu) konceptu uzlabotu animāciju sistēmu un daudz ko
|
||||
ko apliecina darba izstrādes laikā iznākusī jaunā versija (0.15).
|
||||
Šī 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
|
||||
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
|
||||
uzlabojumus, bet no otras puses, rada izaicinājumus saistībā ar dokumentācijas
|
||||
@ -2108,6 +2089,7 @@ Projekta turpmākās attīstības iespējas ietver:
|
||||
|
||||
#include "src/attachments.typ"
|
||||
#include "src/code.typ"
|
||||
#include "documentary_page.typ"
|
||||
|
||||
// #pagebreak()
|
||||
// #total-words words
|
||||
|
||||
283
presentation.typ
Normal file
@ -0,0 +1,283 @@
|
||||
#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%)),
|
||||
),
|
||||
)
|
||||
|
||||
7
requirements.typ
Normal file
@ -0,0 +1,7 @@
|
||||
#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"
|
||||
@ -8,7 +8,7 @@
|
||||
"Anotācija",
|
||||
)
|
||||
Kvalifikācijas darbā ir izstrādāta spēle "Maze Ascension", kas piedāvā
|
||||
spēlētājiem izaicinājumu iziet cauri proceduāli ģenerētiem sešstūrainam
|
||||
spēlētājiem izaicinājumu iziet cauri procedurāli ģenerētiem sešstūrainam
|
||||
labirintiem. Spēle ir veidota, izmantojot Rust programmēšanas valodu un Bevy
|
||||
spēļu dzinēju.
|
||||
|
||||
@ -32,7 +32,7 @@ sistēmas prasības,
|
||||
programmatūras prasību specifikācija,
|
||||
Bevy,
|
||||
ECS,
|
||||
papilspējas.
|
||||
papildspējas.
|
||||
|
||||
|
||||
#text(
|
||||
@ -46,16 +46,7 @@ papilspējas.
|
||||
numbering: none,
|
||||
"Abstract",
|
||||
)
|
||||
#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
|
||||
The qualification work "Game development using Bevy game engine" includes the game "Maze Ascension", which offers
|
||||
players the challenge to pass through procedurally generated hexagons
|
||||
mazes. The game is built using the Rust programming language and Bevy
|
||||
game engine.
|
||||
@ -74,7 +65,7 @@ papilspējas.
|
||||
[*Keywords:*],
|
||||
)
|
||||
Maze,
|
||||
comtuper game,
|
||||
computer game,
|
||||
system requirements,
|
||||
software requirements specification,
|
||||
Bevy,
|
||||
|
||||
@ -5,10 +5,14 @@
|
||||
#set figure(kind: "attachment", supplement: "pielikums")
|
||||
|
||||
#figure(
|
||||
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
|
||||
image("../assets/images/tests/hexlab-full.png", height: 90%),
|
||||
) <tests-hexlab-full>
|
||||
caption: [Clippy rīka rezultāts "hexlab" bibliotēkai],
|
||||
image("../assets/images/clippy/hexlab.png"),
|
||||
) <clippy-hexlab>
|
||||
|
||||
#figure(
|
||||
caption: [Clippy rīka rezultāts "Maze Ascension" spēlei],
|
||||
image("../assets/images/clippy/maze-ascension.png"),
|
||||
) <clippy-maze-ascension>
|
||||
|
||||
#figure(
|
||||
caption: [Tarpaulin rīka rezultāts "hexlab" bibliotēkai],
|
||||
@ -25,3 +29,8 @@
|
||||
caption: [Tokei rīka rezultāts "hexlab" bibliotēkai],
|
||||
image("../assets/images/tokei/hexlab.png"),
|
||||
) <tokei-hexlab>
|
||||
|
||||
#figure(
|
||||
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
|
||||
image("../assets/images/tests/hexlab-full.png", height: 90%),
|
||||
) <tests-hexlab-full>
|
||||
|
||||
@ -32,14 +32,21 @@
|
||||
paper: "a4",
|
||||
)
|
||||
set text(
|
||||
font: "Times New Roman",
|
||||
font: (
|
||||
"Times New Roman",
|
||||
"New Computer Modern",
|
||||
),
|
||||
size: 12pt,
|
||||
hyphenate: auto,
|
||||
lang: "lv",
|
||||
region: "lv",
|
||||
)
|
||||
show raw: set text(
|
||||
font: "JetBrainsMono NF",
|
||||
font: (
|
||||
"JetBrainsMono NF",
|
||||
"JetBrains Mono",
|
||||
"Fira Code",
|
||||
),
|
||||
features: (calt: 0),
|
||||
)
|
||||
|
||||
@ -192,29 +199,26 @@
|
||||
if it.kind == "i-figured-table" {
|
||||
return align(
|
||||
end,
|
||||
emph(it.counter.display(it.numbering) + " tabula ")
|
||||
+ text(
|
||||
weight: "bold",
|
||||
it.body,
|
||||
),
|
||||
emph(it.counter.display(it.numbering) + " tabula ") + text(
|
||||
weight: "bold",
|
||||
it.body,
|
||||
),
|
||||
)
|
||||
}
|
||||
if it.kind == "i-figured-image" {
|
||||
return align(
|
||||
start,
|
||||
emph(it.counter.display(it.numbering) + " att. ")
|
||||
+ text(
|
||||
weight: "bold",
|
||||
it.body,
|
||||
),
|
||||
emph(it.counter.display(it.numbering) + " att. ") + text(
|
||||
weight: "bold",
|
||||
it.body,
|
||||
),
|
||||
)
|
||||
}
|
||||
if (
|
||||
it.kind
|
||||
in (
|
||||
"i-figured-raw",
|
||||
"i-figured-\"attachment\"",
|
||||
)
|
||||
it.kind in (
|
||||
"i-figured-raw",
|
||||
"i-figured-\"attachment\"",
|
||||
)
|
||||
) {
|
||||
return align(
|
||||
end,
|
||||
@ -241,9 +245,7 @@
|
||||
numbering(
|
||||
el.numbering,
|
||||
..counter(heading).at(el.location()),
|
||||
)
|
||||
+ " "
|
||||
+ el.body,
|
||||
) + " " + el.body,
|
||||
)
|
||||
}
|
||||
|
||||
@ -254,7 +256,7 @@
|
||||
let supplement_map = (
|
||||
i-figured-table: "tab.",
|
||||
i-figured-image: "att.",
|
||||
attachment: "pielikums",
|
||||
attachment: "pielikumu",
|
||||
)
|
||||
|
||||
|
||||
@ -274,8 +276,7 @@
|
||||
numbering(
|
||||
el.numbering,
|
||||
..counter(figure.where(kind: kind)).at(el.location()),
|
||||
)
|
||||
+ "."
|
||||
) + "."
|
||||
) // Only add dot for attachments
|
||||
} else {
|
||||
numbering(
|
||||
@ -287,12 +288,11 @@
|
||||
// Create counter based on the kind
|
||||
return link(
|
||||
el.location(),
|
||||
number
|
||||
+ if supplement != "" {
|
||||
" " + supplement
|
||||
} else {
|
||||
""
|
||||
},
|
||||
number + if supplement != "" {
|
||||
" " + supplement
|
||||
} else {
|
||||
""
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@ -301,17 +301,13 @@
|
||||
}
|
||||
/* --- Figure/Table config end --- */
|
||||
|
||||
set list(
|
||||
marker: (
|
||||
[•],
|
||||
[--],
|
||||
[\*],
|
||||
[·],
|
||||
),
|
||||
)
|
||||
set enum(
|
||||
numbering: "1aiA)",
|
||||
) // TODO: make the same style as LaTeX: 1. | (a) | i. | A.
|
||||
set list(marker: (
|
||||
[•],
|
||||
[--],
|
||||
[\*],
|
||||
[·],
|
||||
))
|
||||
set enum(numbering: "1aiA)") // TODO: make the same style as LaTeX: 1. | (a) | i. | A.
|
||||
|
||||
// Abstract
|
||||
include "abstract.typ"
|
||||
|
||||