Diskuze: Střelba (tank)
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 28 zpráv z 28.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.
Nechceš, aby tu za tebe rovnou tu hru někdo udělal? Co kdyby jsi se podíval na tu miliardu tutoriálů co tu máš a pak sem napsal s konkrétním problémem a nikoli s žádostí o hru na míru... Až budeš potřebovat konkrétní radu napiš sem... Všichni ti rádi pomůžeme. Do té doby hodně štěstí!
a poradit aspoň jak udělat to střílení ? aby to vystřelilo tam kam je tank otočený? všude jsem našel návod jen že to vystřelí kam ukazuje myš
Programování není o tom, že opíšeš nějaký návod.
Je to jako bys přišel za hudebním skladatelem a řekl mu,
aby ti podrobně popsal způsob, jakým si složíš vlastní symfonii.
Vyviň trochu vlastní snahy pls.
Dobře můžu ti poradit.... (Upozorňuji tě že v GameMakeru nedělám, čili to bude praktická rada z opravdových herních enginů). Na začátku hry (GameMaker má jistý event create že?) si vytvoř proměnou direction. V update funkci hry (v GameMakeru se tomu říka Step???) si hlídej zda hráč stiskne SPACE. Pokud ano, použij ikonku CREATE_MOVING_INSTANCE (nejsem si jistý jak se přesně jmenuje ale mělo by to být ono..). Nyní nastav do ikonky směr ve kterém se objekt bude pohybovat na proměnou direction a že musí být relative. A poslední rada na závěr: Pokud chceš jednou být programátor vykašli se na GameMaker a pojď pracovat do opravdových herních enginů (Unity3D, CryEngine, UDK). Nebo alespoň nepoužívej ikonky ale GameMaker language.
Na takovou malou hru bych asi ani netahal engine.
Jediné co musíš, tak držet jednu normálu. O normálách si něco pročti. Pak už jen hledáš kolizi ve směru normály. Pokud neexistuje, tak hráč hraje dál. Pokud existuje, tak hurá a hráč se slávou skončil. Nejlepší bude mít i definovaný nějaký maximální dostřel. Vůči pozici tanky můžeš pak spoustu objektů vyřadit.
V zásadě ti bude fungovat to, co píše Vojtěch Pospíchal.
Jen nastav depth střely na vyšší hodnotu než má tank,
aby se ti střely líhly ukryté pod obrázkem tanku.
1Pupik1989: Tahat engine na malou hru, zvlášť pokud jsi začátečník, je mnohem lepší, než na engine přesedlat až na velké projekty. U nich totiž v zásadě většinou selžeš a vinu pak svedeš na engine.
Co jsem si po letech všimnul, tak je to u každého jinak. Někomu pomůže začít rovnou na enginu a psát hru. Někomu pak naopak pomůže napsat jednu malou hru od začátku a pak nemá problémy napsat větší. Spíš se to ale týká 3D. Prakticky to "direction" je ta normála kterou jsem zmiňoval.
Ano, pravěpodobně závisí na jedinci, ale obecně platí: Čím dřív se naučíš programovat, tím snažší to v životě budeš mít....
Aby se tady zase neřešila jen vhodnost enginů, o které se už naflamovalo celkem dost, posunu téma trochu jinam. Vytvořil jsem funční model střelby podle pospileho metody ( cca 15 minut času ) a je zjevný jeden drobný nedostatek. Střed tanku je logicky uprostřed kvůli snadnému otáčení tanku. Když se instance střely vytvoří na souřadnicích tanku, je při rychlém pohybu vidět, že střely nevylétávají z hlavně. Řešením je vytvářet instance u ústí hlavně, ale pak je nutné rotovat okolo středu tanku s bodem vzniku střel matematicky a to hodně začátečníků odradí. Napadá někoho nějaké jiné řešení?
Nedávno jsem dělal malý projekt jen tak abych nevyšel ze cviku. Možná
vyhrabu Unity project. Dej mi minutku .
Jinak aby tady nebyly bludy:
Direction není normála, direction je směr, zatímco normála je vektor kolmý
na rovinu nebo osu. Navíc je direction klíčové slovo v syntaxi gml a
zavádět novou terminologii není v tomto případě nijak výhodné.
Okrem toho, ze pri tvorbe striel v strede nesedi ich zobrazovanie, mohol by nastat problem aj pri kolizii striel s tankom samotnym, co bola jedna z popisanych variant ukoncenia resp. restartu hry. suhlasim s tombenom. tvorba rakiet by bola zavisla na direction tank. Cize strely by sa tvorili vo vzdialenosti od tanku na pomys. kruznici, odvodol by so to z prevodu direction na angle- priblizne 1:58 nakolko uhol sa zadava radianoch(cize 0-2pi. mno a miesto tvorby strelz bude suradnice + vzdialenost od stredu x sin resp. cos alfa...
Fajn. Ale jde o stejné řešení, jaké jsem už naznačil. Rotace místa
vzniku okolo tanku. Možná existuje i něco jiného. Jinak jsem tohle řešení
už dříve použil v trochu obměněné podobě, kdy jsem měl v ústí hlavně
neviditelný objekt, který rotoval okolo středu zbraně ( šlo tehdy o
historický kanón ) a ten neviditelný objekt teprve vytvářel střely. Hezké
bylo, že v debug módu byl objekt vidět, takže se to dobře ladilo.
Přesně takhle to řeším já. S matematikou sem nikdy zrovna velký kamarád nebyl (což neznamená že s ní nějak bojuji {jenom to není zrovna můj šálek čaje}). Každopádně, tady je odkaz na zkompilovanou hru, kterou jsem nedávno řešil:
https://mega.co.nz/#F!f8hkyBpR!Y-BWKS-sJl2kyA7xBcwzcA
Devbook bohužel nepodporuje speciální znaky do linku: Tj. link je v kódu
.
Máte na výběr dva RAR soubory - Shooter.rar (Obsahuje zkompilovanou hru o
zdrojový kód) a ShooterSource.rar (Obsahuje pouze zdrojový kód.) Pokud
nemáte Unity a chcete si prohlídnout alespoň zdrojové kódy zamiřte do
složky: \TopDownProjekt\Assets\Scripts. Zde se nachází C# skripty které
můžete otevřít v jakémkoli editoru. Pokud ale máte možnost otevřít
projekt v Unity jako celek doporučuji to.
Tohle je poměrně šibalské řešení.
Vlastně jde o nekonečně rychlou střelu graficky provedenou jako čára.
V zásadě to i odpovídá reálu v tom, že rychlost střelce je tak malá
proti faktické rychlosti střely, že skutečně lze rychlost střely
zaokrouhlit směrem k nekonečnu. Docela dobré.
Díky Byl to vlastně můj
první pokus o střelbu tímhle směrem. Vždycky to byla jen inicializace
objektu, ale jsou tam potom problémy tipu kolize v moc velké rychlosti,
průstřel objektu který potřebuji aby šel penetrovat atd... RayCast je
poměrně elegantní řešení.
Ještě jsem u tvého tanku objevil jednu malou chybku... V případě že se tank otáčí velkou rychlostí a přitom hráč střílí, tak střela evidentně nevychází z hlavně, ale ze středu tanku... Čili je to zřejmě opravdu nutné řešit buď druhým objektem v hlavni, nebo matematikou....
Objevil jsi chybku? To byl přece důvod, že jsem to sem dával - aby to
bylo vidět, že se to tak chová, když se použije střed, jak jsi to
původně navrhoval ty sám. Myslel jsem, že si toho všimneš hned.
Vypadá to, že místo klasických cos, sin by mohlo být výhodné
použít lengthdir_x(len,dir) a lengthdir_y(len,dir).
Dalším řešením by možná mohly být kolize. Střela vytvořená na pozici středu tanku by měla generovat kolizi tak dlouho dokud není u hlavně, takže by asi šlo při vytvoření hned posouvat v cyklu while dokud bude v kolizi s tankem, který střelu stvořil.
Každopádně to téma skrývá víc zajímavých aspektů.
Ne jde o to, že to bylo vidět už v případě, že se tank nehýbal. V
případě že se hýbe, tak střela nejde ani ze středu tanku (z pohledu
hráče)....
K řešení pomocí kolize: Tohle řeší kolize ve while není příliš
dobré. Řešil jsem takhle kolize které musí být opravdu přesné, ale
nároky na HW jsou pak řádově mnohem větší...
Obojí efekt vychází ze stejného problému. Jestli jde o rychlost rotace nebo rychlost pohybu celého tanku už mnoho nezmění, proto mě nenapadlo, že bys to odlišoval.
Ohledně náročnosti kolizí:
Pravděpodobně by šlo o pár pixelů velikosti a stačilo by asi kontrolovat
jen střed střely jako jediný bod proti masce tanku. Myslím, že by to
stíhalo celkem v pohodě.
Pokud stále řešíme 2D tank v GameMakeru (zvlášť nějakou na koleni dělanou freeware hru), tak tam o výkon už zřejmě opravdu tolik nejde, ale pokud člověk řeší 3D hru na mobilní platformu řeší každé jediné FPS.
To je pravda. Ve 3D by se to zřejmě nevyplatilo takhle dělat.
Zobrazeno 28 zpráv z 28.