• Rezultati Niso Bili Najdeni

RazvojraˇcunalniˇskeigrevpogonuGodot MartinEkarFidermuc

N/A
N/A
Protected

Academic year: 2022

Share "RazvojraˇcunalniˇskeigrevpogonuGodot MartinEkarFidermuc"

Copied!
52
0
0

Celotno besedilo

(1)

Univerza v Ljubljani

Fakulteta za raˇ cunalniˇ stvo in informatiko

Martin Ekar Fidermuc

Razvoj raˇ cunalniˇ ske igre v pogonu Godot

DIPLOMSKO DELO

VISOKOˇSOLSKI STROKOVNI ˇSTUDIJSKI PROGRAM PRVE STOPNJE

RA ˇCUNALNIˇSTVO IN INFORMATIKA

Mentor : doc. dr. Aleˇs Jakliˇc

Ljubljana, 2021

(2)

Copyright. Rezultati diplomske naloge so intelektualna lastnina avtorja in matiˇcne fakultete Univerze v Ljubljani. Za objavo in koriˇsˇcenje rezul- tatov diplomske naloge je potrebno pisno privoljenje avtorja, fakultete ter mentorja.

Besedilo je oblikovano z urejevalnikom besedil LATEX.

(3)

Kandidat: Martin Ekar Fidermuc

Naslov: Razvoj raˇcunalniˇske igre v pogonu Godot

Vrsta naloge: Diplomska naloga na visokoˇsolskem strokovnem programu prve stopnje Raˇcunalniˇstvo in informatika

Mentor: doc. dr. Aleˇs Jakliˇc

Opis:

Opiˇsite in ovrednotite razvojni proces raˇcunalniˇske igre z odprtokodnim orod- jem in pogonom Godot. Kot ˇstudijski primer si izberite igro z dvodimenzio- nalno raˇcunalniˇsko grafiko in zvoˇcnimi efekti. Igro umestite v ustrezen ˇzanr, ki ga kratko opiˇsite. Za ciljni platformi izberite operacijska sistema MS Win- dows za namizne raˇcunalnike in Android za mobilne naprave.

Title: Video game development using the Godot engine Description:

Describe and evaluate the development process of a computer video game with an open-source development tool and engine Godot. As a case study select a game with two-dimensional graphics and sound effects. Briefly de- scribe the genre of the game. As target operating systems select MS Windows for desktop computers and Android for mobile devices.

(4)
(5)

Zahvaljujem se mentorju doc. dr. Aleˇsu Jakliˇcu za usmerjanje pri nastanku diplomskega dela.

(6)
(7)

Kazalo

Povzetek Abstract

1 Uvod 1

2 Platformer 3

3 Igralni pogoni 7

4 Godot 9

4.1 Struktura projekta . . . 11

4.2 Programiranje v Godotu . . . 12

5 Lastno delo 15 5.1 Teren . . . 15

5.2 Igralec . . . 16

5.3 Nasprotniki . . . 20

5.4 Pasti in ostale nevarnosti . . . 23

5.5 Predmeti . . . 24

5.6 Uporabniˇski vmesnik . . . 25

5.7 Zvok . . . 29

5.8 Shranjevanje igre . . . 30

5.9 Izvoz igre . . . 32

(8)

6 Sklepne ugotovitve 35

Literatura 37

(9)

Seznam uporabljenih kratic

kratica angleˇsko slovensko

CPU central processing unit procesor

GPU graphics processing unit grafiˇcna procesna enota

API Application Programming Interface aplikacijski programski vme- snik

UE Unreal Engine /

APK Android application package /

(10)
(11)

Povzetek

Naslov: Razvoj raˇcunalniˇske igre v pogonu Godot Avtor: Martin Ekar Fidermuc

Cilj diplomske naloge je spoznati igralni pogon Godot ter v njem z orodji, ki jih ponuja pogon, razviti raˇcunalniˇsko igro. Naloga najprej predstavi zaˇcetke izbranega ˇzanra igre in njegove znaˇcilnosti. Nato sledi predstavitev igral- nih pogonov, njihove zgodovine, sestave in namena. V tretjem delu prikaˇze igralni pogon Godot, delovanje podsistemov pogona, organizacijo projekta in programiranje v njem. Glavni del diplome opisuje razvoj raˇcunalniˇske igre.

Ta prikaˇze sestavo konˇcne igre, ki sem jo razvil med pisanjem. Predstavljeni so sestavni deli igre in njihova implementacija. Na koncu naloga opiˇse ˇse izvoz igre za platformi Windows in Android.

Kljuˇcne besede: Godot, raˇcunalniˇska igra, pogon za igre, razvoj igre.

(12)
(13)

Abstract

Title: Computer game development in the Godot game engine Author: Martin Ekar Fidermuc

The purpose of this diploma is learning to use the Godot game engine and developing a computer game, using its tools. The first part explains the chosen game genre, when it first appeared and its characteristics. Afterwards we look at game engines in general, how they developed through time, the systems that comprise them and their purpose. In the next part we look at the Godot game engine, how some of its core systems work, how it organizes projects and how we can program in it. The main part shows the process of creating our own game. Its structure, what components were used and how they work. Finally, we look at the steps to export our game to the Windows and Android platform.

Keywords: Godot, computer game, game engine, game development.

(14)
(15)

Poglavje 1 Uvod

Video igre so se prviˇc pojavile v zgodnjih petdesetih letih prejˇsnjega stoletja.

Na zaˇcetku so bile uporabljene za raziskovalne namene na podroˇcju programi- ranja, algoritmov in interakcije med ˇclovekom in raˇcunalnikom. V zgodnjih sedemdesetih letih pa so igre poˇcasi prodrle na komercialni trg, s ˇcimer se je zaˇcel razvoj industrije iger. Spoˇcetka je bil proces ustvarjanja igre zapleten.

Razvijalec je moral razumeti, kako deluje sistem, na katerem bo igra tekla.

Cez ˇcas so se z napredkom bolj zmogljivih komponent in poslediˇcno boljˇsihˇ raˇcunalnikov pojavili prvi zametki igralnih pogonov. Vˇcasih so bila to le je- dra kode iger, na katere so razvijalci nato dodajali svoje teksture, modele in ostale sestavne dele. Kasneje so ti postali samostojna programska oprema, ki zdruˇzuje kopico orodij za pospeˇsen razvoj raˇcunalniˇskih iger. Danes je na spletu velika izbira tako plaˇcljivih kot brezplaˇcnih pogonov. V diplomski na- logi bom pobliˇzje predstavil pogon Godot ter sestavo igre, ki sem jo z njegovo pomoˇcjo ustvaril.

1

(16)

2 Martin Ekar Fidermuc

(17)

Poglavje 2 Platformer

Platformer [5, 15] (ploˇsˇcadna igra) je eden od ˇzanrov video iger in podzvrst akcijskih iger. Zaˇcetki platformerjev segajo v leto 1981, ko je japonsko podje- tje Nintendo izdalo igro Donkey Kong (Slika 2.1). Igralec se je moral povzpeti na vrh stopnje, med tem pa se izmikati sodom, ki se kotalijo po klanˇcinah.

Znaˇcilno je, da se igralec proti cilju premika preko ploˇsˇcadi, med tem pa pre- maguje nasprotnike in ovire. Najpogosteje lahko v tem ˇzanru igralec teˇce, skaˇce, napada in pleza. Od naˇstetih interakcij se skakanje smatra kot kljuˇcno za ta ˇzanr in se deli na fiksno (commited) in spremenljivo (variable). Pri prvem je viˇsina skoka fiksna in se ne spreminja, pri drugem pa lahko, na primer, s sprostitvijo tipke za skok tega predhodno prekinemo in zmanjˇsamo viˇsino skoka. Stopnje platformerja najpogosteje sestavljajo nasprotniki, ovire in pasti ter predmeti, ki jih igralec lahko pobere. Igra je sestavljena iz veˇc stopenj, ki si sledijo linearno ali nelinearno (Slika 2.2). ˇZanr je kompatibilen z 2D in 3D (Slika 2.3) grafiko, pri tem pa je popularnost 3D platformerjev skozi ˇcas nekoliko upadla.

3

(18)

4 Martin Ekar Fidermuc

Slika 2.1: Igra Donkey Kong (1981), pojmovana kot prvi platformer.

(19)

Diplomska naloga 5

Slika 2.2: Nelinearni svet igre Blasphemous(2019) je razdeljen na mnogo manjˇsih sob/stopenj.

Slika 2.3: 3D platformer Rayman 3 (2003) razvijalcev Ubisoft.

(20)

6 Martin Ekar Fidermuc

(21)

Poglavje 3

Igralni pogoni

Pred nastankom igralnih pogonov so imeli razvijalci iger le moˇznosti, ki jih je ponujal izhodiˇsˇcni sistem. Nastajale so od temeljev raˇcunalniˇskih siste- mov navzgor, saj je bilo treba zaradi omejitev takratnih komponent dobro izkoristiti vsak razpoloˇzljiv vir. Z razvojem boljˇse in bolj zmogljive opreme v osemdesetih letih, so se pojavili prvi zametki igralnih pogonov [2]. Sku- pina razvijalcev, ki jo je vodil Shigeru Miyamoto, je leta 1984 v podjetju Nintendo razvila

”smooth side-scrolling“ pogon za igro Excitebike. Isti po- gon so leto kasneje uporabili za eno najbolj znanih iger v zgodovini, Super Mario Bros. Pogoni zunanjih razvijalcev (third-party) so bili do uveljavitve 3D iger redkost. Primer tega sta Garry Kitchen’s GameMaker in Adventure Construction Set. Izraz

”game engine“ se je pojavil v sredini devetdesetih let prejˇsnjega stoletja. Razvijalci so zaˇceli kupovati licence za jedra program- ske opreme, na katerih so gradili svoje igre. Dva od najbolj prepoznavnih zgodnjih pogonov sta Unreal Engine in id Tech 3. Danes je z vse veˇcjo po- pularnostjo video iger nastala obilica igralnih pogonov in ogrodij (Slika 3.1), tako brezplaˇcnih kot plaˇcljivih. Razvijalci lahko izberejo pogon, katerega funkcionalnosti najboj ustrezajo vrsti igre, ki jo hoˇcejo razviti.

7

(22)

8 Martin Ekar Fidermuc

Slika 3.1: Nekaj danes najbolj znanih pogonov in ogrodij za izdelavo iger.

Igralni pogon [2] je programska oprema z uporabniˇskim vmesnikom, ki ponuja nabor orodij za hitrejˇsi in laˇzji razvoj iger. Najpogosteje ga sestavljajo urejevalnik kode, grafiˇcni pogon, fizikalni pogon ter sistemi za zvok, umetno inteligenco, optimizacijo itd. Taka organizacija omogoˇca krajˇsi ˇcas razvoja s prilagajanjem in ponovno uporabo obstojeˇce kode in elementov. Igralni pogoni omogoˇcajo nivo abstrakcije, s ˇcimer poskrbijo, da se razvijalec lahko bolj posveti implementaciji mehanik igre kot prilagajanju kode za doloˇceno platformo. Razvijalec igro spiˇse v enem od jezikov, ki jih podpira pogon.

Ta kodo nato prevede v jezik, ki lahko teˇce na razliˇcnih platformah. Kode zaradi tega pogosto ni potrebno veliko spremeniti, ˇce ˇzelimo igro distribuirati na veˇc razliˇcnih sistemih.

(23)

Poglavje 4 Godot

Slika 4.1: Igralni pogon Godot.

Godot [13] je odprtokodni igralni pogon, narejen za izdelavo 2D in 3D iger, izdan leta 2014 pod MIT licenco. Razvila sta ga argentinska razvijalca Juan Linietsky in Ariel Manzur. Pogon lahko naloˇzimo na Microsoft Windows, macOS, Linux in BSD. Z njim lahko razvijamo igre za [12] vse ˇze omenjene operacijske sisteme, iOS, Android, VR sisteme, kot so HTC Vive in Valve Index ter nekatere konzole. Kljub temu, da je pogon v primerjavi z ostalimi relativno nov, ga mnogi ˇze primerjajo z Unityjem in Unreal Enginom. Pred- nosti Godota so odprtokodnost, brezplaˇcnost, jasen uporabniˇski vmesnik ter

9

(24)

10 Martin Ekar Fidermuc velikost pogona, ki trenutno zavzame le okoli 70 megabajtov prostora na di- sku. Za uˇcenje je na voljo uradna dokumentacija [11], ki pogosto vkljuˇcuje praktiˇcne primere, poleg tega je tu ˇse veliko ˇstevilo pisnih in video virov, ki jih ustvarja spletna skupnost. Uporabniˇski vmesnik (Slika 4.2) je pre- prost. Levi stolpec vkljuˇcuje okno za pregled projekta v datoteˇcnem sistemu ter okno za pregled strukture trenutno izbrane scene in nastavitev za uvoz virov. V spodnji vrstici je okno za izpis konzole, razhroˇsˇcevanje, zvok in ani- macije. Desni stolpec ponuja pregled vrednosti, signalov in skupin trenutno izbranega vozliˇsˇca. Godotov Asset Library se po trenutni ponudbi virov ne more primerjati z Unityjevim Asset Storom ali UE Marketplacom. Oba sta aktivna ˇze dolgo ˇcasa in imata temu primerno veˇcji nabor sredstev.

Za izris Godot trenutno uporablja API OpenGL ES [7] (OpenGL for Em- bedded Systems). Podprti sta verziji GLES3 in GLES2. Ena veˇcjih razlik med njima je, da GLES2 ne podpira sistema delcev z uporabo grafiˇcne kar- tice, kar pomeni, da moramo v projektu uporabljati CPUParticles ali CPU- Particles2D. Verzija pogona 4.0 ne bo veˇc podpirala GLES2, bo pa pridobila podporo za Vulkan [8, 6], ki temelji na AMDjevem Mantle APIju. Vulkan je nizkonivojski, veˇcplatformni API za izris 3D grafike. Glavni cilj Vulkana je bistvena izbojˇsava zmogljivosti v primerjavi z OpenGL. Ponuja manjˇsi preseˇzek (overhead), boljˇsi nadzor GPUja in niˇzjo obremenitev procesorja.

Prav tako zdruˇzuje API za mobilne in stacionarne naprave v primerjavi z OpenGL [10], ki se deli na OpenGL in OpenGL ES. Boljˇsa bo tudi uporaba veˇcjedrnih procesorjev, saj je bil OpenGL v osnovi razvit za procesorje z enim jedrom.

Godot za 2D uporablja lasten fizikalni pogon, za 3D pa uporablja odprto- kodni pogon Bullet [1]. Slednji omogoˇca zvezno in diskretno detekcijo kolizij ter simuliranje mehkih in togih teles. V razvoju je ˇze naslednja razliˇcica Go- dot Physics [14] pogona, ki bo izboljˇsal 2D fiziko in poleg Bulleta ponudil ˇse lastno implementacijo 3D fizike.

(25)

Diplomska naloga 11

Slika 4.2: Uporabniˇski vmesnik.

4.1 Struktura projekta

Arhitektura pogona je osnovana na konceptu drevesa z vozliˇsˇci oziroma gra- dniki. Za bolj pregleden projekt lahko skupino gradnikov shranimo kot sceno.

Ta je po namenu uporabe ekvivalenta razredu v veˇcini jezikov. Omogoˇca dedovanje in instanciranje. Recimo, da bi hoteli v stopnji igre imeti 5 na- sprotnikov. Naredili bi sceno nasprotnika in jo petkrat instancirali. V kolikor bi nato hoteli imeti ˇse nasprotnike z razliˇcnimi lastnostmi, bi naredili nove scene, ki dedujejo iz prvotne ter le tem posamiˇcno spremenili vrednosti. Po- membni gradniki v projektu so:

❼ KinematicBody2D – za implementacijo teles, ki jih premikamo s kodo.

Uporabljajo ga igralec in nasprotniki.

❼ RigidBody2D – simulira telo s fiziko. Doloˇcimo mu lahko maso, hitrost, material in naˇcin preverjanja trkov. ˇCe ˇzelimo vplivati na pozicijo nepo- sredno v kodi, to naredimo s spremembo metode_integrate_forces().

❼ AnimatedSprite – vsebuje animacije lika in omogoˇca predvajanje.

(26)

12 Martin Ekar Fidermuc

❼ CollisionShape2D – gradnik za zaznavanje trkov. Lahko je geometrijski ali poljuben lik.

❼ AnimationPlayer – eden najbolj uporabnih gradnikov pogona. Omogoˇca povezovanje animacij, funkcij, zvoka, transformacij in metod.

❼ RayCast2D – gradnik za detekcijo presekov z ˇzarkom.

❼ CanvasLayer – vanj dodajamo elemente za uporabniˇski vmesnik. Nima veliko lastnosti, bolj pomembni so gradniki, ki mu jih dodamo.

❼ Tween – interpolira med dvema vrednostima lastnosti gradnika. Pogo- sto uporabljen za prehode v grafiˇcnem vmesniku.

❼ AudioStreamPlayer in AudioStreamPlayer2D – uporabljata se za pred- vajanje zvokov in glasbe. Drugi predvaja prostorski zvok.

4.2 Programiranje v Godotu

Godot ima lasten skriptni jezik, imenovan GDScript, ki je sintaktiˇcno zelo podoben Pythonu, kar omogoˇca hitro in preprosto pisanje kode. Vsakemu gradniku lahko pripnemo lastno skripto ter tako spreminjamo njegovo delo- vanje. Skripte lahko piˇsemo kar v pogonu, saj ima ta ˇze vgrajen urejevalnik.

Dve najpomembneˇsji metodi v Godotu sta process(delta)in physics process(delta). Obe metodi prejmeta spremenljivko delta, ki predstavlja pretekli ˇcas med prejˇsnjim in trenutnim izrisom slike. Metoda process()se izvede ˇcim hitreje ob vsakem izrisu slike pri ˇcemerdelta ni nujno konstantna.

Te metode zato ne uporabljamo za preverjanje trkov, saj ne dobimo zane- sljivih podatkov o pozicijah objektov. Metoda physics process() se kliˇce ob izraˇcunu fizike v igri. Ta je sinhroniziran s ˇstevilom sliˇcic na sekundo, kar poskrbi, da jedelta naˇceloma konstantna. V skripto lahko vkljuˇcimo obe metodi, ni pa nujno.

Pri programiranju v Godotu sta pomembna ˇse sistema signalov in skupin.

Delujeta po vzorcu opazovalca. Poleg ˇze vgrajenih lahko v skriptah kreiramo

(27)

Diplomska naloga 13 lastne signale z deklaracijo spremenljivke signal moj signal. Proˇzimo jih z metodo emit signal("moj signal"). Skupine se uporabljajo za organi- zacijo gradnikov v smiselne enote, doloˇcimo jih lahko v kodi ali z grafiˇcnim vmesnikom. S funkcijo call group("ime skupine", "ime metode") nato kliˇcemo v skupini obstojeˇce metode. Pogon poleg GDScripta v osnovi omogoˇca tudi razvoj v jeziku C# 8.0 z uporabo ogrodja Mono in za C++. Progra- miranja manj veˇsˇci uporabniki lahko igre ustvarijo z uporabo vizualnega skriptiranja, kjer se igro implementira s pomoˇcjo blokov in povezav. Od- prtokodnost Godota ter njegova GDNative knjiˇznica omogoˇcata, da lahko kdorkoli doda podporo tudi za kakˇsen drug jezik. Trenutno so s pomoˇcjo skupnosti podprti ˇse Kotlin, Nim, D, Rust in Python.

Slika 4.3: Primer vizualnega skriptiranja v Godotu.

(28)

14 Martin Ekar Fidermuc

4.2.1 GDScript

GDScript je visokonivojski dinamiˇcen skriptni jezik, ki je sintaktiˇcno po- doben Pythonu. Za boljˇso primerjavo poglejmo implementacijo funkcije za izraˇcun n-tega ˇstevila v fibonaccijevem zaporedju.

Godot

func _ready():

print(fib_recursion(4))

func fib_recursion(n):

if n <= 1:

return n else:

return(fib_recursion(n-1) + fib_recursion(n-2))

Python

def Fibonacci(n):

if n <= 1:

return n

else:

return Fibonacci(n - 1) + Fibonacci(n - 2)

print(Fibonacci(4))

Jezik je optimiziran za Godotovo strukturo projekta s scenami. Omogoˇca dinamiˇcno in statiˇcno tipizacijo. Skripto lahko spremenimo v razred, z de- klariranjem imena na zaˇcetku.

class_name MyClass, "res://path/to/icon.svg"

(29)

Poglavje 5 Lastno delo

Glavni cilj diplomske naloge je bila izdelava igre v pogonu Godot. Na zaˇcetku sem izbral ˇzanr ter poiskal za igro primerna sredstva. Teksture za igro sem pridobil na spletni strani itch.io [9], ki distribuira tako video igre kot teksture, glasbo in ostala sredstva za razvoj iger. Pogosto organizira tekmovanja, na katerih razvijalci poskuˇsajo razviti igro v doloˇcenem ˇcasu. Izbira tekstur je velika in vkljuˇcuje brezplaˇcna in plaˇcljiva sredstva. Zvoˇcne efekte sem poiskal na spletni strani freesound.org [4], glasbo pa na freemusicarchive.org [3]. Za platformer ˇzanr sem se odloˇcil, ker menim, da ta vkljuˇcuje veliko razliˇcnih sistemov ter tako dobro prikaˇze delovanje in uporabo pogona Godot.

5.1 Teren

Razvoj sem zaˇcel z implementacijo terena ter osnovnega igralca, ki omogoˇca premikanje. Teren je narejen z uporabo Godotovega gradnikaTileMap. Naj- prej mu podamo teksturo terena. Preden zaˇcnemo z razrezom v sestavne dele, je potrebno nastaviti vrednostCell Size, ki doloˇca velikost posamezne enote terena. Po tem lahko zaˇcnemo z doloˇcanjem oblike za detekcijo trkov.

Za laˇzje postavljanje terena sem nastavil lastnostTile Mode naAuto Tile. To nam omogoˇca, da teren postavljamo hitreje ter v veˇcjih delih. Za pravilno iz- biro izgleda terena poskrbi pogon, pred tem pa moramo za teksturo nastaviti

15

(30)

16 Martin Ekar Fidermuc lastnost Bitmask ter TileMapu nastaviti ˇse Autotile Bitmask mode na 3x3 (minimal) (Slika 5.1). Bitmask doloˇca, katero teksturo bo izbral AutoTile glede na sosednja polja.

Slika 5.1: Nastavljanje lastnosti Bitmask za teksturo terena.

5.2 Igralec

Igralec je ena bolj kompleksnih scen v projektu, saj vkljuˇcuje veˇc razliˇcnih gradnikov (Slika 5.2) in ima zaradi vse potrebne logike obseˇzno skripto.

Osnova je KinematicBody2D, ki sluˇzi kot koren scene igralca in v osnovi poskrbi le za detekcijo trkov. V drevo scene moramo obvezno dodati ˇse trkal- nik CollisionShape2D. Premikanje in gravitacijo sem implementiral znotraj ˇze omenjene metode physics process(), ki poskrbi, da se detekcija izvaja ob rednih intervalih, s ˇcimer prepreˇci, da bi igralec stopil skozi steno ali padel pod teren. Smeri in hitrosti gibanja se igralcu ne nastavlja direktno, temveˇc je treba vektor hitrosti gibanja podati metodi move and slide(), ki poleg tega potrebuje ˇse vektor up direction. Ta doloˇca, katere povrˇsine se treti- rajo kot tla, stene in strop. V naˇsem primeru je vrednost nastavljena na (0, -1).

(31)

Diplomska naloga 17

Slika 5.2: Drevesna sestava scene igralca.

(32)

18 Martin Ekar Fidermuc Animacije in grafiˇcni lik so implementirani z uporabo gradnika Anima- tedSprite (Slika 5.3). Temu podamo prazno strukturo SpriteFrames, v ka- tero dodamo sliˇcice za animacijo. Dodajanje animacij je preprosto. Najprej v datoteˇcnem sistemu projekta spodaj levo poiˇsˇcemo sliˇcice za animacijo, jih izberemo ter jih potegnemo v polje Animation Frames. Nujno moramo obkljukati lastnost Playing, sicer se animacija ne predvaja. Sedaj lahko ani- maciji doloˇcamo hitrost predvajanja, jo zrcalimo itd. Koda za predvajanje veˇcine animacij igralca je sledeˇca:

func _on_Player_animate(motion, on_floor, isDead, animAffix):

if !on_floor:

if motion.y < 0:

play("jump" + animAffix) elif motion.y > 0:

play("fall" + animAffix) elif abs(motion.x) > 0.1:

play("run" + animAffix) else:

play("idle" + animAffix)

if isDead:

play("dead")

(33)

Diplomska naloga 19

Slika 5.3: Elementi vmesnika za dodajanje animacij v AnimatedSprite.

Za detekcijo napadov ima igralec tri gradnike tipa Area2D, ki tako kot KinematicBody2D potrebujejo ˇse CollisionShape2D. Napade se detektira z uporabo signala on AttackArea body entered, ki je vezan na istoimensko metodo v skripti gradnikaArea2D. Ob prekrivanju detekcijskega lika z nekim telesom bo skripta poskusila poklicati metodo hurt() tega telesa.

Poleg osnovnih napadov ima igralec ˇse moˇznost metanja meˇca. Met se zaˇcne v toˇcki, ki jo doloˇca gradnikThrowPoint tipa Position2D. Ob pritisku na gumb se v drevo kot otrok vozliˇsˇcaThrowPoint doda scena Sword, kateri nastavimo globalno pozicijo in vektor hitrosti. Koren scene meˇca je Rigid- Body2D, ki se uporablja za simuliranje telesa s fiziko. Med letenjem bo meˇc preverjal kolizije s terenom in nasprotniki. Ob trku se bitna maska za detekcijo spremeni tako, da namesto nasprotnikov zaznava igralca. Ko meˇc zazna kolizijo z igralcem, ga ta pobere.

GradnikUI je tipaCanvasLayer in hrani gumbe tipaTouchScreenButton za nadzor igre na telefonu.

AnimationPlayersluˇzi za prikaz imunosti igralca po tem, ko se ta poˇskoduje.

Ob zakljuˇcku animacije igralec ni veˇc imun na napade nasprotnikov.

(34)

20 Martin Ekar Fidermuc Camera2D poskrbi, da pogled v igri sledi igralcu.

Nazadnje je tu ˇse najbolj osnoven gradnik Node, ki sluˇzi kot seznam za shranjevanje AudioStreamPlayerjev. Vsak ima svoj zvok, ki se predvaja ob specifiˇcnih interakcijah, kot na primer ob napadu ali poˇskodbi.

Koliˇcina zaklada, ˇstevilo ˇzivljenj, kljuˇcev in tudi, ali ima igralec del ze- mljevida za napredovanje na naslednjo stopnjo, so shranjeni v globalni skripti PlayerVariables. Ta se inicializira ob zagonu igre in poleg hranjenja podatkov med igranjem vsebuje ˇse metodo za zapis vrednosti ob shranjevanju stopenj.

5.3 Nasprotniki

Nasprotniki so po strukturi scene zelo podobni igralcu. V igri so tri vrste nasprotnikov, Crab, Shark(Slika 5.7) in Starfish. Vsi trije dedujejo sceno in skripto Enemy(Slika 5.4), nato pa spremenijo doloˇcene dedovane metode in gradnike.

Vsi trije nasprotniki patrulirajo na enak naˇcin, vsak pa ima svojo vrsto napada. Crab detektira igralca pred in za sabo ter napada v obe smeri. Shark zazna igralca, skoˇci proti njemu ter nato napade. Starfish se proti igralcu poˇzene s pospeˇskom in se ustavi, ko zadane rob ali steno. Frekvenco napadov za Sharka in Starfisha sem omejil z uporabo Timerja, ki zaˇcne odˇstevati po zakljuˇcku animacije za napad.

Kljuˇcna razlika med sestavo igralca in nasprotnika sta dva gradnika tipa RayCast2D. DetectLedge se uporablja za detekcijo terena. Ko nasprotnik pride do roba, se spremeni vrednost DetectLedgais colliding()in naspro- tnik se obrne v drugo smer. Drugi RayCast2D se uporablja za zaznavanje igralca. Ob detekciji se proˇzi metoda detect player(), ki jo mora imple- mentirati vsak dediˇc. Prvotno sem v ta namen uporabljal Area2D, vendar pa taka implementacija ni idealna, saj bo nasprotnik igralca lahko zaznal skozi zidove.

Zadnja stopnja ima posebnega nasprotnika imenovanegaClamBoss, ki ga mora igralec premagati, da uspeˇsno zakljuˇci igro. ClamBoss ni ranljiv, dokler

(35)

Diplomska naloga 21

Slika 5.4: Elementi vmesnika za dodajanje animacij v AnimatedSprite.

nanj ne pade sod smodnika, kar naredimo tako, da z meˇcem zadanemo verigo, na kateri ta visi. Medtem bo ClamBoss igralca poskusil zadeti s streljanjem biserov.

Pri igralcu in ostalih nasprotnikih sem stanjem, kot sohurtinattacking, sledil samo v kodi, pri ClamBossu pa sem z gradnikoma AnimationPlayer in AnimationTree implementiral avtomat stanj. AnimationTree (Slika 5.6) ima vizualen urejevalnik grafa stanj, katerega vozliˇsˇca so animacije. S poveza- vami doloˇcamo naˇcin prehajanja med stanji. Puˇsˇcica pomeni smer prehoda, ˇce ima ˇse ˇcrtico, to pomeni prehod ˇsele ob zakljuˇcku animacije. Zelena obar- vanost pomeni, da se stanje lahko spremeni samostojno, brez klica v kodi.

AnimationPlayer je v osnovi preprost za uporabo, ko pa se ga bolj navadimo, nam omogoˇca izvajanje kompleksnih interakcij. ˇCasovnice lahko sledijo spre- menljivkam, sproˇzijo zvoke ob doloˇcenih sliˇcicah, kliˇcejo metode. Animati- onPlayer sem tu uporabil za sinhronizacijo zvoka in metod z animacijami ter

(36)

22 Martin Ekar Fidermuc prehajanje med stanji.

Slika 5.5: Graf stanj.

Slika 5.6: Primer animacije v AnimationPlayerju. ˇCasovnice nadzirajo klice metod, predvajanje zvoka in animacije ter spreminjajo obliko in logiko trkal- nikov.

(37)

Diplomska naloga 23

Slika 5.7: Nasprotnik Shark z vidnimi kolizijskimi ˇskatlami in ˇzarki.

5.4 Pasti in ostale nevarnosti

Za igralca sem implementiral tri razliˇcne okoljske nevarnosti: ˇspice, vodo in topove. ˇSpice in voda so funkcionalno enake. Obe nevarnosti za detek- cijo igralca uporabljata Area2D, ki ima CollisionShape2D. Ob dotiku igralec izgubi eno toˇcko ˇzivljenja. Za delujoˇc top sta potrebni dve sceni, top in to- povska krogla. Top (Slika 5.8) je v osnovi tipaStaticBody2D, ki se uporablja za statiˇcna telesa. Ta ima nato gradnikTimer s katerim doloˇcamo frekvenco streljanja. RayCast2D se uporablja za usmerjanje topovskih krogel. Te so la- stna scena tipa Node2D in imajo gradnike Sprite, AnimatedSprite in Area2D.

Ob izteku ˇstevca se na RayCast2D kot otroka doda topovsko kroglo, ki od starˇsa prejme smer gibanja. Ob trku z igralcem ali terenom ta eksplodira in igralca poˇskoduje.

Slika 5.8: Sestava scene topa.

(38)

24 Martin Ekar Fidermuc

5.5 Predmeti

Igralec lahko na stopnji najde veˇc razliˇcnih predmetov: kovance, kljuˇce, na- poje (Slika 5.9), skrinje z zakladom, del zemljevida, zastave za shranjeva- nje napredka in ˇcoln za prehod v naslednjo stopnjo. Veˇcina predmetov de- duje sceno Coin in nato prilagodi metodo on Item body entered(body), ki doloˇca, kaj se zgodi, ko igralec pobere predmet. Posebno implementa- cijo imata ˇcoln in zastava. Slednja ob dotiku igralca z uporabo gradnika Particles2D prikaˇze efekt, ki sporoˇci, da je igralec shranil svoj napredek.

❼ Kovanec – igralcu zviˇsa vrednost zaklada za 1 toˇcko.

❼ Kljuˇc – igralcu omogoˇci odpiranje zaprte skrinje. Ko to odpremo, iz- gubimo en kljuˇc.

❼ Skrinja – lahko je zaklenjena ali ne, pri ˇcemer prva vsebuje veˇcjo vre- dnost zaklada.

❼ Zemljevid – pogoj za napredovanje na naslednjo stopnjo.

❼ Napoj – igralcu povrne 1 toˇcko ˇzivljenja.

❼ Zastava – ob dotiku sproˇzi shranjevanje stopnje.

❼ Coln – pelje igralca na naslednjo stopnjo.ˇ

Od vseh naˇstetih, je po sestavi scene ˇcoln najbolj drugaˇcen. Ta je imple- mentiran z uporabo KinematicBody2D, saj se mora premikati. Ob vstopu na ˇcoln ta preveri, ali je igralec naˇsel del zemljevida. ˇCe ga je, se bo zaˇcel premikati in igra bo zamenjala stopnjo.

(39)

Diplomska naloga 25

Slika 5.9: Sestava scene napoja. Gradniki s sivimi imeni so dedovani.

5.6 Uporabniˇ ski vmesnik

Za ustvarjanje uporabniˇskih vmesnikov ima Godot gradnik tipa Interface, ki ponuja velik nabor nastavitev. Sestavljanja vmesnika se najlaˇzje lotimo z uporabo vizualnega urejevalnika ter nastavljanjem posameznih lastnosti gra- dnikov. Pomembni so razliˇcni Containerji, kot so HBoxContainer, VBoxCon- tainer in CenterContainer. Z njimi organiziramo postavitev skupin gumbov in ostalih kontrol. PauseMenu in MainMenu (Slika 5.10) sem implementiral z uporabo CenterContainerja s sliko za ozadje. Ta nato vsebuje dva VBo- xContainerja, prvega za meni, drugega za nastavitve zvoka. Gumbi so tipa Button. Za spreminjanje izgleda uporabljamo lastnost Custom Styles, kjer lahko nastavimo poljuben izgled za razliˇcna stanja gumba. Nastavitve za stil so shranjene v objektu StyleBox. Sam sem uporabil StyleBoxTexture, ki je izpeljan iz StyleBoxa, omogoˇca pa delovanje, podobno objektu NinePat- chRect. Temu podamo teksturo, ki se razdeli na 9 delov. To poskrbi, da lahko gumbe skaliramo brez raztegovanja tekstur. Drsniki za zvok so imple- mentirani z uporabo HSliderja in omogoˇcajo enako modificiranje izgleda kot gumbi.

(40)

26 Martin Ekar Fidermuc

Slika 5.10: Meni ob zagonu igre.

MainMenu se prikaˇze, ko poˇzenemo igro. Na voljo so gumbi za zaˇcetek igre, izbris trenutnega napredka, izhod in nastavitev zvoka. Gumb za izbris se vklopi, kadar igra ob zagonu zazna obstojeˇco datoteko za shranjeno igro.

PauseMenu se prikaˇze, kadar igralec med igro pritisne tipko

”Escape“ (na raˇcunalniku) ali kriˇzec desno zgoraj (na mobilni napravi). Ob tem se proˇzi sledeˇca metoda:

(41)

Diplomska naloga 27

func _unhandled_input(event):

if event.is_action_pressed("pause"):

if not _main_menu.visible:

var tree = get_tree()

tree.paused = not tree.paused if tree.paused:

_pause_menu.open() else:

_pause_menu.close()

get_tree().set_input_as_handled() #stop propagation else:

_main_menu.return()

Metoda najprej preveri, ali smo v glavnem meniju, v tem primeru nas le vrne iz nastavitev za zvok nazaj na prvotni meni. Sicer spremeni vrednost paused trenutnega SceneTreeja na true. Ta se nato prenese v vsa vozliˇsˇca in liste drevesa. Vsakemu gradniku lahko nastavimo naˇcin obnaˇsanja ob zaustavitvi glavne zanke igre. LastnostPause Mode ima na voljo nastavitve Inherited, Stop inProcess. Privzeta nastavitev je Inherited, kar pomeni, da vozliˇsˇce prevzame vrednost starˇsa, ta, od svojega starˇsa in tako naprej do korena drevesa.

Med igranjem je v levem zgornjem kotu vidna vrstica za prikaz ˇstevila ˇzivljenj igralca ter ˇstevca za kovance in kljuˇce (Slika 5.11). ˇZivljenje se prika- zuje z gradnikom TextureProgress. ˇCe bi ˇzeleli med igro spreminjat maksi- malno ˇstevilo ˇzivljenj igralca, lahko vklopimo vrednost nine patch stretch in vnesemo potrebne odmike, da pogon pravilno razreˇze dano teksturo. Za animiranje indikatorja ˇstevila ˇzivljenj se uporablja Tween.

Stevec je sestavljen iz animiranih sliˇcic in preprostih Labelov, ki izpisujejoˇ vrednost. Posodobijo se, ko igralec pobere kovanec, skrinjo ali kljuˇc.

Projekt sem kasneje poskusil izvoziti ˇse na platformo Android, zaradi ˇcesar je bilo treba dodati gumbe za nadzor na mobilni napravi (Slika 5.12). Ti so implementirani z gradniki TouchScreenButton. Za razliko od navadnega

(42)

28 Martin Ekar Fidermuc Buttona ti ne ponujajo opcije Custom Styles. Za razliˇcna stanja ima gumb v tem primeru posamiˇcne slike.

Slika 5.11: Prikaz ˇstevila ˇzivljenj, kovancev in kljuˇcev.

Slika 5.12: Kontrole na mobilni napravi.

(43)

Diplomska naloga 29

5.7 Zvok

Za predvajanje zvoka Godot ponuja sistem (Slika 5.13) zvoˇcnih vodil, ki jih lahko poljubno dodajamo. Vsakemu vodilu lahko nastavimo ime, glasnost, naˇcin predvajanja ter dodamo zvoˇcne efekte. Uporabil sem tri vodila. Ma- ster nadzira ves zvok v igri. Music je za nastavljanje glasnosti glasbe, SFX pa za glasnost zvoˇcnih efektov, kot so topovski streli. V igri lahko igralec preko uporabniˇskega vmesnika (Slika 5.14) nastavi jakost zvoka za posame- zno vodilo. Trenutno so v pogonu podprti trije formati zvoka, in sicer WAV, Ogg Vorbis in MP3. Vsak ima svoje prednosti in slabosti. WAV je najmanj stisnjen in poslediˇcno najmanj potraten za CPU. Ta format je najbolje upo- rabiti za zvoˇcne efekte, ki se velikokrat ponavljajo. Ogg Vorbis je od vseh treh najbolj stisnjen, zaradi ˇcesar je najprimernejˇsi za predvajanje dolgih zvoˇcnih posnetkov, kot je glasba. MP3 je nekakˇsen kompromis med obema in je dobra izbira pri razvoju iger za mobilne naprave in spletne brskalnike.

Efekte in glasbo predvajamo z gradnikiAudioStreamPlayer inAudioStream- Player2D.

Slika 5.13: Del grafiˇcnega vmesnika za dodajanje in spreminjanje zvoˇcnih vodil.

(44)

30 Martin Ekar Fidermuc

Slika 5.14: Nastavitve zvoka v igri.

5.8 Shranjevanje igre

Igra omogoˇca shranjevanje stanja in nastavitev. Stopnja se shrani, ko igralec pride do zastave. Najprej se inicializira prazen objekt PackedScene, ki po- skrbi za serializacijo stopnje. Na objektu se kliˇce metodo pack(), ki ji kot argument podamo koren drevesa stopnje. Ta glede na lastnost owner poiˇsˇce vsa vozliˇsˇca in liste drevesa ter jih shrani v objekt. Serializirano stopnjo nato z uporabo metodesave("user://saved level.tscn", packed scene)sin- gletona ResourceSaver shranimo v datoteˇcni sistem naprave. user:// je privzeta pot za shranjevanje nastavitev. Na operacijskem sistemu Windows

bodo naˇse datoteke shranjene vAppData/Roaming/Godot/app userdata/ime igre.

Morda bi koga zamikalo, da bi za shranjevanje uporabil kar pot do virov

(45)

Diplomska naloga 31

res://. Med razvojem bi tak pristop deloval, ko pa igro izvozimo, postanejo vse datoteke na tej poti

”read-only“.

Stanje igre se torej zapakira in shrani z uporabo objekta PackedScene.

Za nastavitve in podatke o igralcu, ki so shranjeni znotraj PlayerVariables, pa uporabimo objekt ConfigFile. Ta je po delovanju in naˇcinu shranjevanja podoben podatkovni strukturi slovar, v ozadju pa je preprosta tekstovna datoteka. Vrednosti v objekt shranimo z metodoset value(section, key, value). Spremenljivkasection doloˇca skupino, v katero se shrani podani par kljuˇca in vrednosti. Tehniˇcno bi lahko vse shranjevali v isto sekcijo, vendar bi ob velikem ˇstevilu vrednosti to postalo nepregledno. Za kreiranje cfg datoteke na koncu uporabimosave().

Slika 5.15: Format

”configuration“ datoteke.

(46)

32 Martin Ekar Fidermuc

5.9 Izvoz igre

Postopek izvoza igre za operacijski sistem Windows je preprost. V orodni vrstici desno zgoraj iz menija Project izberemo Export. Odpre se nam okno za izvoz na razliˇcne platforme. Na vrhu kliknemo na napis Add in izberemo opcijoWindows Platform. Nato na dnu okna kliknemoExport PCK/Zip, kar bo vse potrebne vire za igro zapakiralo v datoteko formata .pck ali .zip. Na koncu pritisnemo ˇse gumbExport Project, da ustvarimo.exe datoteko.

Igro smo poskusili izvoziti tudi na mobilno platformo Android. Najprej potrebujemo Android SDK, ki ga lahko dobimo z instalacijo Android Stu- dija. Temu moramo naloˇziti pakete Platform-Tools, Build-Tools, Platform 29, Command-Line Tools, CMake in NDK. Nato naloˇzimo OpenJDK. ˇCe ˇse nimamo datoteke debug.keystore, to lahko generiramo s konzolnim uka- zom v JDK. Omogoˇcala nam bo nalaganje razvojnih razliˇcic igre na mobilno napravo. Na koncu moramo v nastavitvah za izvoz (Slika 5.16) v Godotu podati pot do Android SDKja in debug.keystore datoteke. ˇCe smo naloˇzili vse potrebne komponente in pravilno nastavili vrednosti v pogonu, se bo ob priklopu android naprave na raˇcunalnik v desnem zgornjem kotu pokazala ikona Androida. S klikom nanjo naloˇzimo igro na napravo.

Ce bi aplikacijo ˇzeleli objaviti na Google Play Store, moramo zgeneriratiˇ novokeystore datoteko za podpisovanje APKjev javnih verzij igre.

(47)

Diplomska naloga 33

Slika 5.16: Nastavitve za izvoz na Android.

(48)

34 Martin Ekar Fidermuc

(49)

Poglavje 6

Sklepne ugotovitve

Za zakljuˇcek lahko reˇcem, da razvoj igre ni preprost. Najti moramo rav- novesje med teˇzavnostjo in zabavo. Video igre so kompleksen medij, saj zdruˇzujejo znanje programiranja, animacije, grafiˇcnega oblikovanja, zvoka in ˇse marsiˇcesa. Delo samostojnih razvijalcev je toliko teˇzje, ker morajo za ustvarjanje uspeˇsne igre obvladati veˇcino naˇstetih znanj.

Med izdelavo diplomske naloge sem se spoznal s pogonom Godot ter nje- govim skriptni jezikom GDScript.

Najveˇc teˇzav med razvojem sem imel z menjavanjem stanj igralca in na- sprotnikov. Ker sem se sproti uˇcil uporabe razliˇcnih gradnikov, sem stanjem sledil v kodi. Teˇzave so se pojavile, ˇce se je igralec ali nasprotnik med na- padom poˇskodoval. V veˇcini primerov je to povzroˇcilo, da sta se stanje in animacija zataknila. Problem sem odpravil s preverjanjem stanj na veˇc me- stih v kodi. Pri razvoju nasprotnika v zadnji stopnji sem se nauˇcil uporabe drevesa stanj, kar je bistveno poenostavilo sledenje in prehajanje med njimi.

Nekaj teˇzav sem imel z razumevanje delovanja doloˇcenih integriranih me- tod, kot na primer integrate forces()pri uporabi teles, na katere vpliva fizika. Metodo sem moral spremeniti pri implementiranju meˇca, ki ga vrˇze igralec, da sem lahko rotiral njegovo sliˇcico. RigidBody2D namreˇc ne dopuˇsˇca direktnega spreminjanja vrednosti, saj bi to lahko povzroˇcilo napaˇcen izraˇcun premikanja ali trkov.

35

(50)

36 Martin Ekar Fidermuc Ostale manjˇse teˇzave sem lahko razreˇsil z uporabo uradne dokumentacije in Godotovega spletnega foruma.

Konˇcni izdelek je igra, ki teˇce na Windows raˇcunalniku in Androidu.

Razvoj igre mi je bil v veselje, saj ta ni vkluˇceval le programiranja, temveˇc tudi izbiro in oblikovanje zvoˇcnih in grafiˇcnih virov.

(51)

Literatura

[1] Bullet (software). Dosegljivo: https://en.wikipedia.org/wiki/

Bullet_(software). [Dostopano: 20. 8. 2021].

[2] Game engine. Dosegljivo: https://en.wikipedia.org/wiki/Game_

engine. [Dostopano: 18. 8. 2021].

[3] Free Music Archive. Dosegljivo: https://freemusicarchive.org/

music/Origami_Repetika/the-happy-puppy-collection/shanty- of-mermaidia. [Dostopano: 24. 7. 2021].

[4] Freesound. Dosegljivo: https://freesound.org/. [Dostopano: 21. 7.

2021].

[5] Platform game. Dosegljivo: https://en.wikipedia.org/wiki/

Platform_game#History. [Dostopano: 11. 8. 2021].

[6] Vulkan (API). Dosegljivo: https://en.wikipedia.org/wiki/Vulkan_

(API). [Dostopano: 20. 8. 2021].

[7] The Khronos➤ Group Inc. 2021. OpenGL ES Overview. Dosegljivo:

https://www.khronos.org/opengles/, . [Dostopano: 20. 8. 2021].

[8] The Khronos➤ Group Inc. 2021. Vulkan. Dosegljivo: https://www.

vulkan.org/, . [Dostopano: 20. 8. 2021].

[9] Leaf Corcoran. Itch.io. Dosegljivo: https://itch.io/. [Dostopano:

12. 6. 2021].

37

(52)

38 Martin Ekar Fidermuc [10] The Khronos➤ Group Inc. OpenGL. Dosegljivo: https://www.

opengl.org/. [Dostopano: 20. 8. 2021].

[11] Ariel Manzur Juan Linietsky and the Godot community. Godot Docu- mentation. Dosegljivo: https://docs.godotengine.org/en/stable/, . [Dostopano: 12. 8. 2021].

[12] Ariel Manzur Juan Linietsky and the Godot community. Godot Featu- res. Dosegljivo: https://godotengine.org/features, . [Dostopano:

12. 8. 2021].

[13] Ariel Manzur Juan Linietsky and the Godot community. Godot Engine.

Dosegljivo: https://godotengine.org/, . [Dostopano: 17. 8. 2021].

[14] Camille Mohr-Daurat. Camille Mohr-Daurat was hired to work on physics. Dosegljivo: https://godotengine.org/article/camille- mohr-daurat-hired-work-physics. [Dostopano: 20. 8. 2021].

[15] Steve Rabin. Introduction To Game Development. Charles River Media, Inc., USA, second edition, 2009. ISBN 1584506792.

Reference

POVEZANI DOKUMENTI

V tem poglavju predstavljam teoretični del diplomske naloge, ki zajema dva dela: v prvem delu predstavljam gibalni razvoj, razvoj čutenja in zaznavanja, razvoj

V prejšnjih poglavjih smo proučevali značilnosti in lastnosti jezika v turizmu kot samostojne zvrsti jezika in jih tudi konkretno poiskali v besedilih izbranih katalogov

Biogoriva, ki jih kot goriva v svojih uredbah uporablja Slovenija, so naslednja (Uredba o pospeševanju uporabe biogoriv in drugih obnovljivih goriv za pogon

Največ predpisanih vozičkov je bilo na ročni pogon – aktivnih; sledijo serijsko izdelan počivalnik, vozički na ročni pogon – standardni in vozički na ročni pogon za

Cilj diplomske naloge je bil razviti aplikacijo za pošiljanje SMS sporočil, ki nas obveščajo o dogajanju UPS-a, preko programa UNMS in CS121 kartice. Pri programu DezurniSMS sem se

Z razmahom raˇ cunalniˇ stva v oblaku se spreminja naˇ cin uporabe tehnologij in hkrati ponuja moˇ znost za razvoj sodobnejˇ sih storitev.. Namen diplomske naloge je raziskati moˇ

Cilj diplomske naloge je razvoj mikrokrmilne knjižnice za mikrokrmilno platformo Arduino UNO, ki bo opravljala komunikacijo preko serijskega vmesnika UART z brezžičnim modulom

Cilj diplomske naloge je razvoj razširitve za spletni brskalnik Chrome, ki omogoča brezdotično upravljanje spletnega brskalnika s pomočjo senzorja Leap