Prezentace projektu z předmětu PGRF2 Téma: Bludiště Miroslav Pokorný
Obsah prezentace Reprezentace světa Řešení kolizí Sprite grafika Nepřátelé a viditelnost
Reprezentace světa „Dvourozměrný“ (není možný pohyb ve vertikální ose) Kolmý (všechny stěny jsou na sebe kolmé) Reprezentace pomocí matice WorldObject[][] staticWorld = new WorldObject[WIDTH][HEIGHT]; [0,0] Width Height 1,0 2,0 0,0 4,0 5,0 3,0 1,1 2,1 0,1 4,1 5,1 3,1 1,2 2,2 0,2 4,2 5,2 3,2 1,3 2,3 0,3 4,3 5,3 3,3 1,4 2,4 0,4 4,4 5,4 3,4 6,0 6,1 6,2 6,3 6,4
Řešení kolizí WorldObject vlastnost „clip“ (určuje, zda je daný objekt neprůchozí) Hráč na pozici: 2.5;1.5 Pohyb v kladné ose X a Z Kolize může nastat pouze s objektem na [2,2] nebo [3,1] [0,0] Width Height 1,0 2,0 0,0 4,0 5,0 3,0 1,1 2,1 0,1 4,1 5,1 3,1 1,2 2,2 0,2 4,2 5,2 3,2 1,3 2,3 0,3 4,3 5,3 3,3 1,4 2,4 0,4 4,4 5,4 3,4 6,0 6,1 6,2 6,3 6,4 [0,0] Width Height 1,0 2,0 0,0 4,0 5,0 3,0 1,1 2,1 0,1 4,1 5,1 3,1 1,2 2,2 0,2 4,2 5,2 3,2 1,3 2,3 0,3 4,3 5,3 3,3 1,4 2,4 0,4 4,4 5,4 3,4 6,0 6,1 6,2 6,3 6,4
Řešení kolizí (v ose X) Pokud: PoziceX + krok + tolerance > PoziceX možnost kolize Kontrola objektu na pozici [PoziceX + 1][PoziceZ] Pokud objekt není null a zároveň je Clip tak pohyb nebude proveden private double collisionMoveX(double step) { double z = player.getPositionZ(); double x = player.getPositionX(); if (step > 0) { if ((int) x < (int) (x + step + player.STEP/2)) { if ((int) (x + step + player.STEP/2) > WIDTH - 1) return 0; WorldObject next = staticWorld[(int) (x + step + player.STEP/2)][(int) z]; if (next != null && next.isClip()) return 0; } } else { //řešení pro pohyb v ose -X } return step; }
Sprite grafika Na mapování „poloprůhledné“ textury na Quad Quad je nutné rotovat (podle počátku v ose Y) na základě azimutu hráče Vytváří „pseudo“ 3D efekt 2D objekt ve 3D +45°
Problém spritů Dříve vykreslené sprity zakryjí později vykreslené sprity Před vykreslením je nutné seřadit sprity podle vzdálenosti od hráče Aby sprite nezakryly část světa, je nutné je vykreslovat až nakonec
Nepřátelé (viditelnost) Problém, jak zjistit zda může být hráč spatřen nepřítelem? Nepřítel je natočen ve světě pod nějakým úhlem (eAzimut) Nepřítel vidí v zorném úhlu FOV Pokud: α – 0.5*FOV <= eAzimut <= α + 0.5*FOV Hráč může být spatřen α 90° v dz dx X Z 𝛼= sin −1 𝑑𝑥 𝑣 𝑣= 𝑑𝑥 2 + 𝑑𝑧 2 X Z α = 90°-α α = 90°+α α = 270°-α α = 270°+α α 90° v dz dx 0° 180° 270°
Nepřátelé (viditelnost) [2] Interpolace po přeponě pravoúhlého trojúhelníku Dostatečné množství dělení Pokud při testu objektu na pozici [iX,iZ] se zjistí, že je neprůhledný bude vráceno FALSE, pokud celá interpolace nezjistí neprůhledný objekt bude vrácena hodnota TRUE [0,0] X Z 1,0 2,0 0,0 4,0 5,0 3,0 1,1 2,1 0,1 4,1 5,1 3,1 1,2 2,2 0,2 4,2 5,2 3,2 1,3 2,3 0,3 4,3 5,3 3,3 1,4 2,4 0,4 4,4 5,4 3,4 6,0 6,1 6,2 6,3 6,4 Nepřítel na pozici [2,1] hráče nevidí Nepřítel na pozici [3,4] hráče vidí
Prostor pro dotazy Děkuji za pozornost