Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d925fd4ce | |||
| f170000db1 | |||
| 9262f98e19 | |||
| 7f7314de81 | |||
| 4ec2ebecf0 | |||
| e1e9346adf | |||
| 09b3e38b52 | |||
| 01f37de1df | |||
| a3ac544af6 | |||
| e6a51832ab | |||
| c9d987f5b6 | |||
| bda058ff59 | |||
| 7217cd110d | |||
| e71ddd761a | |||
| a2dece79d6 | |||
| 4efbf66eb3 | |||
| 5b7d2d0e35 | |||
| 4a095f9631 | |||
| 331854ccac | |||
| fb90f28a0d | |||
| 69fae7946d | |||
| 47cdcca4cd | |||
| e16cab9182 |
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
|
||||||
19
.github/workflows/typst.yml
vendored
@ -11,17 +11,22 @@ 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: Typst
|
- name: Install Typst
|
||||||
uses: lvignoli/typst-action@main
|
uses: typst-community/setup-typst@v3
|
||||||
with:
|
with:
|
||||||
source_file: |
|
typst-version: 0.12
|
||||||
main.typ
|
cache-dependency-path: requirements.typ
|
||||||
|
- name: Compile Typst files
|
||||||
|
run: |
|
||||||
|
typst compile --font-path=assets/fonts main.typ Cagulis_Kristians.Francis_kc22015.pdf
|
||||||
|
typst compile --font-path=assets/fonts documentary_page.typ reg_lapa_Cagulis_Kristians.Francis_kc22015.pdf
|
||||||
- name: Upload PDF file
|
- name: Upload PDF file
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@ -35,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: main.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 |
@ -1,3 +1,112 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
<svg
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" style="background: transparent; background-color: transparent; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="26px" height="29px" viewBox="-0.5 -0.5 26 29"><defs/><g><g/><g><path d="M 0 13 L 22.67 13" fill="none" stroke="#000000" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 11.33 25.5 L 11.33 0.5" fill="none" stroke="#000000" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 0 25.5 L 0 13" fill="none" stroke="#000000" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/></g><g><path d="M 22.67 25.5 L 22.67 13" fill="none" stroke="#000000" style="stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/></g></g></svg>
|
version="1.1"
|
||||||
|
width="32"
|
||||||
|
height="32"
|
||||||
|
viewBox="-0.5 -0.5 32 32"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="fork.svg"
|
||||||
|
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview6"
|
||||||
|
pagecolor="#505050"
|
||||||
|
bordercolor="#ffffff"
|
||||||
|
borderopacity="1"
|
||||||
|
inkscape:showpageshadow="0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pagecheckerboard="1"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="4"
|
||||||
|
inkscape:cx="-9.25"
|
||||||
|
inkscape:cy="33.875"
|
||||||
|
inkscape:window-width="1916"
|
||||||
|
inkscape:window-height="1055"
|
||||||
|
inkscape:window-x="1920"
|
||||||
|
inkscape:window-y="21"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="g6" />
|
||||||
|
<defs
|
||||||
|
id="defs1" />
|
||||||
|
<g
|
||||||
|
id="g6"
|
||||||
|
transform="translate(0.5,-1)">
|
||||||
|
<g
|
||||||
|
id="g1" />
|
||||||
|
<g
|
||||||
|
id="g5"
|
||||||
|
transform="matrix(1,0,0,1.28,-7.67,-18.7)">
|
||||||
|
<path
|
||||||
|
d="M 22.67,27.5 V 15"
|
||||||
|
fill="none"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
pointer-events="stroke"
|
||||||
|
id="path4" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g7"
|
||||||
|
transform="matrix(1,0,0,1.28,-22.67,-2.7)">
|
||||||
|
<path
|
||||||
|
d="M 22.67,27.5 V 15"
|
||||||
|
fill="none"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
pointer-events="stroke"
|
||||||
|
id="path6" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g8"
|
||||||
|
transform="matrix(1,0,0,1.28,-7.67,-2.7)">
|
||||||
|
<path
|
||||||
|
d="M 22.67,27.5 V 15"
|
||||||
|
fill="none"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
pointer-events="stroke"
|
||||||
|
id="path7" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g9"
|
||||||
|
transform="matrix(0,1,-1.28,0,34.2,-6.17)">
|
||||||
|
<path
|
||||||
|
d="M 22.67,27.5 V 15"
|
||||||
|
fill="none"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
pointer-events="stroke"
|
||||||
|
id="path8" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g10"
|
||||||
|
transform="matrix(0,1,-1.28,0,50.2,-6.17)">
|
||||||
|
<path
|
||||||
|
d="M 22.67,27.5 V 15"
|
||||||
|
fill="none"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
pointer-events="stroke"
|
||||||
|
id="path9" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g11"
|
||||||
|
transform="matrix(1,0,0,1.28,7.33,-2.7)">
|
||||||
|
<path
|
||||||
|
d="M 22.67,27.5 V 15"
|
||||||
|
fill="none"
|
||||||
|
stroke="#000000"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-miterlimit="10"
|
||||||
|
pointer-events="stroke"
|
||||||
|
id="path10" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.7 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,12 +1,55 @@
|
|||||||
#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": 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)
|
||||||
|
}
|
||||||
|
|
||||||
#let vspace = 1fr
|
#let vspace = 1fr
|
||||||
#let fill = box(width: 1fr, repeat(sym.space))
|
#let fill = box(width: 1fr, repeat(sym.space))
|
||||||
#let long-underline = underline(box(width: 1fr, repeat(sym.space)))
|
#let long-underline = underline(box(width: 1fr, repeat(sym.space)))
|
||||||
#set page(numbering: none)
|
#set page(numbering: none)
|
||||||
|
|
||||||
#heading(numbering: none, outlined: false, "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ē,
|
||||||
@ -19,25 +62,24 @@ izdrukai un/vai recenzentam uzrādītajai darba versijai.
|
|||||||
|
|
||||||
|
|
||||||
#context {
|
#context {
|
||||||
|
|
||||||
set par(
|
set par(
|
||||||
first-line-indent: 1cm,
|
first-line-indent: 1cm,
|
||||||
hanging-indent: 1cm,
|
hanging-indent: 1cm,
|
||||||
)
|
)
|
||||||
|
|
||||||
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)
|
||||||
]
|
]
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
@ -26,13 +26,13 @@ tīmekļa versija, izmantojot WebAssembly tehnoloģiju.
|
|||||||
first-line-indent: 0cm,
|
first-line-indent: 0cm,
|
||||||
[*Atslēgvārdi:*],
|
[*Atslēgvārdi:*],
|
||||||
)
|
)
|
||||||
Labirints
|
Labirints,
|
||||||
datorspēle,
|
datorspēle,
|
||||||
sistēmas prasības,
|
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,23 +5,32 @@
|
|||||||
#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],
|
||||||
image("assets/images/tests/tarpaulin/hexlab.png"),
|
image("../assets/images/tests/tarpaulin/hexlab.png"),
|
||||||
) <tarpaulin-hexlab>
|
) <tarpaulin-hexlab>
|
||||||
|
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
caption: [Tokei rīka rezultāts "Maze Ascension" spēlei],
|
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>
|
) <tokei-maze-ascension>
|
||||||
|
|
||||||
#figure(
|
#figure(
|
||||||
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>
|
||||||
@ -2,19 +2,19 @@
|
|||||||
|
|
||||||
#codeblock(
|
#codeblock(
|
||||||
[Labirinta būvētāja implementācijas piemērs],
|
[Labirinta būvētāja implementācijas piemērs],
|
||||||
"assets/code/hexlab/builder.rs",
|
"../assets/code/hexlab/builder.rs",
|
||||||
)
|
)
|
||||||
#codeblock(
|
#codeblock(
|
||||||
[Labirinta sienu reprezentācijas piemērs],
|
[Labirinta sienu reprezentācijas piemērs],
|
||||||
"assets/code/hexlab/walls.rs",
|
"../assets/code/hexlab/walls.rs",
|
||||||
)
|
)
|
||||||
|
|
||||||
#codeblock(
|
#codeblock(
|
||||||
[Labirinta stāvu implementācijas piemērs],
|
[Labirinta stāvu implementācijas piemērs],
|
||||||
"assets/code/maze-ascension/floor.rs",
|
"../assets/code/maze-ascension/floor.rs",
|
||||||
)
|
)
|
||||||
|
|
||||||
#codeblock(
|
#codeblock(
|
||||||
[Labirinta ģenerācijas implementācijas piemērs],
|
[Labirinta ģenerācijas implementācijas piemērs],
|
||||||
"assets/code/maze-ascension/maze_generation.rs",
|
"../assets/code/maze-ascension/maze_generation.rs",
|
||||||
)
|
)
|
||||||
@ -19,7 +19,6 @@
|
|||||||
date: "",
|
date: "",
|
||||||
body,
|
body,
|
||||||
) = {
|
) = {
|
||||||
|
|
||||||
set document(author: authors)
|
set document(author: authors)
|
||||||
|
|
||||||
set page(
|
set page(
|
||||||
@ -33,13 +32,23 @@
|
|||||||
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(features: (calt: 0))
|
show raw: set text(
|
||||||
|
font: (
|
||||||
|
"JetBrainsMono NF",
|
||||||
|
"JetBrains Mono",
|
||||||
|
"Fira Code",
|
||||||
|
),
|
||||||
|
features: (calt: 0),
|
||||||
|
)
|
||||||
|
|
||||||
show math.equation: set text(weight: 400)
|
show math.equation: set text(weight: 400)
|
||||||
|
|
||||||
@ -157,9 +166,7 @@
|
|||||||
|
|
||||||
align(
|
align(
|
||||||
center,
|
center,
|
||||||
upper(
|
upper(text(date)),
|
||||||
text(date),
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
/* Title page config end */
|
/* Title page config end */
|
||||||
|
|
||||||
@ -207,9 +214,11 @@
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if it.kind in (
|
if (
|
||||||
|
it.kind in (
|
||||||
"i-figured-raw",
|
"i-figured-raw",
|
||||||
"i-figured-\"attachment\"",
|
"i-figured-\"attachment\"",
|
||||||
|
)
|
||||||
) {
|
) {
|
||||||
return align(
|
return align(
|
||||||
end,
|
end,
|
||||||
@ -247,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",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -263,10 +272,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
let number = if kind == "attachment" {
|
let number = if kind == "attachment" {
|
||||||
|
(
|
||||||
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(
|
||||||
el.numbering,
|
el.numbering,
|
||||||
@ -319,7 +330,6 @@
|
|||||||
/* ToC config end */
|
/* ToC config end */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// show link: set text(fill: blue.darken(20%))
|
// show link: set text(fill: blue.darken(20%))
|
||||||
|
|
||||||
// Main body
|
// Main body
|
||||||