What a Wonderful World

A Unity rengeteg lehetőséget és szabaságot nyújt, így a legtöbb gondott nem is a játék megírása okozza, hanem annak a kitalálása, hogy hogy kezdjünk hozzá…

Kiskoromban rengeteg LEGO-szettem volt – imádtam építeni, mindig valami újat kitalálni. Jóformán meg is rökönyödtem, amikor két anyuka beszélgetését hallgattam a trolin:

– Ricsinek állandóan LEGO-t kell venni, alig bírjuk pénzzel… De legalább nagyon szereti: a múltkor egy kalózhajót épített át űrhajóvá.
– Petinek nem érdemes: egyszer kirakja az útmutató szerint, aztán porosodik a polcon. De hát nem is olyan jó matekból, mint a Ricsi…

Hogy lehet csak egyszer összeépíteni a LEGO-t? Mi köze a LEGO-nak a matekhoz? Bár lehet van benne valami… ☺

Építsünk világokat

A digitális LEGO annyiból jobb a valódinál, hogy végtelen építőkockánk van. Az már más, hogy itt ezeket a kockákat magunknak kell létrehozni.

Az előző posztban említettem, hogy a Unity elsősorban 3D-s játékmotor, de van lehetőség 2D-s játékok írására is. Ez a gyakorlatban azt jelenti, hogy minden játékelem a 3-dimenziós játéktérben helyezkedik el így is, úgy is, csak a kamera “tréfál meg” bennünket.

Perspektíva vs. ortografikus vetület

A perspektíva olyan ábrázolásmód, amely a tárgyak térbeliségét ábrázolja sík felületen: esetünkben a képernyőn. A távolabbi tárgyak kisebbnek, a közelebbiek pedig nagyobbnak tűnnek. Az ortografikus vetület teljesen elhagyja a mélységet (vagyis nem veszi figyelembe a perspektivikus ábrázolás során használt z-buffert), így az azonos méretű tárgyak ugyanakkorák akkor is, ha nagyon távol vannak, és akkor is, ha nagyon közel.

Ugyanannak a három kockának perspektivikus és ortografikus megjelenítése

Ugyanannak a három kockának perspektivikus és ortografikus megjelenítése

Ha így nézzük, akkor az eredeti 1988-as játék is az ortografikus megjelenítést használja. Ezt szeretném én is elérni: csak nem majdnem-felülnézetből, hanem izometrikus nézetben.

A Soko-Ban két pályája

A Soko-Ban két pályája

Izometrikus?

A 8-bites éra bővelkedik az izometrikus megjelenítésű játékokban. Néhány példa a teljesség igénye nélkül:

Syndicate, Commandos: Behind Enemy Lines, Fallout, SimCity 2000, Baldur's Gate II: Shadows of Amn, Anno 1602, Age of Empires, Theme Hospital

Syndicate, Commandos: Behind Enemy Lines, Fallout, SimCity 2000, Baldur’s Gate II: Shadows of Amn, Anno 1602, Age of Empires, Theme Hospital

Tehát a pályát kicsit felülről (kb. 30°-kal megdöntve), és kicsit elforgatva (általában 45°-kal) szemléljük.

3D

A 3-dimenziós motor miatt kézenfekvő, hogy 3-dimenziós elemeket is alkalmazzunk. Elég létrehozni a kis kockákat és lehet is építeni. Így akár létrehozhatjuk a következő Minecraftot is. ☺

Sajnos a Unity beépített kockáit nem lehet skinezni. Viszont rendelkeznek Box Colliderrel. Az egyetlen beépített komponens, aminél meg lehet változtatni natívan, hogy mit jelenítsen meg, az a Sprite. Nem tehetünk mást, magunknak kell egy skinezhető kockát kreálnunk:

  1. Hozzunk létre egy üres GameObjectet.
    GameObject > Create Empty
  2. Nevezzük át “Cube”-nak.
    jobb klikk a GameObject-en > Rename
  3. A Cube-on belül hozzunk létre három Sprite-ot. (Mivel csak egy irányból fogjuk látni, felesleges többet renderelni.)
    GameObject > 2D Object > Sprite, majd húzzuk rá mindhárom Sprite objektumot a Cube-ra, hogy a gyerekei legyenek.
  4. Méretezzük be a Sprite-okat.
  5. Igazítsuk őket egymáshoz úgy, hogy legyen egy közös csúcsuk, illetve páronként egy közös oldaluk, és páronként a lapjaik 90°-os szöget zárjanak be.
  6. Válasszuk ki, hogy milyen képet jelenítsenek meg.
  7. Végül adjunk a Cube-hoz egy Box Collider komponenst. Ezen fog a játékos később mászkálni.

A kész félkockából csináljunk Prefabot azzal, hogy behúzzuk az Assetek közé. Innentől kezdve kódból is hívható, beállítható lesz, és lehet is építeni.

A kész félkockák

A kész félkockák

2D

Mivel annyira tetszenek a régi 8-bites játékok, így azt szereném, hogy az én játékom is pixeles, retro hatású legyen. A 3D-s objektumokkal könnyű dolgunk volt, hisz azok mindenképp passzolni fognak egymáshoz. Nem úgy a 2D-seknél – pontosabban a kvázi 2D-seknél.

Hogy könnyű legyen a pályát kezelni és a játékost irányítani, ezért a pálya elemei továbbra is kockák lesznek. A különbség az, hogy most átlátszóak, és egy Sprite-tal fogjuk őket elfedni.

Persze ez nem is olyan könnyű, mint ahogy hangzik, de pár napos próbálgatás során sikerült a megfelelő beállításokat megtalálni.

Először érdemes azt a kamerabeállítást megtalálni, amit használni fogunk a játék során. Ne felejtsük el a Projectiont Orthographicra állítani.

  1. Hozzunk létre egy kockát.
    GameObject > 3D Object > Cube
  2. Adjunk hozzá gyermek elemként egy Sprite-ot, és állítsuk be rajta a grafikánkat.
  3. Igazítsuk a Sprite-ot úgy, hogy a grafikai elem teljesen eltakarja a kockát. Vegyük figyelembe a 30°-os kameradöntést. Ekkor a sprite középpontja a kocka egyik csúcsához van közel.
  4. Töröljük a kocka Mesh Renderer és a Mesh Filter komponenseit. Ekkor csak a Box Collider marad.

Végezetül a kész pixelkockából csináljunk Prefabot.

A kész pixelkockák

A kész pixelkockák

Automate

Kézzel egymás mellé rendezgetni a kockákat elég fárasztó dolog. Szerencsére írhatunk scriptet a pálya legenerálására.

A pályát véletlenszerűen szétszórt kockákból fogjuk összerakni. A Unity beépített véletlenszámgenerátorát fogjuk használni, ezért azt a using direktívák között specifikálnunk kell.

using Random = UnityEngine.Random;

Ahhoz, hogy változókat elérjük a Unity Inspectorjában, publicnak kell lenniük.

public int columns = 5;
public int rows = 5;

A pixelkockák tárolására létrehozunk egy GameObject tömböt. Az Inspectorban ide húzzuk be a pixelkockák Prefabjait.

public GameObject[] tiles;

A pixelkockákat egy üres GameObject originjétől kezdve fogjuk tárolni: ez lesz a levelHolder.

private Transform levelHolder;

Létrehozzuk az új üres GameObjectet és eltároljuk a pozícióját. Ezek után létrehozunk a pixelkocka Prefabokból egy véletlen színű példányt és beállítjuk a Levelt szülőként. Az x és z változókat 0.32-vel be kell szorozni, mert ekkora méretűek a kockák oldalai. A kockákat az x és z tengelyen fogjuk elhelyezni, ezért az y koordináta mindig 0 lesz.

void LevelSetup()
    {
        levelHolder = new GameObject("Level").transform;

        for (int x = -1; x < columns + 1; x++)
        {
            for (int z = -1; z < rows + 1; z++)
            {
                GameObject toInstantiate = tiles[Random.Range(0,tiles.Length)];

                GameObject instance = Instantiate(toInstantiate, new Vector3(x * 0.32f, 0f, z * 0.32f), Quaternion.identity) as GameObject;

                instance.transform.SetParent(levelHolder);
            }
        }
    }

Ezután már csak végre kell hajtani a korábban definiált metódust. Erre a Unity saját beépített metódusát használjuk: az Awake-et. Ez fog lefutni, amikor a Scene betöltődik a játékban.

void Awake()
    {
        LevelSetup();
    }
}

Unityben hozzunk létre egy üres GameObjectet és húzzuk rá a scriptet. A GameObjectre kattintva a scriptnél beállíthatjuk, hogy mekkora legyen a pályánk, illetve a felhasználandó pixelkockáinkat.

Az Inspector beállításai

Az Inspector beállításai


Generált pixelkockák

Generált pixelkockák

A kódot természetesen felhasználhatjuk a félkockák generálására is:

Generált félkockák

Generált félkockák

Connect to azure

Ebben a cikkben meg fogom mutatni, hogyan kell kapcsolódni az AZURE adatbázisunkhoz SQL szerveren keresztül.

Ha ezt olvassuk, akkor már van AZURE adatbázisunk, ha nincs az előző cikk segít létrehozni.
1
Válasszuk ki a Connect to your database fül alatt View SQL connection string-et.
2
Itt látjuk a szerver nevét, az id-t a jelszóra meg emlékszünk. 🙂
Indítsuk el az SQL server management programot.
3
Ide írjuk be az azure-n látott adatokat. Sikeres belépés után a program így néz ki:
4
Írjuk meg az sql utasításokat. Válasszuk a new query-t a fenti menübűl:
5
Az én utasításaim így néznek ki:
6
Hajtsuk végre! (execute parancs)
7
Az adatbázisban létrejöttek a táblák. Lent pedig látjuk, hogy a sript hiba nélkül lefutott.

Azure – New Database

Ha szeretnénk egy adatbázis szervert létrehozni a legkönnyebben Microsoft Azure-n keresztül tudjuk megtenni.
Az oldal így néz ki:
1
Nekem már van pár adatbázisom, de ezek lejártak. Hozzunk létre újat.
Kattintsunk bal lent a new ikon-ra.
2
Válasszuk az SQL_DATABASE link alatt a CUSTOM CREATE fület.
3
A felugró ablakban válasszuk ki a Nevet, majd én a RETIRED TIERS alatt a web-et választottam ki, ekkor a maximális méret 1gb-ra állítódik be. COLLATION-t beállítottam magyarra. Lent pedig kiválasztottam az új SQL database szerver létrehozását.
4
A felugró menüben adjunk meg nevet, régiót és a használni kívánt jelszavat.
5
Kész is a szerverünk. A listában látszik is:
6
Már csak be kell azt állítani, hogy a tűzfal átengedje az IP címünket, amikor szeretnénk az adatbázist feltölteni. Válasszuk ki a beállítandó adatbázist, kattintsunk a nevére.
7
Válasszuk ki a kiemelt szöveget. Mostantól már lehet is használni a szervert, ahogy szerenénk!

Web API contoller használata

Ha már létrehoztunk a controllereket próbáljuk meg használni is! 😛

Hozzuk létre az adatbázis kapcsolatot:
1
K
övetkező a 2 get utasítás:
2
mit is csinál az első get?
Futtassuk a projektünket, hívjuk meg a webapi controllerünket:
http://localhost:xxxxx/api/Coords címen, nálam az eredmény:
3
Ez az eredményt az első get hívásra kaptuk, ami visszaadja az adatbázis teljes tartalmát. Hívjuk meg a 2. get -et ami paraméterezve van:
4
Weboldal válasza az ezzel az id-vel rendelkező egyed lesz:
4
Ezek alapján írhatunk a többi utasításra(put,post,delete) példát:
5
6
7

EnableSSL

Ha már van egy létező projektunk, és szeretnénk bekapcsolni az SSL-t a következőeket kell tennünk:
-Kiválasztjuk a solotion a projektünk alatt:
1
Properties fülön (alul) látjuk az SSL aktuális állapotát:
2
Duplán kattintsunk rá, ekkor enable-lesz, és a következő üzenetet kapjuk:
3
elfogadjuk, majd elfogadjuk a következő üzenetet is:
4
Ekkor a Properties fülön látni fogjuk az SSL url-jét, localhoston az én esetemben 44300 porton. Ha ott nem látszik, akkor projekt beállításai között a web fület kiválasztva látjuk a portot.
6

Írjunk játszva szakdolgozatot

Amikor apukám először mutatta meg a Commodore 64-es gépén, hogy hogyan tudok egy játékot elindítani rajta, talán meg is bánta, mert ezután nem lehet kirobbantani a képernyő elől.

A Commodore 64 bekapcsolás után

A Commodore 64 bekapcsolás után

Még mindig emlékszek a kék képernyőn villogó kurzorra, ahová a következő sorokat kellett begépelnem:

LOAD"$",8
LIST

Ezután kiválasztottam annak a játéknak megfelelő sort, amivel játszani akartam és átírtam a következőre (a Commodore-on alapértelmezetten a beírt karakterek felülírták a kurzor pozícióján találtakat):

LOAD"IMPOSSIBLE MISSION",8
RUN


Az Impossible Mission játékmenete

Az Impossible Mission játékmenete

Számomra ez a játék tényleg “lehetetlen” volt, egyszer sem sikerült végigjátszanom, de nem tántorított el attól, hogy mindig újra és újra megpróbáljam. Az öreg Commodore még mindig működőképes és ugyanúgy tudok játszani rajta, mint 20 évvel ezelőtt.

A szakdolgozatom

Ennyi év elteltével sem változott a játékok iránti szeretetem, így játékfejlesztést választottam a szakdolgozatom témájának. A hangzatos cím pedig: Cross-platform játékfejlesztés Unity-ben.

Az, hogy ezzel a témával fogok foglalkozni, már jó pár éve adott volt, de a megvalósítandó játék akkor lett biztos, amikor Bonyolultságelmélet előadáson kiderült, hogy vannak kifejezetten nehéz játékok, amelyek megoldásának kiszámítása algoritmikusan belátható időn belül lehetetlen.

Ilyen játék a szókoban is.

Az 1988-ban MS-DOS-ra íródott Soko-Ban

Az 1988-ban MS-DOS-ra íródott Soko-Ban (maga a játék korábbi)

A játék célja egy labirintusban dobozokat, megadott helyre juttatni. Egyszerre csak egy dobozt lehet mozgatni, és klasszikusan csak tolni lehet őket, húzni nem. Egy pályának akkor van vége, ha az összes doboz a helyére került.

Ezt fogom megvalósítani a Unity játékmotor segítségével.

Miért Unity?

Habár több 2-dimenziós játékmotor és játékfejlesztő környezet létezik, a legfontosabb számomra, hogy a lehető legtöbb platformra el tudjam juttatni az elkészült programom.

Ezekre a platformokra lehet exportálni Unityvel:

Asztali
Windows OS X Linux
Telefon
Windows Phone 8 iOS Android
BlackBerry 10
Konzol
Xbox One Playstation 4 Wii U
Xbox 360 Playstation 3 Wii
PlayStation Vita

…és a Unity Web Playeren keresztül böngészőben is lehet játszani.

A Unity elsősorban 3-dimenziós játékok fejlesztésére lett tervezve, de kiválóan alkalmas 2D-sek készítésére is.

Néhány példa:

Hello Unity!

A játékmotor ingyenesen letölthető a fejlesztő honlapjáról. A programkód írásához használhatunk UnityScriptet, Boo-t, vagy C#-ot. Én az utóbbiban fogok fejleszteni.

A program debugolásához lehet használni a Unityba beépített MonoDevelopot, vagy a Unity VS segítségével Visual Studiot.

Miután mindent feltelepítettünk, neki is láthatunk egy új projektet készíteni: a Unityt megnyitva kiválaszthatjuk a UnityVS csomagot a fentebb említett okból, és a legördülő menüből a 2D opciót. Így a kameranézetünk alapból ortografikus lesz, a képként behúzott elemeket pedig spriteként kezeli az IDE.

A Unity Store-ból rengeteg (akár ingyenesen is) letölthető és felhasználható forrás van, a demó kedvéért egy sprite-csomagot töltöttem le. A kezelőfelületen könnyűszerrel összállíthatók a játékelemek.

Build Settings a Unityben

Build Settings a Unityben

A kész jelenet (scene) elmentése után a File > Build Settings… menüponttal jutunk el oda, hogy kiválasszuk melyik platformra szánjuk a játékunkat. A Build gomb lenyomása után elkészül a Visual Studio projekt, amelyet megnyitva kipróbálhatjuk azt. A Visual Studio Configuration Manager…-ében ne felejtsük el az architektúrát átállítani, mert alapértelmezetten ARM-ra készül a build.

Buildelés a Visual Studioban

Build a Visual Studioban


A kész "játék"

A kész "játék"

roomM8 – A feladatok

Az alkalmazás lakótársak életét könnyíti meg, az együttélés ügyes bajos dolgainak követhetőbbé tételével.

A roomM8 négy fő részre oszlik, feladatok, erőforrások, csoportok és számlák. Ezek közül most a feladatokkal fogunk foglalkozni.

A feladatok lehetnek mindennapos tevékenységek, úgy is mint egy takarítás, valamilyen eszköz javíttatása, vagy egy bevásárlás.

Continue reading

roomM8 egy alkalmazás lakótársaknak

Image

roomM8 Windows Phone 8.1 és Windows 8.1 alkalmazás


Kenguru_GIMP

Az alkalmazás logója, leendő csempéje.

Az alkalmazás lakótársak életét könnyíti meg, az együttélés ügyes bajos dolgainak követhetőbbé tételével.

Lehetőségünk lesz feladatok kiosztására egymás között, a számlák befizetésének nyomon követésére, csoportok létrehozására.

Az alkalmazás négy fő részből áll. Ezek a csoportok, a feladatok, az erőforrások, és a számlák.

Roomm8_Visio1


A felhasználóknak lehetőségük van bejelentkezni az alkalmazásba, csoportokat létrehozni.

A bejelentkezéshez nem kell újabb felhasználói fiókot létrehozni, használhatnak már meglévő fiókokat is, például Facebook, Twitter és Microsoft fiókokat.

Az információk tárolása Microsoft Azure Mobile Services-zal lesz megvalósítva.


Az alkalmazás jelenleg erősen work in prorgess állapotban van.

Köszönöm, hogy végigolvastad!
Mészáros Tamás

 

 

 

ADO.NET Entity Framework (4) – change view

Nézzük meg, hogy lehet módosítani az EF-t. Esetünkben elfelejtettünk jelszót rendelni a felhasználóhoz.

Nyissuk meg a felhasznalo.sql-t amit itt írtunk.
Írjunk bele plusz egy sort a T-SQL-be (esetünkben ez a password).
1
Futtassuk le! (F5)
Nézzük meg a modellben a DataMVCConnection.edmx-et.
Itt még nem frissült a felhasználó tábla.
2
Klikkeljünk a  DataMVCConnection.edmx-re, majd update modell from Database:
3
Válasszuk ki, azt a táblát, amelyik módosult (akár mindegyiket, esetünkben a felhasználó).
4
Ekkor megjelenik a jelszó mező is, buildeljük a projektünket:
5
J
elenlegi állásban a viewben még NEM jelenik meg a jelszó!
A legegyszerűbb talán úgy létrehozni újra, hogy mindent törlünk, hiszen még semmit se módosítottunk: (töröljük a felhasznalokat a view mappából és a hozzá tartozó controllert: FelhasznaloesController.cs)
6
Utolsó lépésként újrageneráljuk a controllert és hozzá a view-et ahogy itt tettük.

ADO.NET Entity Framework (3)

Hozzunk létre Viewet az eddig elkészült adatbázisunkhoz.
Adjunk hozzá egy új scaffolded item-et a controllerhez:
1
Válasszuk a 2. lehetőséget:
2
Válasszuk ki a model classt és a data context clast. Először célszerű az utóbbit, majd a model classban legördülő menüből válasszuk azt amit mi hoztunk létre adatbázis szinten az előző bejegyzésekben.
3
Ismételjük meg annyiszor, ahány táblánk van, esetünkben ez 3. Miután elkészültünk az alábbi file-ket szúrta be nekünk a VS:
4
Nézzük meg ezeket interneten. Először gyártsunk hozzá vezető linkeket:
5
Futtassuk a projektunkat egy böngészőben. (F5) Eredményünk:
6
Nézzük meg pl. a készülékek listáját:
7
Az itt megjelenő készülékek és leírásaikat mi írtuk meg itt.
Emlékeztetőül az utasítás ez volt:
MERGE INTO Droid AS Target
USING (VALUES
(1, ‘samsung s4′,’S4-es készulékem’, 1,1,1),
(2, ‘LG Nexus4′,’N4-es készulékem’, 2,1,1)
)
AS Source (ID, Nev, Leiras, UserID,CameraID,GPSID)
ON Target.ID = Source.ID
WHEN NOT MATCHED BY TARGET THEN
INSERT (Nev, Leiras, UserID,CameraID,GPSID)
VALUES (Nev, Leiras, UserID,CameraID,GPSID);