Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d925fd4ce | |||
| f170000db1 | |||
| 9262f98e19 | |||
| 7f7314de81 | |||
| 4ec2ebecf0 | |||
| e1e9346adf | |||
| 09b3e38b52 | |||
| 01f37de1df | |||
| a3ac544af6 | |||
| e6a51832ab | |||
| c9d987f5b6 | |||
| bda058ff59 | |||
| 7217cd110d | |||
| e71ddd761a | |||
| a2dece79d6 | |||
| 4efbf66eb3 |
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
|
||||||
34
.github/workflows/typst.yml
vendored
@ -11,35 +11,27 @@ 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@v3
|
uses: actions/checkout@v4
|
||||||
- name: Install required fonts
|
- name: Install Typst
|
||||||
run: |
|
uses: typst-community/setup-typst@v3
|
||||||
sudo apt-get updateA
|
|
||||||
# Install Times New Roman
|
|
||||||
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:
|
with:
|
||||||
source_file: |
|
typst-version: 0.12
|
||||||
main.typ
|
cache-dependency-path: requirements.typ
|
||||||
documentary_page.typ
|
- name: Compile Typst files
|
||||||
- name: Rename main.pdf
|
run: |
|
||||||
run: mv main.pdf kval_darbs_kristians_cagulis_kc22015.pdf
|
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
|
- name: Upload PDF file
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: PDF
|
name: PDF
|
||||||
path: |
|
path: "*.pdf"
|
||||||
*.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
|
||||||
@ -48,4 +40,6 @@ 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: "*.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,
|
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);
|
||||||
|
|||||||
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/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
|
||||||
|
|
||||||
@ -50,7 +49,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)
|
||||||
|
|
||||||
= 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
|
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ē,
|
||||||
@ -69,18 +68,18 @@ izdrukai un/vai recenzentam uzrādītajai darba versijai.
|
|||||||
)
|
)
|
||||||
|
|
||||||
v(vspace / 2)
|
v(vspace / 2)
|
||||||
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~\_\_.01.2025.*]
|
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~06.01.2025.*]
|
||||||
|
|
||||||
v(vspace)
|
v(vspace)
|
||||||
[Rekomendēju darbu aizstāvēšanai\
|
[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)
|
v(vspace)
|
||||||
[Recenzents: *Artūrs Driķis*]
|
[Recenzents: *Artūrs Driķis*]
|
||||||
|
|
||||||
|
|
||||||
v(vspace)
|
v(vspace)
|
||||||
[Darbs iesniegs *\_\_.01.2025.*\
|
[Darbs iesniegs *06.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
@ -15,34 +15,41 @@
|
|||||||
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: "prof. Mg. dat. Jānis Iljins",
|
advisor: "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;
|
||||||
/ 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;
|
/ 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;
|
/ PPA: programmatūras projektējuma apraksts;
|
||||||
/ PPS: programmatūras prasību specifikācija;
|
/ 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>;
|
/ 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;
|
/ 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;
|
/ 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ēts vizuāla izvade;
|
/ Renderēšana: process, kurā tiek ģenerēta vizuāla izvade;
|
||||||
/ Režģis: Strukturēts šūnu izkārtojums, kas veido spēles pasaules pamata struktūru;
|
/ Resurss: globāli pieejama datu struktūra, kas nav piesaistīta konkrētai entitātei;
|
||||||
/ Spēlētājs: lietotāja ieraksts vienas virtuālās istabas kontekstā;
|
/ Režģis: strukturēts šūnu izkārtojums, kas veido spēles pasaules pamata struktūru;
|
||||||
/ Sēkla: Skaitliska vērtība, ko izmanto nejaušo skaitļu ģeneratora inicializēšanai;
|
/ Sistēma: loģikas vienība, kas apstrādā entitātes ar specifiskām komponentēm;
|
||||||
/ Šūna: Sešstūraina režģa viena pozīcija, kas definē telpu, kuru var aizņemt viena plāksne.
|
/ 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.
|
/ 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
|
||||||
Šī dokumenta mērķis ir raksturot sešstūru labirinta spēles "Maze Ascension"
|
Šī programmatūras prasību specifikācija (PPS) ir izstrādāta, lai definētu un
|
||||||
programmatūras prasības un izpētīt Bevy spēļu dzinēja iespējas.
|
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
|
== 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
|
||||||
@ -51,7 +58,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ā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:
|
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
|
||||||
@ -64,7 +71,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 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
|
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.
|
||||||
@ -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.
|
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-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
|
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
|
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,
|
||||||
@ -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
|
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ē sistēmas funkcionālās
|
Programmatūras prasību specifikācijas sadaļa detalizētāk apraksta sistēmas
|
||||||
prasības un arhitektūru.
|
funkcionālās 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
|
||||||
@ -118,7 +125,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 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.
|
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.
|
||||||
@ -126,9 +133,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ēta gan manuālā integrācijas
|
Dinamiskās testēšanas apakšsadaļā tiek detalizētāk izskatīta gan manuālā
|
||||||
testēšana, gan automatizēto testu implementācija, sniedzot konkrētus piemērus un
|
integrācijas testēšana, gan automatizēto testu implementācija, sniedzot
|
||||||
rezultātus.
|
konkrētus piemērus un 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
|
||||||
@ -147,10 +154,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. Spēļu
|
biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu.
|
||||||
dzinējs Bevy ar savu moderno arhitektūru un Rust programmēšanas valodas
|
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ā
|
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
|
== 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
|
||||||
@ -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
|
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,#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
|
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
|
visā pasaulē.
|
||||||
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ē galvenā uzmanība tiks pievērsta sekojošu darījumprasību
|
Sistēmas izstrādē tiek izvirzītas sekojošas darījumprasības, kas nodrošinās
|
||||||
īstenošanai, lai nodrošinātu stabilu un saistošu lietotāja pieredzi:
|
kvalitatīvu lietotāja pieredzi:
|
||||||
|
|
||||||
+ Spēles progresēšana un līmeņu pārvaldība: Sistēma automātiski pārvaldīs
|
- Līmeņu pārvaldība: Sistēma nodrošinās automātisku spēles līmeņu pārvaldību un
|
||||||
spēlētāju virzību pa spēles līmeņiem, nodrošinot vienmērīgu pāreju, kad
|
vienmērīgu pāreju starp tiem, veidojot pakāpenisku grūtības pieaugumu.
|
||||||
spēlētāji progresē un saskaras ar jauniem izaicinājumiem. Progress tiks
|
- Līmeņu ģenerēšana: Sistēma nodrošinās procedurālu līmeņu ģenerēšanu, radot
|
||||||
saglabāts lokāli spēlētāja ierīcē.
|
unikālus sešstūrainus labirintus katram spēles stāvam, garantējot, ka katrs
|
||||||
+ Nevainojama piekļuve spēlēm: Spēlētāji varēs piekļūt spēlei un spēlēt to bez
|
labirints ir pilnībā izejams.
|
||||||
nepieciešamības izveidot lietotāja kontu vai pieteikties. Tas nodrošina
|
- Tieša piekļuve: Spēle būs pieejama bez lietotāja konta izveides vai
|
||||||
netraucētu piekļuvi spēlei, ļaujot spēlētājiem nekavējoties sākt spēlēt.
|
autentifikācijas, nodrošinot tūlītēju piekļuvi spēles saturam.
|
||||||
// + Paziņošanas sistēma: Spēlētāji saņems paziņojumus par svarīgiem spēles
|
- Platformu atbalsts: Sistēma tiks izstrādāta ar daudzplatformu atbalstu,
|
||||||
// atjauninājumiem, sasniegumiem un citu svarīgu informāciju, lai saglabātu viņu
|
ietverot Linux, macOS, Windows un WebAssembly platformas.
|
||||||
// iesaisti un informētību.
|
- Kopienas integrācija: Izmantojot itch.io@itch-io platformu, tiks nodrošināta
|
||||||
+ Savietojamība ar vairākām platformām: sistēma būs pieejama vairākās
|
spēlētāju atsauksmju apkopošana un kopienas atbalsts.
|
||||||
platformās, tostarp Linux, macOS, Windows un WebAssembly, nodrošinot plašu
|
- Nepārtraukta izstrāde: Izmantojot CI/CD risinājumus, tiks nodrošināta regulāra
|
||||||
pieejamību un sasniedzamību.
|
spēles atjaunināšana un uzturēšana.
|
||||||
+ 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
|
||||||
@ -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
|
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.
|
||||||
|
|
||||||
/* "Sistēma" lietotājs ir atbildīgs par notikumu apstrādātāju izsaukšanu, kas
|
Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa DPD
|
||||||
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(
|
||||||
@ -236,10 +226,29 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ
|
|||||||
) <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:
|
||||||
+ Programmēšanas valodas un Bevy spēles dzinēja tehniskie ierobežojumi;
|
+ Bevy dzinēja tehniskie ierobežojumi:
|
||||||
+ Responsivitāte;
|
+ ECS arhitektūras specifika un tās ierobežojumi datu organizācijā;
|
||||||
+ Starpplatformu savietojamība: Linux, macOS, Windows un WebAssembly.
|
+ "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[
|
#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
|
||||||
@ -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
|
== 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 800x600 pikseļu, lai spēle būtu optimāla.
|
- ekrāna izšķirtspējai jābūt vismaz $800 times 600$ pikseļi.
|
||||||
- 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:
|
||||||
@ -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
|
\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) process:
|
ārējs (bibliotēkas) process(-i):
|
||||||
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,
|
||||||
@ -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
|
Š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.
|
||||||
|
|
||||||
Ievades apstrādes modulis uztver un apstrādā spēlētāja ievades datus.
|
Bevy spēļu dzinējs diagrammā ir attēlots kā ārējs process vairāku iemeslu dēļ.
|
||||||
Spēles stāvokļa modulis pārrauga vispārējo spēles stāvokli.
|
Pirmkārt, Bevy nodrošina pamata infrastruktūru spēles darbībai, ieskaitot
|
||||||
Labirinta ģeneratora modulis izveido un pārvalda labirinta struktūras.
|
ievades apstrādi, renderēšanu un audio atskaņošanu.
|
||||||
Spēlētāja modulis apstrādā visas ar spēlētāju saistītās kustības, sadursmes un papildspēju mijiedarbības.
|
Tā rezultātā visa lietotāja mijiedarbība ar spēli (tastatūras, peles ievade)
|
||||||
Spēles līmeņu pārvaldnieks kontrolē līmeņu virzību un stāvokli.
|
vispirms tiek apstrādāta caur Bevy sistēmām, pirms tā nonāk līdz spēles
|
||||||
Renderēšanas un audio moduļi pārvalda attiecīgi vizuālo un audio izvadi.
|
specifiskajiem moduļiem.
|
||||||
|
|
||||||
// Visas datu plūsmas starp procesiem tiek nodrošinātas, izmantojot operatīvo
|
Operatīvā atmiņa (RAM) ir vienīgā datu krātuve diagrammā, jo Bevy ECS
|
||||||
// atmiņu, ievērojot atbilstošas datu plūsmas diagrammas konvencijas. Šī
|
arhitektūra balstās uz komponenšu datiem, kas tiek glabāti operatīvajā atmiņā un
|
||||||
// arhitektūra nodrošina efektīvu datu pārvaldību un skaidru interešu nodalīšanu
|
spēles stāvoklis netiek pastāvīgi saglabāts diskā.
|
||||||
// starp dažādām spēles sastāvdaļām.
|
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
caption: [\1. līmeņa DPD],
|
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),
|
(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])
|
||||||
@ -481,6 +488,22 @@ 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(
|
||||||
@ -497,44 +520,18 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu.
|
|||||||
),
|
),
|
||||||
) <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ē.],
|
||||||
[
|
[
|
||||||
Ievades dati tiek saņemti no pasaules resursiem un komponentēm:
|
+ "`EguiContext`" komponente;#footnote[https://docs.rs/bevy_egui/latest/bevy_egui/]<bevy_egui>
|
||||||
+ 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.
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
+ Pārbauda, vai labirinta straudņa resurss eksistē pasaulē.
|
+ Saņem "`EguiContext`" komponenti no primārā loga.
|
||||||
+ 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:
|
||||||
@ -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
|
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 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).
|
un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-floor).
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
@ -613,7 +610,6 @@ 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.
|
||||||
@ -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.
|
+ 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 nākamā stāva komponenti nākamā entitātei.
|
+ Pievieno pašreizējā stāva komponenti nākamā stāva entitātei.
|
||||||
+ Noņem nākamā stāva komponenti no nākamā stāva entitātes.
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
+ Atjaunināts stāvs.
|
+ 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
|
=== 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 Amit Patel's "Hexagonal Grids"
|
balstoties uz "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 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).
|
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).
|
||||||
|
|
||||||
@ -681,21 +676,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ē stākuma prozīciju, ja tāda norādīta.
|
+ Validē sākuma pozī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).
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@ -707,8 +702,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 darbības plūsma ir attēlota 2. līmeņa datu
|
pārvaldību katrā spēles stāvā. Moduļa funkciju datu plūsmas ir attēlotas 2.
|
||||||
plūsmas diagrammā (sk. @fig:dpd-2-maze).
|
līmeņa datu 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).
|
||||||
@ -718,7 +713,8 @@ 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 ID.
|
saglabājot to pašu stāva numuru un pozīciju telpā nemainot entitātes
|
||||||
|
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],
|
||||||
@ -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.
|
+ 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 vai nākamais stāvs, pievieno
|
+ Atkarībā no tā, vai tas ir pašreizējais stāvs, pievieno
|
||||||
attiecīgo komponenti.
|
pašreizējā stāva 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
|
||||||
@ -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ē."
|
+ "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>
|
||||||
|
|
||||||
@ -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
|
||||||
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. Moduļa darbības
|
tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi.
|
||||||
plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-player), kas
|
Moduļa datu plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk.
|
||||||
parāda četras galvenās funkcijas un to mijiedarbību ar datu glabātuvi.
|
@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
|
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 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
|
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.
|
||||||
|
|
||||||
@ -989,22 +987,23 @@ 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: spēles
|
un pārejas starp tiem. Modulis sastāv no trim galvenajām funkcijām:
|
||||||
sākšana (@tbl:screen-F01), atgriešanās uz sākumekrānu
|
spēles sākšana (@tbl:screen-F01),
|
||||||
(@tbl:screen-F02) un sākumekrāna attēlošanas
|
atgriešanās uz sākumekrānu (@tbl:screen-F02) un
|
||||||
(@tbl:screen-F03). Katra no šīm funkcijām apstrādā specifiskus
|
sākumekrāna attēlošanas (@tbl:screen-F03).
|
||||||
lietotāja ievades datus un atbilstoši atjaunina spēles stāvokli operatīvajā
|
Katra no šīm funkcijām apstrādā specifiskus lietotāja ievades datus un
|
||||||
atmiņā.
|
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
|
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ā.
|
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. Atgriešanās funkcija
|
sistēmas, kad lietotājs izvēlas sākt jaunu spēli.
|
||||||
apstrādā lietotāja pieprasījumu pārtraukt aktīvo spēli un atgriežas uz
|
Atgriešanās funkcija apstrādā lietotāja pieprasījumu pārtraukt aktīvo spēli un
|
||||||
sākumekrānu.
|
atgriežas uz 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],
|
||||||
@ -1030,7 +1029,7 @@ 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)[Atjaunoti spēles\ stāvokļa dati],
|
align(center)[Spēles\ stāvokļa dati],
|
||||||
label-pos: 0.7,
|
label-pos: 0.7,
|
||||||
shift: -20pt,
|
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ē.
|
- 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ā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
|
=== 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ā 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(
|
#components-table(
|
||||||
caption: "Ar stāviem saistītās komponentes",
|
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`,
|
`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.",
|
||||||
@ -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 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,
|
||||||
Tabulā @tbl:components-maze[] ir redzamas sastāvdaļas, kas ir atbildīgas par
|
kas ir atbildīgas par labirinta uzturēšanu (sk. @tbl:components-maze).
|
||||||
labirinta izveidi un uzturēšanu.
|
#pagebreak()
|
||||||
|
|
||||||
#components-table(
|
#components-table(
|
||||||
caption: "Ar labirintiem saistītās komponentes",
|
caption: "Ar labirintiem saistītās komponentes",
|
||||||
`HexMaze`,
|
`HexMaze`,
|
||||||
@ -1318,12 +1314,12 @@ labirinta izveidi un uzturēšanu.
|
|||||||
"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 datu",
|
"Glabā sešstūra labirinta datus",
|
||||||
"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
|
||||||
@ -1338,8 +1334,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āj pozīciju",
|
"Glabā spēlētājs 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.",
|
||||||
@ -1364,8 +1360,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, atjaunošanu
|
@tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi un
|
||||||
un likvidēšanu.
|
atjaunošanu.
|
||||||
|
|
||||||
#events-table(
|
#events-table(
|
||||||
caption: "Ar labirintiem saistīti notikumi",
|
caption: "Ar labirintiem saistīti notikumi",
|
||||||
@ -1375,9 +1371,6 @@ un likvidēš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
|
||||||
@ -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.
|
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, atjaunošanu
|
Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu un
|
||||||
un likvidēšanu.
|
atjaunošanu.
|
||||||
|
|
||||||
#events-table(
|
#events-table(
|
||||||
caption: "Ar spēlētaju saistīti notikumi",
|
caption: "Ar spēlētaju saistīti notikumi",
|
||||||
@ -1417,36 +1410,29 @@ un likvidēš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 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.
|
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ē vairākas sistēmas @bevy-cheatbook[nod. ~14.6].
|
ietekmēt 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
|
Spēle izmanto vienu resursu 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[
|
||||||
Resurss "`GlobalMazeConfig`" ir īpaši svarīgs, jo tas pārvalda labirinta vizuālo
|
Dotais resurss pārvalda labirinta vizuālo attēlojumu, ietverot tādus
|
||||||
attēlojumu, ietverot tādus parametrus kā sešstūra lielums, sienu biezums un
|
parametrus kā sešstūra lielums, sienu biezums un vertikālais augstums.
|
||||||
vertikālais augstums.
|
|
||||||
]
|
]
|
||||||
|
|
||||||
== Daļējs funkciju projektējums
|
== 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
|
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ā un nākamā stāva marķierus.
|
galamērķa komponentes un atjaunina pašreizējā stāva marķierus.
|
||||||
]
|
]
|
||||||
#figure(
|
#figure(
|
||||||
caption: "Stāva kustības sistēma",
|
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])
|
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ā un\ nākamā stāvu marķierus])
|
action-node((1, 5), [Atjaunina pašreizējā marķieri])
|
||||||
std-edge("l,uu,l")
|
std-edge("l,uu,l")
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
) <floor-transition-diagram>
|
) <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
|
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
|
||||||
@ -1681,14 +1667,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 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;
|
- 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.
|
||||||
|
|
||||||
@ -1726,7 +1712,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
|
||||||
@ -1741,7 +1727,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 "egui" bibliotēku @bevy_egui.
|
izmantojot "bevy_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.
|
||||||
@ -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 <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"
|
"Clippy" tiek izmantots koda analīzei, meklējot potenciālas problēmas un
|
||||||
tiek izmantots koda analīzei, meklējot potenciālas problēmas un
|
neoptimālus risinājumus.
|
||||||
neoptimālus risinājumus. Papildus noklusētajiem noteikumiem, tika aktivizēti
|
Papildus noklusētajiem noteikumiem, tika aktivizēti stingrāki koda kvalitātes
|
||||||
stingrāki koda kvalitātes pārbaudes līmeņi: "`pedantic`" režīms nodrošina
|
pārbaudes līmeņi: "pedantic" režīms nodrošina padziļinātu koda stila pārbaudi,
|
||||||
padziļinātu koda stila pārbaudi, "`nursery`" aktivizē eksperimentālās pārbaudes,
|
"nursery" aktivizē eksperimentālās pārbaudes, un "unwrap_used" un "expect_used"
|
||||||
un "`unwrap_used`" un "`expect_used`" brīdina par potenciāli nedrošu kļūdu
|
brīdina par potenciāli nedrošu kļūdu apstrādi. Šie papildu noteikumi palīdz
|
||||||
apstrādi. Šie papildu noteikumi palīdz uzturēt augstāku koda kvalitāti un
|
uzturēt augstāku koda kvalitāti un samazināt potenciālo kļūdu skaitu
|
||||||
samazināt potenciālo kļūdu skaitu @clippy.
|
(sk. @clippy-hexlab[] un @clippy-maze-ascension[pielikumus]) @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ēšanas pieeja apvieno gan manuālu testēšanu, izmantojot
|
testēšana.
|
||||||
lietotāja saskarnes mijiedarbību, gan automatizētus testu komplektus, lai
|
Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot lietotāja
|
||||||
nodrošinātu visaptverošu spēles funkcionalitātes pārklājumu.
|
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
|
=== 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,
|
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").
|
||||||
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(
|
#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)",
|
"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
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
+ Plūstoša pāreja starp stāviem uz augšu
|
|
||||||
+ Jauna stāva ģenerēšana
|
+ Jauna stāva ģenerēšana
|
||||||
|
+ Plūstoša pāreja starp stāviem uz augšu
|
||||||
],
|
],
|
||||||
"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
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
+ Plūstoša pāreja starp stāviem uz leju
|
|
||||||
+ Jauns stāvs netiek ģenerēts
|
+ Jauns stāvs netiek ģenerēts
|
||||||
|
+ Plūstoša pāreja starp stāviem uz leju
|
||||||
],
|
],
|
||||||
"Ok",
|
"Ok",
|
||||||
"MT05",
|
"MT05",
|
||||||
@ -1874,7 +1854,7 @@ Izvēlētie 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 vadību
|
+ Izmantot "WASD" kustības taustiņus
|
||||||
+ Mēģināt šķērsot sienas
|
+ 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
|
+ Kompilēt spēli Windows platformai
|
||||||
+ Palaist .exe failu
|
+ Palaist .exe failu
|
||||||
+ Veikt pamata funkcionalitātes testu
|
+ Veikt pamata funkcionalitātes testus
|
||||||
],
|
],
|
||||||
[Spēle darbojas Windows vidē bez kļūdām],
|
[Spēle darbojas Windows vidē bez kļūdām],
|
||||||
"Ok",
|
"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
|
+ Kompilēt spēli Linux platformai
|
||||||
+ Palaist bināro failu
|
+ Palaist bināro failu
|
||||||
+ Veikt pamata funkcionalitātes testu
|
+ Veikt pamata funkcionalitātes testus
|
||||||
],
|
],
|
||||||
[Spēle darbojas Linux vidē bez kļūdām],
|
[Spēle darbojas Linux vidē bez kļūdām],
|
||||||
"Ok",
|
"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
|
+ Kompilēt spēli macOS platformai
|
||||||
+ Palaist .dmg pakotni
|
+ Palaist .dmg pakotni
|
||||||
+ Veikt pamata funkcionalitātes testu
|
+ Veikt pamata funkcionalitātes testus
|
||||||
],
|
],
|
||||||
[Spēle darbojas macOS vidē bez kļūdām],
|
[Spēle darbojas macOS vidē bez kļūdām],
|
||||||
"Err",
|
"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
|
+ Kompilēt spēli WASM mērķim
|
||||||
+ Atvērt pārlūkā
|
+ Atvērt pārlūkā
|
||||||
+ Veikt pamata funkcionalitātes testu
|
+ Veikt pamata funkcionalitātes testus
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
+ Spēle ielādējas pārlūkā
|
+ 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
|
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.
|
||||||
Automatizēto testu izpildes rezultātu kopsavilkums ir redzams
|
Daļējs automatizēto testu izpildes rezultāts ir redzams @fig:tests-hexlab, savukārt
|
||||||
pieejams @tests-hexlab-full[pielikumā].
|
detalizēts testu izpildes pārskats ir redzams piejams pielikumā (sk.
|
||||||
@fig:tests-hexlab[attēlā], savukārt detalizēts testu izpildes pārskats ir
|
@tests-hexlab-full).
|
||||||
|
|
||||||
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (116 no 142
|
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (sk.
|
||||||
iekļautajām rindiņām) (sk. @tarpaulin-hexlab[pielikumu]), tomēr šis rādītājs
|
@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.
|
||||||
@ -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).
|
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ā. Šis rīks automātiski formatē
|
uzturētu vienotu koda formatējumu visā projektā.
|
||||||
kodu saskaņā ar Rust stila
|
Šis rīks automātiski formatē kodu saskaņā ar Rust stila vadlīnijām @rust-style.
|
||||||
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 programmatūras prasības specifikācija ir
|
tikai palīdz saprast kodu, bet arī atvieglo bibliotēkas testēšanu un kļūdu
|
||||||
izstrādāta, ievērojot LVS 68:1996 standarta "Programmatūras prasību
|
labošanu.
|
||||||
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 prasības specifikācija ir izstrādāta, ievērojot LVS 68:1996
|
||||||
Programmatūras projektējuma aprakstā iekļautās aktivitāšu diagrammas ir veidotas
|
standarta "Programmatūras prasību specifikācijas ceļvedis" @lvs_68 un LVS
|
||||||
atbilstoši UML (Unified Modeling Language) 2.5 specifikācijai @omg-uml.
|
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
|
== 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.
|
- 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ā;
|
||||||
@ -2032,18 +2015,17 @@ 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ū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.
|
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 $1927$ koda rindiņas, bet
|
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, kopā veidojot $2906$ loģiskās koda
|
saistītā "hexlab" bibliotēka -- $979$ rindiņas (sk. @tokei-hexlab), kopā
|
||||||
rindiņas, neiekļaujot tukšās rindiņas un komentārus (sk. @tokei-maze-ascension[]
|
veidojot $3236$ pirmkoda rindiņas, neiekļaujot tukšās rindiņas un komentārus.
|
||||||
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ā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
|
Ņ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ī.
|
||||||
@ -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.
|
= 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 nepārprotami apliecina projekta atbilstību trīs mēnešu
|
minimālo slieksni, kas apliecina projekta atbilstību trīs mēnešu darbietilpības
|
||||||
darbietilpības prasībai.
|
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;
|
||||||
- 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
|
- "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.
|
||||||
|
|
||||||
@ -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.
|
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
|
||||||
@ -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
|
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 projekta izstrādes laikā iznākusī jaunā versija (0.15).
|
ko apliecina darba izstrādes laikā iznākusī jaunā versija (0.15).
|
||||||
Ši versija ieviesa vairākas būtiskas izmaiņas, piemēram, "Required Components"
|
Šī 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
|
(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.
|
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
|
||||||
@ -2108,6 +2089,7 @@ 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
|
||||||
|
|||||||
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",
|
"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 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
|
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,
|
||||||
papilspējas.
|
papildspējas.
|
||||||
|
|
||||||
|
|
||||||
#text(
|
#text(
|
||||||
@ -46,16 +46,7 @@ papilspējas.
|
|||||||
numbering: none,
|
numbering: none,
|
||||||
"Abstract",
|
"Abstract",
|
||||||
)
|
)
|
||||||
#align(
|
The qualification work "Game development using Bevy game engine" includes the game "Maze Ascension", which offers
|
||||||
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.
|
||||||
@ -74,7 +65,7 @@ papilspējas.
|
|||||||
[*Keywords:*],
|
[*Keywords:*],
|
||||||
)
|
)
|
||||||
Maze,
|
Maze,
|
||||||
comtuper game,
|
computer game,
|
||||||
system requirements,
|
system requirements,
|
||||||
software requirements specification,
|
software requirements specification,
|
||||||
Bevy,
|
Bevy,
|
||||||
|
|||||||
@ -5,10 +5,14 @@
|
|||||||
#set figure(kind: "attachment", supplement: "pielikums")
|
#set figure(kind: "attachment", supplement: "pielikums")
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
|
caption: [Clippy rīka rezultāts "hexlab" bibliotēkai],
|
||||||
image("../assets/images/tests/hexlab-full.png", height: 90%),
|
image("../assets/images/clippy/hexlab.png"),
|
||||||
) <tests-hexlab-full>
|
) <clippy-hexlab>
|
||||||
|
|
||||||
|
#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],
|
||||||
@ -25,3 +29,8 @@
|
|||||||
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>
|
||||||
|
|||||||
@ -32,14 +32,21 @@
|
|||||||
paper: "a4",
|
paper: "a4",
|
||||||
)
|
)
|
||||||
set text(
|
set text(
|
||||||
font: "Times New Roman",
|
font: (
|
||||||
|
"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: "JetBrainsMono Nerd Font Mono",
|
font: (
|
||||||
|
"JetBrainsMono NF",
|
||||||
|
"JetBrains Mono",
|
||||||
|
"Fira Code",
|
||||||
|
),
|
||||||
features: (calt: 0),
|
features: (calt: 0),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -192,8 +199,7 @@
|
|||||||
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 ")
|
emph(it.counter.display(it.numbering) + " tabula ") + text(
|
||||||
+ text(
|
|
||||||
weight: "bold",
|
weight: "bold",
|
||||||
it.body,
|
it.body,
|
||||||
),
|
),
|
||||||
@ -202,16 +208,14 @@
|
|||||||
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. ")
|
emph(it.counter.display(it.numbering) + " att. ") + text(
|
||||||
+ text(
|
|
||||||
weight: "bold",
|
weight: "bold",
|
||||||
it.body,
|
it.body,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
it.kind
|
it.kind in (
|
||||||
in (
|
|
||||||
"i-figured-raw",
|
"i-figured-raw",
|
||||||
"i-figured-\"attachment\"",
|
"i-figured-\"attachment\"",
|
||||||
)
|
)
|
||||||
@ -241,9 +245,7 @@
|
|||||||
numbering(
|
numbering(
|
||||||
el.numbering,
|
el.numbering,
|
||||||
..counter(heading).at(el.location()),
|
..counter(heading).at(el.location()),
|
||||||
)
|
) + " " + el.body,
|
||||||
+ " "
|
|
||||||
+ el.body,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +256,7 @@
|
|||||||
let supplement_map = (
|
let supplement_map = (
|
||||||
i-figured-table: "tab.",
|
i-figured-table: "tab.",
|
||||||
i-figured-image: "att.",
|
i-figured-image: "att.",
|
||||||
attachment: "pielikums",
|
attachment: "pielikumu",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -274,8 +276,7 @@
|
|||||||
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(
|
||||||
@ -287,8 +288,7 @@
|
|||||||
// Create counter based on the kind
|
// Create counter based on the kind
|
||||||
return link(
|
return link(
|
||||||
el.location(),
|
el.location(),
|
||||||
number
|
number + if supplement != "" {
|
||||||
+ if supplement != "" {
|
|
||||||
" " + supplement
|
" " + supplement
|
||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
@ -301,17 +301,13 @@
|
|||||||
}
|
}
|
||||||
/* --- Figure/Table config end --- */
|
/* --- Figure/Table config end --- */
|
||||||
|
|
||||||
set list(
|
set list(marker: (
|
||||||
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"
|
||||||
|
|||||||