Compare commits

..

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

52 changed files with 314 additions and 669 deletions

View File

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

View File

@ -11,22 +11,17 @@ on:
type: string
permissions:
contents: write
packages: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Typst
uses: typst-community/setup-typst@v3
uses: actions/checkout@v3
- name: Typst
uses: lvignoli/typst-action@main
with:
typst-version: 0.12
cache-dependency-path: requirements.typ
- name: Compile Typst files
run: |
typst compile --font-path=assets/fonts main.typ Cagulis_Kristians.Francis_kc22015.pdf
typst compile --font-path=assets/fonts documentary_page.typ reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
source_file: |
main.typ
- name: Upload PDF file
uses: actions/upload-artifact@v4
with:
@ -40,6 +35,4 @@ jobs:
if: github.ref_type == 'tag'
with:
name: "${{ github.ref_name }} — ${{ env.DATE }}"
files: |
Cagulis_Kristians.Francis_kc22015.pdf
reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
files: main.pdf

View File

@ -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 procedurāli ģenerētiem sešstūrainam
spēlētājiem izaicinājumu iziet cauri proceduāli ģenerētiem sešstūrainam
labirintiem. Spēle ir veidota, izmantojot Rust programmēšanas valodu un Bevy
spēļu dzinēju.
@ -26,13 +26,13 @@ tīmekļa versija, izmantojot WebAssembly tehnoloģiju.
first-line-indent: 0cm,
[*Atslēgvārdi:*],
)
Labirints,
Labirints
datorspēle,
sistēmas prasības,
programmatūras prasību specifikācija,
Bevy,
ECS,
papildspējas.
papilspējas.
#text(
@ -46,7 +46,16 @@ papildspējas.
numbering: none,
"Abstract",
)
The qualification work "Game development using Bevy game engine" includes the game "Maze Ascension", which offers
#align(
center,
heading(
level: 2,
outlined: false,
numbering: none,
text(13pt, "Game development using Bevy game engine"),
),
)
The qualification work includes the game "Maze Ascension", which offers
players the challenge to pass through procedurally generated hexagons
mazes. The game is built using the Rust programming language and Bevy
game engine.
@ -65,7 +74,7 @@ papildspējas.
[*Keywords:*],
)
Maze,
computer game,
comtuper game,
system requirements,
software requirements specification,
Bevy,

View File

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

View File

@ -39,6 +39,7 @@ pub(super) fn spawn_maze(
Visibility::Visible,
))
.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);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 983 B

View File

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

View File

@ -2,19 +2,19 @@
#codeblock(
[Labirinta būvētāja implementācijas piemērs],
"../assets/code/hexlab/builder.rs",
"assets/code/hexlab/builder.rs",
)
#codeblock(
[Labirinta sienu reprezentācijas piemērs],
"../assets/code/hexlab/walls.rs",
"assets/code/hexlab/walls.rs",
)
#codeblock(
[Labirinta stāvu implementācijas piemērs],
"../assets/code/maze-ascension/floor.rs",
"assets/code/maze-ascension/floor.rs",
)
#codeblock(
[Labirinta ģenerācijas implementācijas piemērs],
"../assets/code/maze-ascension/maze_generation.rs",
"assets/code/maze-ascension/maze_generation.rs",
)

View File

@ -1,55 +1,12 @@
#import "@preview/tablex:0.0.9": tablex
#import "src/layout.typ": project, indent-par
#import "src/layout.typ": indent
#set page(
margin: (
left: 30mm,
right: 20mm,
top: 20mm,
bottom: 20mm,
),
number-align: center,
paper: "a4",
)
#set text(
font: "Times New Roman",
size: 12pt,
hyphenate: auto,
lang: "lv",
region: "lv",
)
#set par(
justify: true,
leading: 1.5em,
first-line-indent: indent,
spacing: 1.5em,
)
#show heading: set block(spacing: 1.5em)
#show heading: it => {
if it.level == 1 {
pagebreak(weak: true)
text(
14pt,
align(
center,
upper(it),
),
)
} else {
text(12pt, it)
}
""
v(-1cm)
}
#import "@preview/dashy-todo:0.0.1": todo
#let vspace = 1fr
#let fill = box(width: 1fr, repeat(sym.space))
#let long-underline = underline(box(width: 1fr, repeat(sym.space)))
#set page(numbering: none)
#heading(level: 1, outlined: false, numbering: none, "Dokumentārā lapa")
#heading(numbering: none, outlined: false, "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ē,
@ -62,24 +19,25 @@ izdrukai un/vai recenzentam uzrādītajai darba versijai.
#context {
set par(
first-line-indent: 1cm,
hanging-indent: 1cm,
)
v(vspace / 2)
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~06.01.2025.*]
[Autors: *Kristiāns Francis Cagulis, kc22015 ~~\_\_.01.2025.*]
v(vspace)
[Rekomendēju darbu aizstāvēšanai\
Darba vadītājs: *Mg. dat. Jānis Iljins ~~06.01.2025.*]
Darba vadītājs: *prof. Mg. dat. Jānis Iljins ~~\_\_.01.2025.*]
v(vspace)
[Recenzents: *Artūrs Driķis*]
v(vspace)
[Darbs iesniegs *06.01.2025.*\
[Darbs iesniegs *\_\_.01.2025.*\
Kvalifikācijas darbu pārbaudījumu komisijas sekretārs (elektronisks paraksts)
]

View File

@ -19,6 +19,7 @@
date: "",
body,
) = {
set document(author: authors)
set page(
@ -32,23 +33,13 @@
paper: "a4",
)
set text(
font: (
"Times New Roman",
"New Computer Modern",
),
font: "Times New Roman",
size: 12pt,
hyphenate: auto,
lang: "lv",
region: "lv",
)
show raw: set text(
font: (
"JetBrainsMono NF",
"JetBrains Mono",
"Fira Code",
),
features: (calt: 0),
)
show raw: set text(features: (calt: 0))
show math.equation: set text(weight: 400)
@ -166,7 +157,9 @@
align(
center,
upper(text(date)),
upper(
text(date),
),
)
/* Title page config end */
@ -214,11 +207,9 @@
),
)
}
if (
it.kind in (
"i-figured-raw",
"i-figured-\"attachment\"",
)
if it.kind in (
"i-figured-raw",
"i-figured-\"attachment\"",
) {
return align(
end,
@ -256,7 +247,7 @@
let supplement_map = (
i-figured-table: "tab.",
i-figured-image: "att.",
attachment: "pielikumu",
attachment: "pielikums",
)
@ -272,12 +263,10 @@
}
let number = if kind == "attachment" {
(
numbering(
el.numbering,
..counter(figure.where(kind: kind)).at(el.location()),
) + "."
) // Only add dot for attachments
numbering(
el.numbering,
..counter(figure.where(kind: kind)).at(el.location()),
) + "." // Only add dot for attachments
} else {
numbering(
el.numbering,
@ -330,6 +319,7 @@
/* ToC config end */
// show link: set text(fill: blue.darken(20%))
// Main body

497
main.typ

File diff suppressed because it is too large Load Diff

View File

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

View File

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