středa 31. ledna 2018

Galaxman preview

Na hře Galaxman dělám s malýma přestávkama už okolo čtyřiceti dní. Jde o vedlejší projekt, ke kterému jsem si odskočil, abych nabyl více zkušeností - všeho druhu, nejen programování. A chytlo mě to natolik, že jsem z původně malé hříčky pro Ludum Dare vykutal trošku větší, ale hlavně lepší, hru. Není ještě dokončená, ale je ve stavu před dokončením, a myslím, že do čtrnácti dní by měla být hotová určitě.

Zlepšil jsem se v kódování. Galaxman hodně používá takzvané koprogramy (coroutines), které jsou fun a hlavně lehké na použití. Grafika a cit pro design se u mě také zlepšil, jak můžete ostatně vidět na obrázcích dole (horní obrázek je první den tvorby, dolní je den čtyřicátý). Co je z mého pohledu hodně fajn, i první obrázek si vysloužil na sociální síti Twitter sice docela malou, ale i tak, chválu, takže jistá spokojenost tu je.



"Ambice versus dokončení hry" by mohl být nadpis pro tento vytvářející se odstavec. Ani ne dvacet čtyři hodin po skončení Ludum Dare jsem psal na twiter, že Galaxman je až příliš ambiciózní pro víkendovou soutěž. Měl mít i příběh, samozřejmě animované intro a i nějaké ty dialogy v průběhu hry. V plánu bylo udělat devět světů, pardon, galaxií! Jsem si vědom toho, že pokud bych měl dodržet původní vizi, zřejmě bych musel na hře dělat o měsíc déle (optimisticky řečeno). Při tvorbě jsem nakonec zjistil jednu podstatnou věc. Alespoň v tomto případě, vše stojí a padá na kreativitě. Nápad na hru vznikl ve velké rychlosti a jak jsem na ní pokračoval, čím dál tím víc jsem si uvědomoval, že právě ona kreativita je to, co mě na Galaxmanovi nejvíc baví. Plánování je velmi důležitá součást herní tvorby, ovšem u tohoto projektu, který je tvořen tak "nějak jinak", než tvoří 99 procent herních tvůrců, mi bylo jasné, že to takhle musí i pokračovat.

Příběh je tvořen čistě herními prostředky. Hráč si tam určitě nějaký najde, bude-li chtít. Dialogy, ač některé už vznikly, ve hře nebudou.

Výsledek tedy nezaručuji, že se bude líbit úplně všem.

Co teď musím ještě dopilovat, je obtížnost a systém speciálních schopností. To druhé mě zdrží podstatně déle. Pokud se to nepovede správně, zase tak moc se nestane. Stále jde o malou hru, na které jsem nestrávil až příliš času, abych si začal zoufat, když jí dá nějaký novinář 7/10.

zeal

neděle 21. ledna 2018

Unity: Pohyb po vyznačené cestě

Momentálně tvořím malou hru v Unity - viz předchozí blogový příspěvek - a momentálně do ní přidávám různé druhy nepřátel. Co jsem se koukal na blogovou statistiku, příspěvky označené jako Unity mají celkem slušnou návštěvnost, a tedy rozhodl jsem se - když je stále ten začátek nového roku - podělit se o jeden, vcelku jednoduchý, skript jednoho takového AI nepřítele.


Jde o bota, který se kutálí po zemi, zdi, ale i stropě, rychlostí jakou chcete (ale teď jak o tom přemýšlím, docela srandovní by mohla být proměnlivá rychlost). Kutálí se podle vašeho předem připraveného plánu, tam i zpět. Bodů v plánu může být klidně i sto nebo tisíc, podle vaší fantazie. Já jsem se omezil jen na tři body, z nichž jeden je startovní pozice - čili prvním bodem naší, tedy botovy, cesty bude druhý bod, cesta[1]. Jakmile se dostane na poslední pozici, program se "otočí" a bot bude následovat náš plán v obráceném pořadí. Po dosažení startovního bodu se opět automaticky přehodí a pojede zase tak, jak jsme napsali náš plán jeho cesty.

A teď k samotnému kódu:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class bot7 : MonoBehaviour {
Transform tr;
bool isRotating;
public Vector3[] cesta;
public int indexC = 1;
public bool zpet;
void Start () {
tr = transform;
isRotating = true;
StartCoroutine (RotateBot ());
}
void Update()
{
if (indexC < cesta.Length && indexC > -1) {
tr.position = Vector3.MoveTowards (tr.position, cesta [indexC], 0.02f * Time.deltaTime);
if (zpet == false) {
if (Mathf.Approximately (tr.position.x, cesta [indexC].x) && Mathf.Approximately (tr.position.y, cesta [indexC].y)) {
indexC++;
}
} else {
if (Mathf.Approximately (tr.position.x, cesta [indexC].x) && Mathf.Approximately (tr.position.y, cesta [indexC].y)) {
indexC--;
}
}
} else {
if (zpet == false) {
zpet = true;
indexC = cesta.Length - 1;
} else {
zpet = false;
indexC = 0;
}
}
}
IEnumerator RotateBot()
{
while (isRotating) {
if (zpet == false) {
tr.Rotate (new Vector3 (0f, 0f, -120f * Time.deltaTime));
} else {
tr.Rotate (new Vector3 (0f, 0f, 120f * Time.deltaTime));
}
yield return null;
}
}
}
Pokud budete mít nějaké otázky, rád je zodpovím v komentářích.

coder zeal