Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d925fd4ce | |||
| f170000db1 | |||
| 9262f98e19 | |||
| 7f7314de81 | |||
| 4ec2ebecf0 | |||
| e1e9346adf | |||
| 09b3e38b52 | |||
| 01f37de1df | |||
| a3ac544af6 | |||
| e6a51832ab | |||
| c9d987f5b6 | |||
| bda058ff59 |
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
|
||||
12
.github/workflows/typst.yml
vendored
@ -25,15 +25,13 @@ jobs:
|
||||
cache-dependency-path: requirements.typ
|
||||
- name: Compile Typst files
|
||||
run: |
|
||||
typst compile --font-path=assets/fonts main.typ kval_darbs_kristians_cagulis_kc22015.pdf
|
||||
typst compile --font-path=assets/fonts documentary_page.typ
|
||||
typst compile --font-path=assets/fonts main.typ Cagulis_Kristians.Francis_kc22015.pdf
|
||||
typst compile --font-path=assets/fonts documentary_page.typ reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
|
||||
- name: Upload PDF file
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: PDF
|
||||
path: |
|
||||
kval_darbs_kristians_cagulis_kc22015.pdf
|
||||
documentary_page.pdf
|
||||
path: "*.pdf"
|
||||
- name: Get current date
|
||||
id: date
|
||||
run: echo "DATE=$(date +%Y-%m-%d-%H:%M)" >> $GITHUB_ENV
|
||||
@ -42,4 +40,6 @@ jobs:
|
||||
if: github.ref_type == 'tag'
|
||||
with:
|
||||
name: "${{ github.ref_name }} — ${{ env.DATE }}"
|
||||
files: "*.pdf"
|
||||
files: |
|
||||
Cagulis_Kristians.Francis_kc22015.pdf
|
||||
reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Default, Reflect)]
|
||||
#[reflect(Component)]
|
||||
pub struct Player;
|
||||
@ -39,7 +39,6 @@ pub(super) fn spawn_maze(
|
||||
Visibility::Visible,
|
||||
))
|
||||
.insert_if(CurrentFloor, || *floor == 1) // Only floor 1 gets CurrentFloor
|
||||
.insert_if(NextFloor, || *floor != 1) // All other floors get NextFloor
|
||||
.id();
|
||||
|
||||
let assets = MazeAssets::new(&mut meshes, &mut materials, &global_config);
|
||||
|
||||
BIN
assets/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 |
@ -49,7 +49,7 @@
|
||||
#let long-underline = underline(box(width: 1fr, repeat(sym.space)))
|
||||
#set page(numbering: none)
|
||||
|
||||
= Dokumentārā lapa
|
||||
#heading(level: 1, outlined: false, numbering: none, "Dokumentārā lapa")
|
||||
|
||||
Kvalifikācijas darbs "*Spēles izstrāde, izmantojot Bevy spēļu dzinēju*" ir
|
||||
izstrādāts Latvijas Universitātes Eksakto zinātņu un tehnoloģiju fakultātē,
|
||||
@ -68,18 +68,18 @@ izdrukai un/vai recenzentam uzrādītajai darba versijai.
|
||||
)
|
||||
|
||||
v(vspace / 2)
|
||||
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~\_\_.01.2025.*]
|
||||
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~06.01.2025.*]
|
||||
|
||||
v(vspace)
|
||||
[Rekomendēju darbu aizstāvēšanai\
|
||||
Darba vadītājs: *prof. Mg. dat. Jānis Iljins ~~\_\_.01.2025.*]
|
||||
Darba vadītājs: *Mg. dat. Jānis Iljins ~~06.01.2025.*]
|
||||
|
||||
v(vspace)
|
||||
[Recenzents: *Artūrs Driķis*]
|
||||
|
||||
|
||||
v(vspace)
|
||||
[Darbs iesniegs *\_\_.01.2025.*\
|
||||
[Darbs iesniegs *06.01.2025.*\
|
||||
Kvalifikācijas darbu pārbaudījumu komisijas sekretārs (elektronisks paraksts)
|
||||
]
|
||||
|
||||
|
||||
278
main.typ
@ -15,7 +15,7 @@
|
||||
thesis_type: "Kvalifikācijas darbs",
|
||||
title: [Spēles izstrāde, izmantojot\ Bevy spēļu dzinēju],
|
||||
authors: ("Kristiāns Francis Cagulis, kc22015",),
|
||||
advisor: "prof. Mg. dat. Jānis Iljins",
|
||||
advisor: "Mg. dat. Jānis Iljins",
|
||||
date: "Rīga 2025",
|
||||
)
|
||||
#set heading(numbering: none)
|
||||
@ -30,7 +30,7 @@
|
||||
/ Notikums: īslaicīga ziņojuma struktūra, kas tiek izmantota komunikācijai starp sistēmām;
|
||||
/ PPA: programmatūras projektējuma apraksts;
|
||||
/ PPS: programmatūras prasību specifikācija;
|
||||
/ Papildspēja: objekts, kas kā spēles mehānika spēlētājam piešķir īslaicīgas priekšrocības vai papildu spējas (angl. power-up)#footnote[https://en.wikipedia.org/wiki/Power-up]<power-up>;
|
||||
/ Papildspēja: spēles mehānika, kas spēlētājam piešķir īslaicīgas priekšrocības vai papildu spējas (angl. power-up)#footnote[https://en.wikipedia.org/wiki/Power-up]<power-up>;
|
||||
/ Pirmkods: cilvēkam lasāmas programmēšanas instrukcijas, kas nosaka programmatūras darbību;
|
||||
/ Procedurāla ģenerēšana: algoritmisks satura radīšanas process, kas automātiski ģenerē datus izpildes laikā, nevis izmanto manuāli, iepriekš veidotu saturu;
|
||||
/ Renderēšana: process, kurā tiek ģenerēta vizuāla izvade;
|
||||
@ -44,8 +44,12 @@
|
||||
|
||||
= Ievads
|
||||
== Nolūks
|
||||
Šī dokumenta mērķis ir raksturot sešstūru labirinta spēles "Maze Ascension"
|
||||
programmatūras prasības un izpētīt Bevy spēļu dzinēja iespējas.
|
||||
Šī programmatūras prasību specifikācija (PPS) ir izstrādāta, lai definētu un
|
||||
dokumentētu procedurāli ģenerētas sešstūru labirinta spēles "Maze Ascension"
|
||||
programmatūras prasības, arhitektūru un tehnisko implementāciju. Dokumenta
|
||||
galvenais uzdevums ir nodrošināt skaidru un visaptverošu projekta aprakstu, kas
|
||||
kalpo gan kā tehniskā specifikācija, gan kā izpētes dokumentācija Bevy spēļu
|
||||
dzinēja iespēju demonstrēšanai.
|
||||
|
||||
== Darbības sfēra
|
||||
Darba galvenā uzmanība ir vērsta uz būtisku spēles mehāniku ieviešanu, tostarp
|
||||
@ -54,7 +58,7 @@ integrāciju un vertikālās progresijas mehāniku, vienlaikus ievērojot minim
|
||||
dizaina filozofiju.
|
||||
|
||||
Spēles pamatā ir procedurāli ģenerēti sešstūra labirinti, kas katrā spēlē rada
|
||||
unikālu vizuālo un navigācijas izaicinājumu. Procedurālās ģenerēšanas sistēma
|
||||
unikālu vizuālu un navigācijas izaicinājumu. Procedurālās ģenerēšanas sistēma
|
||||
nodrošina, ka:
|
||||
|
||||
- katrs labirints tiek unikāli ģenerēts "uzreiz"#footnote[Attiecas uz gandrīz
|
||||
@ -108,8 +112,8 @@ sešstūrainu lauku, kas piedāvā unikālu spēles pieredzi katrā spēles reiz
|
||||
Tiek skaidrota arī spēles vertikālās progresijas sistēma un papildspēju
|
||||
mehānikas, kas padara spēli izaicinošāku un interesantāku.
|
||||
|
||||
Programmatūras prasību specifikācijas sadaļa detalizē sistēmas funkcionālās
|
||||
prasības un arhitektūru.
|
||||
Programmatūras prasību specifikācijas sadaļa detalizētāk apraksta sistēmas
|
||||
funkcionālās prasības un arhitektūru.
|
||||
Izmantojot datu plūsmas diagrammas, tiek ilustrēta sistēmas moduļu mijiedarbība
|
||||
un datu plūsmas starp tiem.
|
||||
Šajā sadaļā tiek aprakstīti pieci galvenie moduļi: spēles stāvokļa pārvaldības
|
||||
@ -121,7 +125,7 @@ funkciju tabulas.
|
||||
Programmatūras projektējuma sadaļa sniedz detalizētu tehnisko specifikāciju.
|
||||
Datu struktūru projektējuma apakšsadaļā tiek aprakstītas ECS arhitektūras
|
||||
komponentes, notikumi un resursi.
|
||||
Daļējā funkciju projektējuma apakšsadaļā tiek detalizēta plākšņu pārvaldības
|
||||
Daļējā funkciju projektējuma apakšsadaļā tiek detalizēta šūnu pārvaldības
|
||||
sistēma un citas būtiskas funkcijas.
|
||||
Saskarņu projektējuma apakšsadaļā tiek aprakstīta lietotāja saskarnes
|
||||
arhitektūra un implementācija.
|
||||
@ -129,9 +133,9 @@ arhitektūra un implementācija.
|
||||
Testēšanas dokumentācijas sadaļa aptver gan statisko, gan dinamisko testēšanu.
|
||||
Statiskās testēšanas apakšsadaļā tiek aprakstītas koda kvalitātes pārbaudes
|
||||
metodes un rīki.
|
||||
Dinamiskās testēšanas apakšsadaļā tiek detalizēta gan manuālā integrācijas
|
||||
testēšana, gan automatizēto testu implementācija, sniedzot konkrētus piemērus un
|
||||
rezultātus.
|
||||
Dinamiskās testēšanas apakšsadaļā tiek detalizētāk izskatīta gan manuālā
|
||||
integrācijas testēšana, gan automatizēto testu implementācija, sniedzot
|
||||
konkrētus piemērus un rezultātus.
|
||||
|
||||
Projekta organizācijas sadaļa apraksta projekta pārvaldības aspektus.
|
||||
Kvalitātes nodrošināšanas apakšsadaļa detalizē izmantotās metodes un rīkus koda
|
||||
@ -150,10 +154,10 @@ ieteikumi turpmākai projekta attīstībai.
|
||||
== Esošā stāvokļa apraksts
|
||||
Pašreizējo spēļu izstrādes ainavu raksturo pieaugoša interese pēc neatkarīgajām
|
||||
spēlēm un modernu, efektīvu spēļu dzinēju izmantošana. Izstrādātāji arvien
|
||||
biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu. Spēļu
|
||||
dzinējs Bevy ar savu moderno arhitektūru un Rust programmēšanas valodas
|
||||
biežāk meklē rīkus, kas piedāvā elastību, veiktspēju un lietošanas ērtumu.
|
||||
Spēļu dzinējs Bevy ar savu moderno arhitektūru un Rust programmēšanas valodas
|
||||
izmantošanu gūst arvien lielāku popularitāti izstrādātāju vidū, pateicoties tā
|
||||
drošām un vienlaicīgām funkcijām.
|
||||
drošām, paralēlām sistēmām.
|
||||
|
||||
== Pasūtītājs
|
||||
Sistēma nav izstrādāta pēc konkrēta pasūtītāja pieprasījuma, tā ir raksturota un
|
||||
@ -172,12 +176,9 @@ un saistošu pieredzi dažādās operētājsistēmās un vidēs.
|
||||
|
||||
Spēle tiek izplatīta, izmantojot "GitHub
|
||||
releases"#footnote[https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases]<gh-release>
|
||||
un itch.io,#footnote[https://itch.io/]<itch-io> kas ir
|
||||
un itch.io platformas,#footnote[https://itch.io/]<itch-io> kas ir
|
||||
populāra neatkarīgo spēļu platforma, kas ļauj viegli piekļūt un izplatīt spēles
|
||||
visā pasaulē.
|
||||
Izmantojot šīs platformas, datorspēle gūst dažādu maksājumu modeļu un kopienas
|
||||
iesasaistes funkcijas, tādējādi palielinot spēles sasniedzamību un
|
||||
atpazīstamību.
|
||||
|
||||
== Darījumprasības
|
||||
Sistēmas izstrādē tiek izvirzītas sekojošas darījumprasības, kas nodrošinās
|
||||
@ -185,6 +186,9 @@ kvalitatīvu lietotāja pieredzi:
|
||||
|
||||
- Līmeņu pārvaldība: Sistēma nodrošinās automātisku spēles līmeņu pārvaldību un
|
||||
vienmērīgu pāreju starp tiem, veidojot pakāpenisku grūtības pieaugumu.
|
||||
- Līmeņu ģenerēšana: Sistēma nodrošinās procedurālu līmeņu ģenerēšanu, radot
|
||||
unikālus sešstūrainus labirintus katram spēles stāvam, garantējot, ka katrs
|
||||
labirints ir pilnībā izejams.
|
||||
- Tieša piekļuve: Spēle būs pieejama bez lietotāja konta izveides vai
|
||||
autentifikācijas, nodrošinot tūlītēju piekļuvi spēles saturam.
|
||||
- Platformu atbalsts: Sistēma tiks izstrādāta ar daudzplatformu atbalstu,
|
||||
@ -201,7 +205,7 @@ Tā kā spēlei nav nepieciešami lietotāja konti vai autentifikācija, visiem
|
||||
spēlētājiem ir vienlīdzīga piekļuve spēles funkcijām un saturam no spēles sākuma
|
||||
brīža.
|
||||
|
||||
Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa DPD
|
||||
Ar lietotāju saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņa DPD
|
||||
(sk. @fig:dpd-0).
|
||||
|
||||
#figure(
|
||||
@ -231,7 +235,7 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ
|
||||
+ Izstrādes vides un tehnoloģijas ierobežojumi:
|
||||
+ Bevy dzinēja tehniskie ierobežojumi:
|
||||
+ ECS arhitektūras specifika un tās ierobežojumi datu organizācijā;
|
||||
+ "Render Graph" sistēmas ierobežojumi grafisko elementu attēlošanā;
|
||||
+ "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;
|
||||
@ -284,7 +288,7 @@ Ar lietotājiem saistītās datu plūsmas ir attēlotas sistēmas nultā līmeņ
|
||||
\1. līmeņa datu plūsmas diagramma (sk. @fig:dpd-1) ilustrē galvenos
|
||||
procesus spēles "Maze Ascension" sistēmā.
|
||||
Diagrammā attēloti seši galvenie procesi, viens izstrādes process un viens
|
||||
ārējs (bibliotēkas) process(-i) process:
|
||||
ārējs (bibliotēkas) process(-i):
|
||||
stāva pārvaldības modulis,
|
||||
labirinta ģenerēšanas un pārvaldības moduļi,
|
||||
spēlētāja modulis,
|
||||
@ -294,17 +298,16 @@ un izstrādes rīku modulis.
|
||||
Šie procesi mijiedarbojas ar vienu datu krātuvi -- operatīvo atmiņu (RAM) -- un vienu
|
||||
ārējo lietotāju -- spēlētājs.
|
||||
|
||||
Ievades apstrādes modulis uztver un apstrādā spēlētāja ievades datus.
|
||||
Spēles stāvokļa modulis pārrauga vispārējo spēles stāvokli.
|
||||
Labirinta ģeneratora modulis izveido un pārvalda labirinta struktūras.
|
||||
Spēlētāja modulis apstrādā visas ar spēlētāju saistītās kustības, sadursmes un papildspēju mijiedarbības.
|
||||
Spēles līmeņu pārvaldnieks kontrolē līmeņu virzību un stāvokli.
|
||||
Renderēšanas un audio moduļi pārvalda attiecīgi vizuālo un audio izvadi.
|
||||
Bevy spēļu dzinējs diagrammā ir attēlots kā ārējs process vairāku iemeslu dēļ.
|
||||
Pirmkārt, Bevy nodrošina pamata infrastruktūru spēles darbībai, ieskaitot
|
||||
ievades apstrādi, renderēšanu un audio atskaņošanu.
|
||||
Tā rezultātā visa lietotāja mijiedarbība ar spēli (tastatūras, peles ievade)
|
||||
vispirms tiek apstrādāta caur Bevy sistēmām, pirms tā nonāk līdz spēles
|
||||
specifiskajiem moduļiem.
|
||||
|
||||
// Visas datu plūsmas starp procesiem tiek nodrošinātas, izmantojot operatīvo
|
||||
// atmiņu, ievērojot atbilstošas datu plūsmas diagrammas konvencijas. Šī
|
||||
// arhitektūra nodrošina efektīvu datu pārvaldību un skaidru interešu nodalīšanu
|
||||
// starp dažādām spēles sastāvdaļām.
|
||||
Operatīvā atmiņa (RAM) ir vienīgā datu krātuve diagrammā, jo Bevy ECS
|
||||
arhitektūra balstās uz komponenšu datiem, kas tiek glabāti operatīvajā atmiņā un
|
||||
spēles stāvoklis netiek pastāvīgi saglabāts diskā.
|
||||
|
||||
#figure(
|
||||
caption: [\1. līmeņa DPD],
|
||||
@ -364,7 +367,6 @@ Renderēšanas un audio moduļi pārvalda attiecīgi vizuālo un audio izvadi.
|
||||
(0, -3),
|
||||
[Bevy],
|
||||
inset: 20pt,
|
||||
extrude: (-4pt, 0),
|
||||
stroke: (thickness: 1pt, dash: "dashed"),
|
||||
)
|
||||
dpd-edge("uu", align(center)[Vizuālās\ izvades dati])
|
||||
@ -486,22 +488,6 @@ pienākumi, un tas ietver funkcijas, kas veicina kopējo spēles sistēmu.
|
||||
|
||||
=== Izstrādes rīku modulis
|
||||
|
||||
#figure(
|
||||
caption: [Izstrādes rīku moduļa 2. līmeņa DPD],
|
||||
diagram(
|
||||
spacing: 10em,
|
||||
{
|
||||
data-store((0, 0), [Spēlētājs])
|
||||
dpd-edge("r", align(center)[Labirinta\ konfigurācijas dati])
|
||||
|
||||
dpd-database((2, 0), [Operatīvā\ atmiņa])
|
||||
|
||||
process((1, 0), [Labirinta\ pārvaldības\ saskarne])
|
||||
dpd-edge("r", align(center)[Labirinta\ izkārtojuma dati])
|
||||
},
|
||||
),
|
||||
) <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 "bevy_egui"@bevy-egui un "inspector-egui"@bevy-inspector-egui
|
||||
@ -518,22 +504,34 @@ Svarīgi atzīmēt, ka šis modulis ir paredzēts lietošanai spēles izstrādes
|
||||
Laidiena versijās šī lietotāja saskarne nebūs pieejama, nodrošinot, ka
|
||||
gala lietotāji nevar piekļūt šīm uzlabotajām konfigurācijas opcijām.
|
||||
|
||||
#figure(
|
||||
caption: [Izstrādes rīku moduļa 2. līmeņa DPD],
|
||||
diagram(
|
||||
spacing: 10em,
|
||||
{
|
||||
data-store((0, 0), [Spēlētājs])
|
||||
dpd-edge("r", align(center)[Labirinta\ konfigurācijas dati])
|
||||
|
||||
dpd-database((2, 0), [Operatīvā\ atmiņa])
|
||||
|
||||
process((1, 0), [Labirinta\ pārvaldības\ saskarne])
|
||||
dpd-edge("r", align(center)[Labirinta\ izkārtojuma dati])
|
||||
},
|
||||
),
|
||||
) <dpd-2-dev_tools>
|
||||
|
||||
#function-table(
|
||||
"Labirinta pārvadības saskarne",
|
||||
"IRMF01",
|
||||
[Apstrādā un izvada labirinta konfigurācijas vadības elementus lietotāja saskarnē.],
|
||||
[
|
||||
Ievades dati tiek saņemti no pasaules resursiem un komponentēm:
|
||||
+ Labirinta spraudņa resurss;
|
||||
+ "`EguiContext`" komponente;#footnote[https://docs.rs/bevy_egui/latest/bevy_egui/]<bevy_egui>
|
||||
+ Labirinta konfigurācija un stāva komponentes saistībā ar pašreizējā stāva
|
||||
komponenti;
|
||||
+ Globālais labirinta konfigurācijas resurss.
|
||||
],
|
||||
[
|
||||
+ Pārbauda, vai labirinta straudņa resurss eksistē pasaulē.
|
||||
+ Ja nav, iziet no sistēmas un nedara neko.
|
||||
+ Saņem `EguiContext` komponenti no primārā loga.
|
||||
+ Saņem "`EguiContext`" komponenti no primārā loga.
|
||||
+ Saņem labirinta konfigurāciju un stāvu komponentes no pašreizējā stāva.
|
||||
+ Izveido jaunu "Maze Controls" logu, izmantojot "egui".
|
||||
+ Ja globālais labirinta konfigurācijas resurss ir pieejams:
|
||||
@ -612,7 +610,6 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
|
||||
+ Pārejas notikums.
|
||||
+ Stāvas entitātes.
|
||||
+ Pašreizējais stāvs.
|
||||
+ Nākamais stāvs.
|
||||
],
|
||||
[
|
||||
+ Pārbauda vai ir aktīva pāreja.
|
||||
@ -621,8 +618,7 @@ un nākamo stāvu, reaģējot uz "TransitionFloor" notikumu (sk. @tbl:events-flo
|
||||
+ Pievieno mērķa komponentes stāvu entitātēm.
|
||||
+ Atjauno stāvu statusus:
|
||||
+ Noņem pašreizējā stāva komponenti no pašreizējā stāva entitātes.
|
||||
+ Pievieno nākamā stāva komponenti nākamā entitātei.
|
||||
+ Noņem nākamā stāva komponenti no nākamā stāva entitātes.
|
||||
+ Pievieno pašreizējā stāva komponenti nākamā stāva entitātei.
|
||||
],
|
||||
[
|
||||
+ Atjaunināts stāvs.
|
||||
@ -635,7 +631,7 @@ Moduļa funkcionalitāte ir izmantota sešstūraina labirinta ģenerēšanai,
|
||||
balstoties uz "Hexagonal Grids"
|
||||
rakstu @hex-grid, kas jau ir
|
||||
kļuvis par _de facto_ standartu sešstūrainu režģu matemātikas un algoritmu
|
||||
implementācijai izstrādē.
|
||||
implementācijai.
|
||||
Moduļa funkciju datu plūsmas ir parādītas 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-hexlab).
|
||||
Labirinta būvēšanas funkcija ir aprakstītas atsevišķā tabulā (sk. @tbl:hexlab-F01).
|
||||
|
||||
@ -680,21 +676,21 @@ programmu.
|
||||
],
|
||||
[
|
||||
+ Validē ievades parametrus:
|
||||
+ Pārbauda rādiusa esamību un derīgumu;
|
||||
+ Validē sākuma pozīciju, ja tāda norādīta;
|
||||
+ Pārbauda rādiusa esamību un derīgumu.
|
||||
+ Validē sākuma pozīciju, ja tāda norādīta.
|
||||
+ Izveido sākotnējo labirinta struktūru:
|
||||
+ Inicializē tukšu labirintu ar norādīto rādiusu;
|
||||
+ Inicializē tukšu labirintu ar norādīto rādiusu.
|
||||
+ Katrai šūnai iestata sākotnējās (visas) sienas.
|
||||
+ Validē sākuma pozīciju, ja tāda norādīta.
|
||||
+ Ģenerē labirintu:
|
||||
+ Rekursīvi izveido ceļus, noņemot sienas starp šūnām;
|
||||
+ Rekursīvi izveido ceļus, noņemot sienas starp šūnām.
|
||||
+ Izmanto atpakaļizsekošanu, kad sasniegts strupceļš.
|
||||
],
|
||||
[
|
||||
+ Jaucējtabulu, kas satur:
|
||||
+ Sešstūra koordinātes kā atslēgās;
|
||||
+ Sešstūra koordinātes kā atslēgās.
|
||||
+ Sešstūra objekti ar:
|
||||
+ Pozīcijas koordinātēm ($x$, $y$);
|
||||
+ Pozīcijas koordinātēm ($x$, $y$).
|
||||
+ Sienu konfigurāciju (8-bitu maska).
|
||||
],
|
||||
[
|
||||
@ -706,8 +702,8 @@ programmu.
|
||||
|
||||
=== Labirinta pārvaldības modulis
|
||||
Labirinta pārvaldības modulis ir atbildīgs par labirintu ģenerēšanu un
|
||||
pārvaldību katrā spēles stāvā. Moduļa darbības plūsma ir attēlota 2. līmeņa datu
|
||||
plūsmas diagrammā (sk. @fig:dpd-2-maze).
|
||||
pārvaldību katrā spēles stāvā. Moduļa funkciju datu plūsmas ir attēlotas 2.
|
||||
līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-maze).
|
||||
|
||||
Modulis nodrošina divas galvenās funkcijas: labirinta izveidi
|
||||
(sk. @tbl:maze-F01) un labirinta atjaunošanu (sk. @tbl:maze-F02).
|
||||
@ -754,8 +750,8 @@ identifikatoru.
|
||||
+ Aprēķina vertikālo nobīdi jaunajam stāvam.
|
||||
+ Izveido jaunu entitāti, kas pārstāv labirinta stāvu, pievienojot tam
|
||||
atbilstošās komponente.
|
||||
+ Atkarībā no tā, vai tas ir pašreizējais vai nākamais stāvs, pievieno
|
||||
attiecīgo komponenti.
|
||||
+ Atkarībā no tā, vai tas ir pašreizējais stāvs, pievieno
|
||||
pašreizējā stāva komponenti.
|
||||
+ Izveido jaunas entitātes, kas pārstāv labirinta šūnas, kā bērnu
|
||||
elementus labirinta entitātei.
|
||||
+ Katrai labirinta šūnai atbilstoši labirinta konfigurācijai, izveido
|
||||
@ -766,7 +762,7 @@ identifikatoru.
|
||||
],
|
||||
[
|
||||
+ "Stāvs $x$ jau eksistē."
|
||||
+ "Neizdevās ģenerēt labirintu stāvam $x$."
|
||||
// + "Neizdevās ģenerēt labirintu stāvam $x$."
|
||||
],
|
||||
) <maze-F01>
|
||||
|
||||
@ -799,9 +795,10 @@ identifikatoru.
|
||||
|
||||
=== Spēlētāja modulis
|
||||
Spēlētāja modulis ir atbildīgs par spēlētāja entītijas pārvaldību, kas ietver
|
||||
tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi. Moduļa darbības
|
||||
plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk. @fig:dpd-2-player), kas
|
||||
parāda četras galvenās funkcijas un to mijiedarbību ar datu glabātuvi.
|
||||
tās izveidi, kustību apstrādi un mijiedarbību ar spēles vidi.
|
||||
Moduļa datu plūsma ir attēlota 2. līmeņa datu plūsmas diagrammā (sk.
|
||||
@fig:dpd-2-player), kas parāda četras galvenās funkcijas un to mijiedarbību ar
|
||||
datu glabātuvi.
|
||||
|
||||
Spēlētāja kustība tiek realizēta divās daļās: ievades apstrāde
|
||||
(@tbl:player-F02) un kustības izpilde (@tbl:player-F03).
|
||||
@ -811,7 +808,7 @@ Kustības izpildes funkcija nodrošina plūstošu pārvietošanos uz mērķa poz
|
||||
izmantojot interpolāciju#footnote[Matemātiska metode, kas aprēķina starpvērtības
|
||||
starp diviem zināmiem punktiem.] starp pašreizējo un mērķa pozīciju.
|
||||
|
||||
Stāvu pārejas apstrāde (#link(<player-F04>)[SPMF04]) nepārtraukti uzrauga spēlētāja pozīciju
|
||||
Stāvu pārejas apstrāde nepārtraukti uzrauga spēlētāja pozīciju
|
||||
attiecībā pret stāva izeju un sākumu. Kad spēlētājs sasniedz kādu no šiem
|
||||
punktiem, funkcija izsauc atbilstošu pārejas notikumu.
|
||||
|
||||
@ -1000,7 +997,7 @@ Katra no šīm funkcijām apstrādā specifiskus lietotāja ievades datus un
|
||||
atbilstoši atjaunina spēles stāvokli.
|
||||
|
||||
Moduļa 2. līmeņa DPD diagramma (sk. @fig:dpd-2-screen) parāda, ka lietotājs
|
||||
mijiedarbojas ar sistēmu caur diviem galvenajiem ievades veidiem: pogu izvēli
|
||||
mijiedarbojas ar sistēmu izmantojot divus galvenos ievades veidus: pogu izvēli
|
||||
sākumekrānā un "Escape" taustiņa nospiešanu spēles laikā.
|
||||
|
||||
Spēles sākšanas funkcija inicializē nepieciešamos resursus un
|
||||
@ -1032,7 +1029,7 @@ atgriežas uz sākumekrānu.
|
||||
dpd-database((6, 0), [Operatīvā\ atmiņa])
|
||||
dpd-edge(
|
||||
"d,lll",
|
||||
align(center)[Atjaunoti spēles\ stāvokļa dati],
|
||||
align(center)[Spēles\ stāvokļa dati],
|
||||
label-pos: 0.7,
|
||||
shift: -20pt,
|
||||
)
|
||||
@ -1282,7 +1279,7 @@ spēlētāju saistītās komponentes, kā redzams @tbl:components-floor[],
|
||||
|
||||
Stāva komponentes pārvalda vertikālo progresu un kustību spēlē.
|
||||
Kā redzams @tbl:components-floor[tabulā], šīs komponentes pārvalda stāvu numurus,
|
||||
pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
pašreizējā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
|
||||
#components-table(
|
||||
caption: "Ar stāviem saistītās komponentes",
|
||||
@ -1292,9 +1289,6 @@ pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
`CurrentFloor`,
|
||||
"Atzīmē pašreizējo stāvu",
|
||||
"Identificē pašreizējo stāvu.",
|
||||
`NextFloor`,
|
||||
"Atzīmē nākamo stāvu",
|
||||
"Identificē progresa mērķa līmeni, uz kuru jāpāriet. Var būt arī līmenis zemāk.",
|
||||
`FloorYTarget`,
|
||||
"Stāva nākamā Y pozīcija",
|
||||
"Identificē stāva Y koordināti, uz kuru tas jāpārvieto.",
|
||||
@ -1302,10 +1296,9 @@ pašreizējā un nākamā stāva stāvokli un vertikālās kustības mehāniku.
|
||||
|
||||
==== Labirinta komponentes
|
||||
|
||||
Labirinta struktūru pārvalda vairāki savstarpēji saistītas komponentes.
|
||||
Tabulā @tbl:components-maze[] ir redzamas sastāvdaļas, kas ir atbildīgas par
|
||||
labirinta izveidi un uzturēšanu.
|
||||
|
||||
Labirinta struktūru pārvalda vairāki savstarpēji saistītas komponentes,
|
||||
kas ir atbildīgas par labirinta uzturēšanu (sk. @tbl:components-maze).
|
||||
#pagebreak()
|
||||
#components-table(
|
||||
caption: "Ar labirintiem saistītās komponentes",
|
||||
`HexMaze`,
|
||||
@ -1321,12 +1314,12 @@ labirinta izveidi un uzturēšanu.
|
||||
"Glabā labirinta parametrus",
|
||||
"Konfigurē labirinta ģenerēšanu ar rādiusu, pozīcijām un izkārtojumu.",
|
||||
`Maze`,
|
||||
"Glabā sešstūra labirinta datu",
|
||||
"Glabā sešstūra labirinta datus",
|
||||
"Glabā pilnu labirinta struktūru, izmantojot jaucējtabulu.",
|
||||
`Walls`,
|
||||
"Apzīmē sienu konfigurāciju",
|
||||
[Pārvalda sienas stāvokļus, izmantojot bitu karodziņus.
|
||||
@begginer-patterns],
|
||||
[Pārvalda sienas stāvokļus, izmantojot bitu karodziņus
|
||||
@begginer-patterns.],
|
||||
) <components-maze>
|
||||
|
||||
==== Spēlētāja komponentes
|
||||
@ -1341,8 +1334,8 @@ spēlētāju saistītās funkcijas.
|
||||
"Apzīmē spēlētāja entitāti",
|
||||
"Identificē spēlētāju un pieprasa nepieciešamās sastāvdaļas.",
|
||||
`CurrentPosition`,
|
||||
"Glabā spēlētāj pozīciju",
|
||||
"nosaka pašreizējo atrašanās vietu labirintā.",
|
||||
"Glabā spēlētājs pozīciju",
|
||||
"Nosaka pašreizējo atrašanās vietu labirintā.",
|
||||
`MovementSpeed`,
|
||||
"Glabā kustības ātrumu",
|
||||
"Nosaka spēlētāja pārvietošanās ātrumu.",
|
||||
@ -1367,8 +1360,8 @@ un ar spēlētāju saistīti notikumi, kas redzams @tbl:events-maze[],
|
||||
==== Labirintu notikumi
|
||||
|
||||
Labirinta notikumi pārvalda labirinta entitāšu dzīves ciklu spēlē. Kā redzams
|
||||
@tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi, atjaunošanu
|
||||
un likvidēšanu.
|
||||
@tbl:events-maze[tabulā], šie notikumi pārvalda labirinta izveidi un
|
||||
atjaunošanu.
|
||||
|
||||
#events-table(
|
||||
caption: "Ar labirintiem saistīti notikumi",
|
||||
@ -1378,9 +1371,6 @@ un likvidēšanu.
|
||||
`RespawnMaze`,
|
||||
"Atjauno esošo labirintu",
|
||||
"Atjauno labirintu.",
|
||||
`DespawnMaze`,
|
||||
"Noņem labirintu",
|
||||
"Izdzēš labirinta entitātes norādītajam stāvam.",
|
||||
) <events-maze>
|
||||
|
||||
==== Stāvu notikumi
|
||||
@ -1409,8 +1399,8 @@ Stāvu pārejas sistēma izmanto vienu uzskaitītu notikumu tipu (sk.
|
||||
|
||||
Ar spēlētāju saistītie notikumi pārvalda spēlētāja entitātes dzīves ciklu (sk.
|
||||
@tbl:events-player).
|
||||
Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu, atjaunošanu
|
||||
un likvidēšanu.
|
||||
Līdzīgi kā labirintu notikumiem, šie apstrādā spēlētāja izveidošanu un
|
||||
atjaunošanu.
|
||||
|
||||
#events-table(
|
||||
caption: "Ar spēlētaju saistīti notikumi",
|
||||
@ -1420,36 +1410,29 @@ un likvidēšanu.
|
||||
`RespawnPlayer`,
|
||||
"Atjauno spēlētāju",
|
||||
"Atiestata spēlētāju uz pašreizējā stāva sākuma pozīciju.",
|
||||
`DespawnPlayer`,
|
||||
"Noņem spēlētāju",
|
||||
"Izdzēš spēlētāja entitātes.",
|
||||
) <events-player>
|
||||
|
||||
=== Resursi
|
||||
|
||||
Bevy resursi kalpo kā globāli stāvokļa konteineri, kuriem var piekļūt jebkura
|
||||
sistēma.
|
||||
Atšķirībā no komponentiem, kas ir piesaistīti konkrētām entitātēm, resursi
|
||||
Atšķirībā no komponentēm, kas ir piesaistīti konkrētām entitātēm, resursi
|
||||
nodrošina spēles mēroga datus un konfigurāciju.
|
||||
Tie ir īpaši noderīgi kopīgu stāvokļu un iestatījumu pārvaldībai, kas var
|
||||
ietekmē vairākas sistēmas @bevy-cheatbook[nod. ~14.6].
|
||||
Spēle izmanto vairākus resursus globālās konfigurācijas un stāvokļa pārvaldībai
|
||||
ietekmēt vairākas sistēmas @bevy-cheatbook[nod. ~14.6].
|
||||
Spēle izmanto vienu resursu globālās konfigurācijas un stāvokļa pārvaldībai
|
||||
(sk. @tbl:resources)
|
||||
|
||||
#resources-table(
|
||||
caption: "Globālie resursi",
|
||||
`MazePluginLoaded`,
|
||||
"Spraudņa stāvokļa marķieris",
|
||||
"Norāda labirinta spraudņa inicializāciju.",
|
||||
`GlobalMazeConfig`,
|
||||
"Labirinta vizuālie iestatījumi",
|
||||
"Uzglabā globālos labirinta izskata parametrus.",
|
||||
) <resources>
|
||||
|
||||
#indent-par[
|
||||
Resurss "`GlobalMazeConfig`" ir īpaši svarīgs, jo tas pārvalda labirinta vizuālo
|
||||
attēlojumu, ietverot tādus parametrus kā sešstūra lielums, sienu biezums un
|
||||
vertikālais augstums.
|
||||
Dotais resurss pārvalda labirinta vizuālo attēlojumu, ietverot tādus
|
||||
parametrus kā sešstūra lielums, sienu biezums un vertikālais augstums.
|
||||
]
|
||||
|
||||
== Daļējs funkciju projektējums
|
||||
@ -1615,7 +1598,7 @@ atgriežas un mēģina citu ceļu.
|
||||
Labajā pusē ir attēlota stāvu pārejas loģika, kas tiek izpildīta, kad neviens
|
||||
stāvs nekustās.
|
||||
Šī daļa aprēķina jaunās $Y$ koordinātes visiem stāviem, pievieno tiem
|
||||
galamērķa komponentes un atjaunina pašreizējā un nākamā stāva marķierus.
|
||||
galamērķa komponentes un atjaunina pašreizējā stāva marķierus.
|
||||
]
|
||||
#figure(
|
||||
caption: "Stāva kustības sistēma",
|
||||
@ -1662,7 +1645,7 @@ atgriežas un mēģina citu ceļu.
|
||||
action-node((1, 4), [Pievienot stāva galamērķa\ komponenti katram stāvam])
|
||||
std-edge()
|
||||
|
||||
action-node((1, 5), [Atjaunina pašreizējā un\ nākamā stāvu marķierus])
|
||||
action-node((1, 5), [Atjaunina pašreizējā marķieri])
|
||||
std-edge("l,uu,l")
|
||||
}),
|
||||
),
|
||||
@ -1763,21 +1746,22 @@ testēšana, izmantojot gan automatizētus rīkus, gan manuālu pārbaudi.
|
||||
|
||||
== Statiskā testēšana <static-tests>
|
||||
Statiskā testēšana ir svarīga daļa no projekta kvalitātes nodrošināšanas.
|
||||
"Clippy"
|
||||
tiek izmantots koda analīzei, meklējot potenciālas problēmas un
|
||||
neoptimālus risinājumus. Papildus noklusētajiem noteikumiem, tika aktivizēti
|
||||
stingrāki koda kvalitātes pārbaudes līmeņi: "pedantic" režīms nodrošina
|
||||
padziļinātu koda stila pārbaudi, "nursery" aktivizē eksperimentālās pārbaudes,
|
||||
un "unwrap_used" un "expect_used" brīdina par potenciāli nedrošu kļūdu
|
||||
apstrādi. Šie papildu noteikumi palīdz uzturēt augstāku koda kvalitāti un
|
||||
samazināt potenciālo kļūdu skaitu @clippy.
|
||||
"Clippy" tiek izmantots koda analīzei, meklējot potenciālas problēmas un
|
||||
neoptimālus risinājumus.
|
||||
Papildus noklusētajiem noteikumiem, tika aktivizēti stingrāki koda kvalitātes
|
||||
pārbaudes līmeņi: "pedantic" režīms nodrošina padziļinātu koda stila pārbaudi,
|
||||
"nursery" aktivizē eksperimentālās pārbaudes, un "unwrap_used" un "expect_used"
|
||||
brīdina par potenciāli nedrošu kļūdu apstrādi. Šie papildu noteikumi palīdz
|
||||
uzturēt augstāku koda kvalitāti un samazināt potenciālo kļūdu skaitu
|
||||
(sk. @clippy-hexlab[] un @clippy-maze-ascension[pielikumus]) @clippy.
|
||||
|
||||
== Dinamiskā testēšana
|
||||
|
||||
Lai novērtētu programmatūras uzvedību darbības laikā, tika veikta dinamiskā
|
||||
testēšana. Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot
|
||||
lietotāja saskarnes mijiedarbību, gan automatizētus testu komplektus, lai
|
||||
nodrošinātu visaptverošu spēles funkcionalitātes pārklājumu.
|
||||
testēšana.
|
||||
Šī testēšanas pieeja apvieno gan manuālu testēšanu, izmantojot lietotāja
|
||||
saskarnes mijiedarbību, gan automatizētus testu komplektus, lai nodrošinātu
|
||||
visaptverošu spēles funkcionalitātes pārklājumu.
|
||||
|
||||
=== Manuālā integrācijas testēšana
|
||||
|
||||
@ -1786,7 +1770,7 @@ Katrs testa scenārijs ir dokumentēta strukturētas tabulas formātā, ievēroj
|
||||
būtisku informāciju, piemēram, test nosaukumu, unikālo identifikatoru, aprakstu,
|
||||
izpildes soļus, gaidāmo rezultātu un faktisko rezultātu (veiksmīga testa
|
||||
gadījumā apzīmēts ar "Ok", bet neveiksmīgu -- "Err").
|
||||
Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
|
||||
Testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabulā].
|
||||
|
||||
|
||||
#figure(
|
||||
@ -1820,22 +1804,24 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
"Stāvu pāreja (uz augšu)",
|
||||
[
|
||||
+ Nokļūt līdz beigu šūnai
|
||||
+ Nospiest taustiņu "E"
|
||||
+ Novērot animāciju
|
||||
],
|
||||
[
|
||||
+ Plūstoša pāreja starp stāviem uz augšu
|
||||
+ Jauna stāva ģenerēšana
|
||||
+ Plūstoša pāreja starp stāviem uz augšu
|
||||
],
|
||||
"Ok",
|
||||
"MT04",
|
||||
"Stāvu pāreja (uz leju)",
|
||||
[
|
||||
+ Nokļūt līdz sākuma šūnai
|
||||
+ Nospiest taustiņu "E"
|
||||
+ Novērot animāciju
|
||||
],
|
||||
[
|
||||
+ Plūstoša pāreja starp stāviem uz leju
|
||||
+ Jauns stāvs netiek ģenerēts
|
||||
+ Plūstoša pāreja starp stāviem uz leju
|
||||
],
|
||||
"Ok",
|
||||
"MT05",
|
||||
@ -1868,7 +1854,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
"MT08",
|
||||
[Spēlētāja kustība],
|
||||
[
|
||||
+ Izmantot WASD vadību
|
||||
+ Izmantot "WASD" kustības taustiņus
|
||||
+ Mēģināt šķērsot sienas
|
||||
],
|
||||
[
|
||||
@ -1881,7 +1867,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli Windows platformai
|
||||
+ Palaist .exe failu
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[Spēle darbojas Windows vidē bez kļūdām],
|
||||
"Ok",
|
||||
@ -1890,7 +1876,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli Linux platformai
|
||||
+ Palaist bināro failu
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[Spēle darbojas Linux vidē bez kļūdām],
|
||||
"Ok",
|
||||
@ -1899,7 +1885,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli macOS platformai
|
||||
+ Palaist .dmg pakotni
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[Spēle darbojas macOS vidē bez kļūdām],
|
||||
"Err",
|
||||
@ -1908,7 +1894,7 @@ Izvēlētie testu gadījumi ir detalizētāk aprakstīti @tbl:manual-tests[tabul
|
||||
[
|
||||
+ Kompilēt spēli WASM mērķim
|
||||
+ Atvērt pārlūkā
|
||||
+ Veikt pamata funkcionalitātes testu
|
||||
+ Veikt pamata funkcionalitātes testus
|
||||
],
|
||||
[
|
||||
+ Spēle ielādējas pārlūkā
|
||||
@ -1940,9 +1926,9 @@ Testēšanas stratēģijā ir ieviesti vairāki pārbaudes līmeņi: dokumentāc
|
||||
no drošina piemēra koda pareizību, moduļu testi pārbauda iekšējo
|
||||
funkcionalitāti, savukārt testu mapē esošie vienībtesti un integrācijas testi
|
||||
pārbauda sarežģītākus gadījumus.
|
||||
Automatizēto testu izpildes rezultātu kopsavilkums ir redzams
|
||||
pieejams @tests-hexlab-full[pielikumā].
|
||||
@fig:tests-hexlab[attēlā], savukārt detalizēts testu izpildes pārskats ir
|
||||
Daļējs automatizēto testu izpildes rezultāts ir redzams @fig:tests-hexlab, savukārt
|
||||
detalizēts testu izpildes pārskats ir redzams piejams pielikumā (sk.
|
||||
@tests-hexlab-full).
|
||||
|
||||
Izmantojot "cargo-tarpaulin", testu pārklājums ir $81.69%$ (sk.
|
||||
@tarpaulin-hexlab[pielikumu]), tomēr šis rādītājs
|
||||
@ -1994,12 +1980,16 @@ uzturētu vienotu koda formatējumu visā projektā.
|
||||
Turklāt visas publiskās funkcijas un datu struktūras "hexlab" bibliotēkā ir
|
||||
dokumentētas#footnote[https://docs.rs/hexlab/latest/hexlab/]<hexlab-docs>.
|
||||
Šajā dokumentācijā ir ietverti detalizēti apraksti un lietošanas piemēri, kas ne
|
||||
tikai palīdz saprast kodu, bet programmatūras prasības specifikācija ir
|
||||
izstrādāta, ievērojot LVS 68:1996 standarta "Programmatūras prasību
|
||||
specifikācijas ceļvedis" @lvs_68 un LVS 72:1996 standarta "Ieteicamā prakse
|
||||
programmatūras projektējuma aprakstīšanai" standarta prasības @lvs_72.
|
||||
Programmatūras projektējuma aprakstā iekļautās aktivitāšu diagrammas ir veidotas
|
||||
atbilstoši UML (Unified Modeling Language) 2.5 specifikācijai @omg-uml.
|
||||
tikai palīdz saprast kodu, bet arī atvieglo bibliotēkas testēšanu un kļūdu
|
||||
labošanu.
|
||||
|
||||
Programmatūras prasības specifikācija ir izstrādāta, ievērojot LVS 68:1996
|
||||
standarta "Programmatūras prasību specifikācijas ceļvedis" @lvs_68 un LVS
|
||||
72:1996 standarta "Ieteicamā prakse programmatūras projektējuma aprakstīšanai"
|
||||
standarta prasības @lvs_72.
|
||||
// Programmatūras projektējuma aprakstā iekļautās
|
||||
// aktivitāšu diagrammas ir veidotas atbilstoši UML (Unified Modeling Language) 2.5
|
||||
// specifikācijai @omg-uml.
|
||||
|
||||
== Konfigurācijas pārvaldība
|
||||
|
||||
@ -2012,7 +2002,7 @@ Rīku konfigurācija ir definēta vairākos failos:
|
||||
- laidiena kompilācijas ar iespējotu optimizāciju.
|
||||
- "GitHub Actions" darbplūsmas, kas apstrādā @gh-actions:
|
||||
- koda kvalitātes pārbaudes (vienībtesti, statiskie testi, formatēšana,
|
||||
dokumentācijas izveide).
|
||||
dokumentācijas izveide);
|
||||
- kompilācijas un izvietotošanas darbplūsma, kas:
|
||||
- izveido Windows, Linux, macOS un WebAssembly versijas;
|
||||
- publicē bināros failus GitHub platformā;
|
||||
@ -2025,12 +2015,12 @@ Versiju specifikācija notiek pēc semantiskās versiju atlases (MAJOR.MINOR.PAT
|
||||
|
||||
== Darbietilpības novērtējums
|
||||
Projekta darbietilpības novērtēšanai tika izmantota QSM (angl. Quantitative
|
||||
Software Management, latv. kvantitatīvā programmatūra vadība) metodoloģija, kas
|
||||
Software Management, latv. kvantitatīvā programmatūras vadība) metodoloģija, kas
|
||||
balstās uz $550$ verificētu programmatūras projektu datubāzi @QSM.
|
||||
Izmantojot "tokei" rīku @tokei, tika veikta detalizēta projekta koda analīze,
|
||||
kas parādija, ka "Maze Ascension" projekts satur $1927$ koda rindiņas (sk. @tokei-maze-ascension), bet
|
||||
saistītā "hexlab" bibliotēka -- $979$ rindiņas (sk. @tokei-hexlab), kopā veidojot $2906$ loģiskās koda
|
||||
rindiņas, neiekļaujot tukšās rindiņas un komentārus .
|
||||
kas parādija, ka "Maze Ascension" projekts satur $2686$ koda rindiņas (sk. @tokei-maze-ascension), bet
|
||||
saistītā "hexlab" bibliotēka -- $979$ rindiņas (sk. @tokei-hexlab), kopā
|
||||
veidojot $3236$ pirmkoda rindiņas, neiekļaujot tukšās rindiņas un komentārus.
|
||||
|
||||
Saskaņā ar QSM etalontabulu "Business Systems Implementation Unit (New and
|
||||
Modified IU) Benchmarks", pirmās kvartiles projekti ($25%$ mazākie no $550$
|
||||
@ -2056,7 +2046,6 @@ Turklāt jāņem vērā projekta papildu sarežģītības faktori:
|
||||
koda rakstīšanu, bet arī izpēti, dokumentēšanu un optimizāciju.
|
||||
]
|
||||
|
||||
|
||||
= Secinājumi
|
||||
|
||||
Kvalifikācijas darba ietvaros tika izstrādāta trīsdimensiju spēle, izmantojot
|
||||
@ -2075,8 +2064,8 @@ Bevy spēļu dzinēja izmantošana ļāva efektīvi implementēt entitāšu-komp
|
||||
sistēmu (ECS), kas nodrošina labu veiktspēju un koda organizāciju.
|
||||
Tomēr tika konstatēts, ka Bevy ekosistēma joprojām ir aktīvās izstrādes stadijā,
|
||||
ko apliecina darba izstrādes laikā iznākusī jaunā versija (0.15).
|
||||
Ši versija ieviesa vairākas būtiskas izmaiņas, piemēram, "Required Components"
|
||||
(latv. nepieciešamo komponentu) konceptu uzlabotu animāciju sistēmu un daudz ko
|
||||
Šī versija ieviesa vairākas būtiskas izmaiņas, piemēram, "Required Components"
|
||||
(latv. nepieciešamo komponenšu) konceptu uzlabotu animāciju sistēmu un daudz ko
|
||||
citu, kas radīja nepieciešamību pielāgot esošo kodu @bevy-0.15.
|
||||
Šāda strauja attīstība, no vienas puses, nodrošina jaunas iespējas un
|
||||
uzlabojumus, bet no otras puses, rada izaicinājumus saistībā ar dokumentācijas
|
||||
@ -2100,6 +2089,7 @@ Projekta turpmākās attīstības iespējas ietver:
|
||||
|
||||
#include "src/attachments.typ"
|
||||
#include "src/code.typ"
|
||||
#include "documentary_page.typ"
|
||||
|
||||
// #pagebreak()
|
||||
// #total-words words
|
||||
|
||||
283
presentation.typ
Normal file
@ -0,0 +1,283 @@
|
||||
#import "@preview/touying:0.5.5": *
|
||||
#import themes.university: *
|
||||
#import "@preview/cetz:0.3.1"
|
||||
#import "@preview/fletcher:0.5.3" as fletcher: node, edge
|
||||
#import "@preview/ctheorems:1.1.3": *
|
||||
#import "@preview/numbly:0.1.0": numbly
|
||||
#import "src/diagrams.typ": *
|
||||
|
||||
#set text(
|
||||
font: (
|
||||
"Times New Roman",
|
||||
"New Computer Modern",
|
||||
),
|
||||
size: 12pt,
|
||||
hyphenate: auto,
|
||||
lang: "lv",
|
||||
region: "lv",
|
||||
)
|
||||
#show raw: set text(
|
||||
font: (
|
||||
"JetBrainsMono NF",
|
||||
"JetBrains Mono",
|
||||
"Fira Code",
|
||||
),
|
||||
features: (calt: 0),
|
||||
)
|
||||
|
||||
// cetz and fletcher bindings for touying
|
||||
#let cetz-canvas = touying-reducer.with(
|
||||
reduce: cetz.canvas,
|
||||
cover: cetz.draw.hide.with(bounds: true),
|
||||
)
|
||||
#let fletcher-diagram = touying-reducer.with(
|
||||
reduce: fletcher.diagram,
|
||||
cover: fletcher.hide,
|
||||
)
|
||||
|
||||
#set figure(supplement: none)
|
||||
|
||||
// Theorems configuration by ctheorems
|
||||
#show: thmrules.with(qed-symbol: $square$)
|
||||
#let theorem = thmbox("theorem", "Theorem", fill: rgb("#eeffee"))
|
||||
#let corollary = thmplain(
|
||||
"corollary",
|
||||
"Corollary",
|
||||
base: "theorem",
|
||||
titlefmt: strong,
|
||||
)
|
||||
#let definition = thmbox(
|
||||
"definition",
|
||||
"Definition",
|
||||
inset: (x: 1.2em, top: 1em),
|
||||
)
|
||||
#let example = thmplain("example", "Example").with(numbering: none)
|
||||
#let proof = thmproof("proof", "Proof")
|
||||
|
||||
#show: university-theme.with(
|
||||
aspect-ratio: "16-9",
|
||||
config-info(
|
||||
title: [Spēles izstrāde, izmantojot Bevy spēļu dzinēju],
|
||||
subtitle: [Kvalifikācijas darbs],
|
||||
author: [Kristiāns Francis Cagulis kc22015],
|
||||
date: [2025],
|
||||
institution: [Latvijas Universitāte],
|
||||
),
|
||||
config-colors(
|
||||
primary: rgb("#575279"),
|
||||
secondary: rgb("#797593"),
|
||||
tertiary: rgb("#286983"),
|
||||
neutral-lightest: rgb("#faf4ed"),
|
||||
neutral-darkest: rgb("#575279"),
|
||||
),
|
||||
)
|
||||
|
||||
#title-slide()
|
||||
|
||||
#slide[
|
||||
= Pārskats
|
||||
- Entitāšu komponenšu sistēma (ECS)
|
||||
- Maze Ascension
|
||||
- Hexlab bibliotēka
|
||||
- Sešstūru implementācija
|
||||
- Saskarne
|
||||
- Rezultāti un secinājumi
|
||||
]
|
||||
|
||||
= Entitāšu komponenšu sistēma (ECS)
|
||||
|
||||
== Kas ir ECS?
|
||||
|
||||
- Koncentrējas uz kompozīciju, nevis mantošanu.
|
||||
- Datu orientēta arhitektūra.
|
||||
- Nodalīti dati (komponentes) un uzvedība (sistēmas).
|
||||
|
||||
== Datu izkārtojums
|
||||
|
||||
// Here is an illustration to help you visualize the logical structure. The
|
||||
// checkmarks show what component types are present on each entity. Empty cells
|
||||
// mean that the component is not present. In this example, we have a player, a
|
||||
// camera, and several enemies.
|
||||
#context {
|
||||
show raw: set text(size: 16pt)
|
||||
table(
|
||||
columns: 7,
|
||||
[*Entity (ID)*],
|
||||
[*Transform*],
|
||||
[*Player*],
|
||||
[*Enemy*],
|
||||
[*Camera*],
|
||||
[*Health*],
|
||||
[*...*],
|
||||
|
||||
`...`, "", "", "", "", "", "",
|
||||
"107",
|
||||
[#emoji.checkmark.heavy `<translation>`\ `<rotation>`\ `<scale>`],
|
||||
emoji.checkmark.heavy,
|
||||
"",
|
||||
"",
|
||||
[#emoji.checkmark.heavy `<50.0>`],
|
||||
"",
|
||||
|
||||
"108",
|
||||
[#emoji.checkmark.heavy `<translation>`\ `<rotation>`\ `<scale>`],
|
||||
"",
|
||||
emoji.checkmark.heavy,
|
||||
"",
|
||||
[#emoji.checkmark.heavy `<25.0>`],
|
||||
"",
|
||||
|
||||
"109",
|
||||
[#emoji.checkmark.heavy `<translation>`\ `<rotation>`\ `<scale>`],
|
||||
"",
|
||||
"",
|
||||
[#emoji.checkmark.heavy `<camera data>`],
|
||||
"",
|
||||
"",
|
||||
|
||||
`...`,
|
||||
)
|
||||
}
|
||||
|
||||
== Piemērs
|
||||
#context {
|
||||
show raw: set text(size: 16pt)
|
||||
```rust
|
||||
#[derive(Component)]
|
||||
struct Player;
|
||||
|
||||
#[derive(Component)]
|
||||
struct Health {
|
||||
current: u32,
|
||||
max: u32
|
||||
}
|
||||
|
||||
fn heal_player(
|
||||
mut query: Query<&mut Health, With<Player>>,
|
||||
time: Res<Time>,
|
||||
) {
|
||||
for mut health in query.iter_mut() {
|
||||
let new_health = health.current + 2. * time.delta_secs();
|
||||
health.current = new_health.min(health.max);
|
||||
}
|
||||
}
|
||||
```
|
||||
}
|
||||
|
||||
= Maze Ascension
|
||||
|
||||
== 1. Līmeņa DPD
|
||||
|
||||
#figure(image("assets/images/diagrams/dpd1.png"))
|
||||
|
||||
== Stāva modulis
|
||||
|
||||
#figure(image("assets/images/diagrams/floor.png", width: 50%))
|
||||
|
||||
|
||||
= Hexlab bibliotēka
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#figure(
|
||||
caption: link("https://crates.io/crates/hexlab"),
|
||||
image("assets/images/crates/hexlab.png", height: 92%),
|
||||
)
|
||||
|
||||
== Labirinta ģenerēšanas funkcijas projektējums
|
||||
#grid(
|
||||
columns: (1fr, 1fr),
|
||||
figure(image("assets/images/diagrams/maze-gen.png")),
|
||||
figure(image("assets/images/diagrams/recursive.png")),
|
||||
)
|
||||
|
||||
== Ģenerēšanas algoritms
|
||||
// recursive backtracking
|
||||
#figure(
|
||||
caption: link("https://en.wikipedia.org/wiki/Maze_generation_algorithm"),
|
||||
image("assets/videos/hexmaze/hexmaze.gif", height: 92%),
|
||||
)
|
||||
|
||||
= Sešstūru implementācija
|
||||
== Attēlošana
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
figure(image("assets/images/game/tile-spreadout.png", height: 100%)),
|
||||
figure(image("assets/images/game/tile.png", height: 100%)),
|
||||
)
|
||||
|
||||
#figure(image("assets/images/game/grid.png", height: 100%))
|
||||
|
||||
= Saskarne
|
||||
#pagebreak()
|
||||
|
||||
#grid(
|
||||
columns: 2,
|
||||
figure(image("assets/images/game/main-menu.png")),
|
||||
)
|
||||
|
||||
#figure(image("assets/videos/game/maze-game.gif"))
|
||||
|
||||
#grid(
|
||||
columns: (1fr, 1fr),
|
||||
figure(image("assets/images/game/debug.png")),
|
||||
figure(image("assets/images/game/dev-tools.png")),
|
||||
)
|
||||
|
||||
|
||||
#figure(image("assets/videos/game/big-maze.gif"))
|
||||
|
||||
= Secinājumi
|
||||
== Rezultāti
|
||||
|
||||
- 3D spēle izmantojot Bevy un Rust:
|
||||
- Procedurāla sešstūraina labirints ģenerēšana, izmantojot DFS.
|
||||
- Izveidota atkārtoti lietojama atvērtā pirmkoda bibliotēka "hexlab".
|
||||
- Efektīva līmeņa pārvaldība:
|
||||
- Vienmērīga pāreja starp labirinta līmeņiem.
|
||||
|
||||
== Turpmākie darbi
|
||||
|
||||
- Īstenot vairāk labirintu ģenerēšanas paņēmienus/algoritmus.
|
||||
- Ieviest jaunas mehānikas un papildspējas.
|
||||
- Uzlabot vizuālo kvalitāti un spēlētāja izskatu.
|
||||
- Izstrādāt daudzspēlētāju režīmu.
|
||||
|
||||
= Paldies par uzmanību!
|
||||
|
||||
Jautājumi?
|
||||
|
||||
#show: appendix
|
||||
|
||||
= Galavārds
|
||||
== ECS vs OOP
|
||||
#grid(
|
||||
columns: (1fr, 1fr),
|
||||
gutter: 1em,
|
||||
[
|
||||
*ECS*
|
||||
- Plakana hierarhija
|
||||
- Datu orientēta
|
||||
- Kešatmiņai piemērots
|
||||
- Paralēla apstrāde
|
||||
],
|
||||
[
|
||||
*OOP*
|
||||
- Dziļa mantojamība (inheritance)
|
||||
- Objektorientēta
|
||||
- Kešatmiņa izkliedēts
|
||||
- Secīga apstrāde
|
||||
],
|
||||
)
|
||||
|
||||
== Iedvesma
|
||||
#figure(
|
||||
caption: link("https://www.redblobgames.com/grids/hexagons/"),
|
||||
grid(
|
||||
columns: 2,
|
||||
figure(image("assets/images/redblogmages/axial-coords.png", height: 92%)),
|
||||
figure(image("assets/videos/coords/coords.gif", height: 92%)),
|
||||
),
|
||||
)
|
||||
|
||||
@ -3,4 +3,5 @@
|
||||
#import "@preview/headcount:0.1.0"
|
||||
#import "@preview/i-figured:0.2.4"
|
||||
#import "@preview/tablex:0.0.9"
|
||||
#import "@preview/touying:0.5.5"
|
||||
#import "@preview/wordometer:0.1.3"
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
"Anotācija",
|
||||
)
|
||||
Kvalifikācijas darbā ir izstrādāta spēle "Maze Ascension", kas piedāvā
|
||||
spēlētājiem izaicinājumu iziet cauri proceduāli ģenerētiem sešstūrainam
|
||||
spēlētājiem izaicinājumu iziet cauri procedurāli ģenerētiem sešstūrainam
|
||||
labirintiem. Spēle ir veidota, izmantojot Rust programmēšanas valodu un Bevy
|
||||
spēļu dzinēju.
|
||||
|
||||
@ -32,7 +32,7 @@ sistēmas prasības,
|
||||
programmatūras prasību specifikācija,
|
||||
Bevy,
|
||||
ECS,
|
||||
papilspējas.
|
||||
papildspējas.
|
||||
|
||||
|
||||
#text(
|
||||
@ -46,16 +46,7 @@ papilspējas.
|
||||
numbering: none,
|
||||
"Abstract",
|
||||
)
|
||||
#align(
|
||||
center,
|
||||
heading(
|
||||
level: 2,
|
||||
outlined: false,
|
||||
numbering: none,
|
||||
text(13pt, "Game development using Bevy game engine"),
|
||||
),
|
||||
)
|
||||
The qualification work includes the game "Maze Ascension", which offers
|
||||
The qualification work "Game development using Bevy game engine" includes the game "Maze Ascension", which offers
|
||||
players the challenge to pass through procedurally generated hexagons
|
||||
mazes. The game is built using the Rust programming language and Bevy
|
||||
game engine.
|
||||
@ -74,7 +65,7 @@ papilspējas.
|
||||
[*Keywords:*],
|
||||
)
|
||||
Maze,
|
||||
comtuper game,
|
||||
computer game,
|
||||
system requirements,
|
||||
software requirements specification,
|
||||
Bevy,
|
||||
|
||||
@ -5,10 +5,14 @@
|
||||
#set figure(kind: "attachment", supplement: "pielikums")
|
||||
|
||||
#figure(
|
||||
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
|
||||
image("../assets/images/tests/hexlab-full.png", height: 90%),
|
||||
) <tests-hexlab-full>
|
||||
caption: [Clippy rīka rezultāts "hexlab" bibliotēkai],
|
||||
image("../assets/images/clippy/hexlab.png"),
|
||||
) <clippy-hexlab>
|
||||
|
||||
#figure(
|
||||
caption: [Clippy rīka rezultāts "Maze Ascension" spēlei],
|
||||
image("../assets/images/clippy/maze-ascension.png"),
|
||||
) <clippy-maze-ascension>
|
||||
|
||||
#figure(
|
||||
caption: [Tarpaulin rīka rezultāts "hexlab" bibliotēkai],
|
||||
@ -25,3 +29,8 @@
|
||||
caption: [Tokei rīka rezultāts "hexlab" bibliotēkai],
|
||||
image("../assets/images/tokei/hexlab.png"),
|
||||
) <tokei-hexlab>
|
||||
|
||||
#figure(
|
||||
caption: [Pilns "hexlab" bibliotēkas testu rezultāts],
|
||||
image("../assets/images/tests/hexlab-full.png", height: 90%),
|
||||
) <tests-hexlab-full>
|
||||
|
||||