Skocz do zawartości

Kilka pytań amatora ^^


Rekomendowane odpowiedzi

Tworzę swoją pierwszą gierkę. Przynajmniej mam w przyszłości zamiar, bo narazie tylko testujący program, by rozwiązać niektóre problemy. Więc do rzeczy:

 

Załączam tutaj link do pliku, który zawiera gierkę:

www.doman.art.pl/gm/simple.gmk

 

Opis problemów jest w informacjach gry, ale oczywiście tutaj też zamieszczam. Jeżeli któreś pytanie jest niejasne, najlepiej włączyć ową grę i zobaczyć o co chodzi.

 

Problemy:

- Pocisk po tym jak pokaże "rykoszet" (image_index[1]) nie niszczy sie - nie odpala sie alarm[0] ??. Alarm ustawiam w warunkach eventu steep, a w alarmie jest instance_destroy. I nie dziala ??

 

- jak wykryc wektor w ktory ma celowac dzialko? - dla dzialek snajperow ^^. Dla tych co są teraz jest niby ok, bo mają "walić" chaotycznie, ale napewno mi się przyda strzelanie z poprawką na ruch. Zastanawiałem się nad uwzględnianiem szybkości obiektu ludka itp, ale jakoś nie do końca mogę to wymyśleć (leń!)

 

- obrot dzialka wolniejszy - probowalem tak, ze pobieralem point_direction ludka i wtedy sprawdzalem czy direction dzialka jest mniejszy czy wiekszy i w zaleznosci od tego odpalalem alarm[2] ktory dodawal lub odejmowal do direction dzialka - narazie nie wyszlo - dzialka były nieruchome... ;/ Teraz jest ustawione na point_direction, ale za szybko się obracają i wygląda to głupawo.

 

- dzialko celuje w najblizszego ludzika. Jezeli ludzik zginie to dzialko w niego nie powinno celowac.

Próbowałem tak:

 

L = instance_nearest(x,y,ludek);

if (L.zycie==0) L = instance_nearest(L.x,L.y, ludek);

 

Tylko ze to wylapie tylko pierwszego najblizszego (a jezeli beda 2 trupy obok siebie to juz nie wylapie). Z repeat i while mi nie poszlo, bo jestem amator ^^, zreszta ta metoda jest kiepska, bo ma lapac najblizszego ludka od dzialka, a nie od martwego ludka (a przeciez najblizszy martwemu ludkowi wcale nie musi byc najblizszy dzialku)

Narazie to jakos zalatwilem tworzac dodatkowy obiekt zawierajacy tylko martwego ludka, ale tak to troche jest sztucznie, bo np jak w przyszlosci dodam granaty i latajace ciala, to bede musial rozpisywac zadania ludka na 2 - martwy obiekt - troche nielogiczna lipa (ale zadziala)

 

- Jako amator proszę o wszelkie uwagi itp dotyczące tego - co zle robię, jakie złe praktyki stosuję itp.

 

- Pytanie ostatnie: Jak to jest z tym draw??? Jeżeli w steep zmieniam direction, to za każdym razem muszę odpalać tą funkcję rysującą? Nie powinno to być automatycznie czy coś? Może mi ktoś to logicznie wyjaśnić jak to działa?

 

Ps. Przepraszam z góry, że tyle pytań na raz, ale nie chcę zaśmiecać forum nowymi wątkami.

Ps2. Nie mam na tym kompie GM, i nie wiem czy w objekcie timer ustawiłem tworzenie nowych instancji ludka. Jeżeli jest zakomentowane to można odkomentować ^^

Odnośnik do komentarza
Udostępnij na innych stronach

Bedę aktualizował i odpowiadał pytania:

 

w step umieściłem odpalanie alarmu który kasował instancję za 10 stepów, ale że nie było warunku sprawdzającego, to w każdym stepie ustawiał ten alarm na 10 - przez to instancja nie była niszczona (zwykla glupia logika ^^)

Odnośnik do komentarza
Udostępnij na innych stronach

Co do wyższego - sprawdzaj, czy alarm jest równy -1.

 

Tak, funkcje w draw same się aktualizują.

 

Co do wektoru, dokładnie nie rozumiem, możesz jaśniej? Chodzi ci o kierunek strzału?

 

Z ludzikami ciekawa sprawa. Spróbuj:

GML
do

{

_l = instance_nearest( x, y, Ludek );

} until( _l.zycie == 100 );

Co do wolniejszego obracania - kiedyś było pytanie podobne, chodziło o obrót kompasu. Niepotrzebne alarmy, wystarczy step. Zaraz podam kod.

Odnośnik do komentarza
Udostępnij na innych stronach

Ciężko to ludziom wytłumaczyć ^^

Grałeś kiedyś w jakiś symulator kosmiczny? Jak leciał wrogi myśliwiec to Hud pokazywał ci miejsce gdzie masz strzelać by trafić.

Właśnie takie miejsce chcę obliczyć.

Więc:

Mam karabinek w pozcji x i y, który strzela pociskiem w ludka, który biegnie z przeciwnej strony ekranu. Nie moge skorzystać bezpośrednio z derection_point, bo zanim pocisk doleci, to ludek juz bedzie gdzies indziej -w koncu on biegnie. Musze strzelic z wyprzedzeniem ^^

 

Jak pisalem - sprawa nie jest bardzo wazna bo i tak wiekszosc dzialek bedzie strzelala chaotycznie, ale przyda mi sie tez strzelanie "snajperskie" ^^

 

 

 

Mysle ze lepiej by bylo

do
{
_l = instance_nearest( x, y, Ludek );
} until( _l.zycie > 0 );

 

Chociaz jak mowie - nie rozwiazuje to problemu - bo ludzik wcale nie musi byc "nearest". Moze - tutaj teoretyzuje - zrobic petle po ludkach, pobierajac za kazdym razem nearest. Jak ten nearest jest martwy, to jego id wrzucic do tablicy. Jak za kolejnym obiegiem jego id jest w tablicy to nie bierzemy pod uwage. Itp...

Odnośnik do komentarza
Udostępnij na innych stronach

GML
if instance_exists(PARENT_LUDZIKA)

{

nrstENEMY=instance_nearest(x,y,PARENT_LUDZIKA);

cc=collision_circle(x,y,1000,nrstENEMY,0,1);

if cc=nrstENEMY.id && !collision_line(x,y,nrstENEMY.x,nrstENEMY.y,PARENT_WALL,0,1)

{

atack=1;

image_angle=point_direction(x,y,cc.x,cc.y);

}

else

{

atack=0;

}

}

else

{

atack=0;

}

Powyższy kod jest trochę bardziej skomplikowany niż to co chcesz osiągnąc ale wytłumaczę jak on działa.

 

GML
if instance_exists(PARENT_LUDZIKA)
tu jest sprawdzane czy dana instancja istnieje o parentach będziesz musiał sobie gdzieś poczytać.

GML
nrstENEMY=instance_nearest(x,y,PARENT_LUDZIKA);

cc=collision_circle(x,y,1000,nrstENEMY,0,1);

tutaj zapisujemy najbliższy obiekt (parent) do zmiennej nrstENEMY oraz

sprawdzamy czy wieżyczka stoi od parenta ludzika w odległości x<=1000 i pobieramy jego id zapisując do zmiennej cc

GML
if cc=nrstENEMY.id && !collision_line(x,y,nrstENEMY.x,nrstENEMY.y,PARENT_WALL,0,1)

teraz sprawdzamy czy kolizja [ cc=nrstENEMY.id ] wystąpiła i spawdzamy czy wieżyczka nas widzi przez ściany [ parent_wall ]

 

dalej to już proste:

GML
{

atack=1;

image_angle=point_direction(x,y,cc.x,cc.y);

}

namierzanie celu i atakowanie.

 

 

Jeżeli nie popełniłem błędu to jest wszystko dobrze.

Odnośnik do komentarza
Udostępnij na innych stronach

Witam ponownie ^^

 

Kod

do
{
_l = instance_nearest( x, y, Ludek );
} until( _l.zycie > 0 );

Nie za bardzo dziala. Próbowałem to wykonać przy do {} until i z zastosowaniem klauzuli while () {}

ale wciaz zacina program.

 

calosc dzialala mniej wiecej tak:

 

a = instance_nearest(x,y,ludek); //x i y to polozenie dzialka
while (a.zycie<=0) {
a = instance_nearest(a.x, a.y, ludek);
}

 

lub

 

a = instance_nearest(x,y,ludek); //x i y to polozenie dzialka
while (a.zycie<=0) {
b = a;
a = instance_nearest(b.x, b.y, ludek);
}

 

ale jakos wciaz zawiesza.

 

Co do kodu HuderLorda - calkiem fajny, ale nie do konca go rozumiem. Chyba nie o to chodzilo.

 

No i jeszcze raz - czy moze ktos potrafi znalezc pozycje w ktora trzeba celowac by trafic idacego ludzika? Wektory u mnie leza ^^

 

Ps. Patrzylem kod do powolnego obracania, ale to co mi sie znalazlo nie jest do konca dzialajace...

Odnośnik do komentarza
Udostępnij na innych stronach

W sumie co racja to racja. Jezeli beda 2 trupki obok siebie i zadnego innego ludka miedzy nimi to petla w nieskonczonosc. Lipny ten moj kod. Bede musial pokombinowac.

 

Zastanawia mnie jednak wykorzystanie tego drugiego - martwego ludka. Niby drugi obiekt, ale zoraz bardziej mi sie rozrasta ten kod ludka, bo po smierci musi miec nowe images, nowe zdarzenia (zanikanie ciala po ilus tam stepach), reakcje na wybuch - przeciez moze granat w poblizu wybuchnac wiec musi wyrzucic cialo w gore itp.

 

Swoja droga - kolejne pytania

 

1) Mam 5 obrazkowego sprita.

Jezeli ludek idzie to nie powinien wyswietlac klatek z konca - czyli 4,5 itp.

 

wiec

 

if (image_index==3) image_index = 0;

 

tylko ze to nie dziala

 

dziala natomiast

 

if (image_index>=3) image_index = 0;

 

sprawdzalem piszac mini tekst przy ludku - image_index liczony jest z przecinkiem? tak mi wyswietlalo. Ale skoro ta, to niby nie osiaga wartosci 3??? Hmm. Chyba ze by dac round ^^, ale to juz jakies maniaczne sie staje.

 

Powyzszy kod jednak chyba nie wyswietla image_index[3], wiec gubie jednego image.

 

6) moze jest lepsza metoda na obsluge spritow? Kilka spritow i w razie czego podmiana?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli wcześniej np. w create zmieniłeś image_speed to image_index będzie po przecinku w tedy trzeba użyć floor() ceil() lub round().

 

GML
if (floor(image_index)==3) image_index = 0;

 

EDIT: aha zapomniałem dodać że nie możesz dać w image_speed większej liczby niż 1 bo wtedy przynajmniej jedna klatka gifa będzie omijana.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli wcześniej np. w create zmieniłeś image_speed...

 

Zmienilem na 0.8 ^^

 

Kolejne pytanie:

 

Slyszalem juz o parentach. Moje pytanie jest takie:

Jaka jest roznica miedzy:

- Stworzniem nowej instacji z eventem create, w ktorym jest kod ustawiajacy wszystko co trzeba

- Skorzystaniem z parenta, ktory ma juz poustawiane.

 

Dziedziczenie ok. A reszta? A moze wydajnosciowo?

 

Koniec pytan, bo psuje przez to forum. Sorki z gory. Kolejne pytania raczej na nowych watkach. Pozdrawiam i dzieki za pomoc

Odnośnik do komentarza
Udostępnij na innych stronach

Nie.

 

1)Pierwszy z instancjami nie rozwiazany. Hmm. Srednio rozwiazany.

A) zastosowanie nowego obiektu - martwego ludzika. Calkiem mile, chociaz mi sie nie podoba

B) wylaczenie automatycznego celowania. Dzialka strzelaja "w kursor".

Ale to psuje postac gry. Dzialka maja byc automatyczne, ty tylko ustawiasz im opcje itp

2) Wykrywanie punktu "gdzie strzelac". Nie wykrylem. Pozostane na chaotycznym strzelaniu...

3) Wolny obrót - nie zaimplementowałem. Popróbuje... Wczoraj walczylem, ale zawiodlem ^^

 

Narazie wciaz trenuje, ale coraz lepszy obraz calosci mi sie nasuwa.

Dzialka beda mialy swoje wlasciwosci. Celnosc, liczba naboi, szybkostrzelnosc, zasieg i sila_ataku, czas ladowania. Celnosc bedzie wyliczana jakos z iloczynu celnosci "strzelca" (ktory bedzie obok dzialka - obslugiwal je), tak samo czas ladowania. Liczba naboi - to zaleznie od upgradeów, zasieg i sila tez ^^

 

Strzelcy tez beda mieli wlasciwosci: exp, celnosc, szybkosc przeladowywania dzialka, zycie?, strzaly krytyczne

 

Jeszcze musze wymyslec jak zdobywac kase. Pomyslalem sobie ze mozna by zrobic tak, ze z bunkra wysyla sie ludzika na pole bitwy, ktory idzie point_direction + wykrywanie drogi (patrzylem na przyklady) do lezacych zwlok. Jak dojdzie to je bedzie przeszukiwal i w razie testu random by je "okradal" ^^. Oczywiscie trzeba by chronic tego ludzika, bo zombiaki jak by widzialy takiego ludzika, to by sie point_direction w niego ^^

 

Ze szczegolami sobie poradze. najwyzej pojde na kompromisy. Tylko pewnie bede musial sie pobawic z globalnymi zmiennymi itp. bo duzo zaleznosci sie szykuje.

 

Myslalem sobie ze moze by tak kazdemu obiektowi w grze dac szybkosc jakas (zmienna). A jak by np byl koniec planszy to wtedy by sie pojawialo jakies podsumowanie czy cos, a w tym czasie speed = 0 (wtedy wszystko co sie rusza to by stawalo). Np ludek z wysokim LV by mial szybkosc 8 itp.

Przy takim zalozeniu latwo by mi bylo robic jakies motion blure dla poszczegolnych obiektow (a nie jak dla calosci za pomoca room_speed)..

Odnośnik do komentarza
Udostępnij na innych stronach

co do pierwszego tym z alarmem to kod ci nie działa bo alarm masz w stepie. Step resetuje ci alarma co klatke dlatego wynosi on zawsze wartość 1.

Ale możesz to rozwiązać robiąc własny alarm o tak:

create:

GML
time=0;

begin step:

GML
time+=1;

step:

GML
if time>=ileś tam

{

//akcja

time=0; //reset alarmu

}

 

EDIT:

A co do tego wolnego obrotu to też sprawa jest prosta. Zamiast gmowych direction i image_angle zastąp je swoimi zmiennymi

masz zrobiłem ci przykład Wolny obrót

Odnośnik do komentarza
Udostępnij na innych stronach

Dzieki wielkie. Chociaz z tym obrotem to bardzo dziecinna sprawa!

Zapomnialem tylko jednego ^^

W tamtym poscie dzialko mialo sie obracac 360 stopniowo, a przeciez u mnie kat obrotu to gora z 45-60 stopni ( i to zawyrzajac). Wiec nawet bez zadnej logiki moge sobie to wyliczac ^^

 

Wczoraj za to bawilem sie view i zmienilem kilka rzeczy:

Plansza bedzie dluzsza (tak na oko z 1000), a view z 500. Strzalkami lewo prawo mozna sie po niej przemieszczac

Mam juz rakiety - ktore po spacji strzelaja w niebo, aby po kilku sekundach spasc z nieba na ziemie - obliczane randomowo y uderzenia + x (ale x powinien miescic sie w view) ^^ - dziala.

 

Tylko teraz mam problem z odrzucaniem ludzikow ^^ Jak to zrobic?

 

Na razie zrobilem tak: jest sobie dzialko AA ^^. Stzela rakieta w gore (tworzy nowy obiekt rakieta). Rakieta ma alarm ktory po n sekundach ustawia ja na y=-30 i random x, i potem wali nia w ziemie. Jak dojdzie do y_impact (czyli uderzy w ziemie) to instance_destroy + tworzy obiekt wybuch, ktory ma zdarzenie - "on end animation" - instance_destroy.

I tutaj sie robi problem. Moge skorzystac z eventa collision (bo jeszcze nie opanowalem w kodzie obslugi colision) i zmieniac speed + gravity itp dla obiektu other, ale wczoraj mi to nie wyszlo ^^

Myslalem ze moze by zastosowac technike ze skoku z platformowek? Plus problem jest taki, ze nie potrafie do konca obsluzyc obszaru dzialania wybuchu...

 

Zalozenie jest takie:

 

jak wybuch to randomowo wyrzuca w gore, po czym ludek spada martwy na ziemie (eventualnie traci sporo zycia).

Wlasnie mi przyszlo do glowy, ze moze by obliczac tak (dla wybuchu):

if (x > other.x) {
other.direction = 30 + random(90)
} else {
other.direction = 180 - random(90)
}

Plus podobne dla y, ale to wciaz nie obsluzy tego obszaru.

 

 

Pewnie bede musial dodatkowo obsluzyc grawitacje w obiekcie ludzika. Problem jest taki, ze ta plansza po ktorej ida ludki jest "wielowymiarowa" czyli nie ma jednej podlogi w pozycji y, ale kazdy ludzik ma swoja "podloge po ktorej idzie", wiec dodatkowe obliczenia sie robia + przeciez ludzik po wybuchu nie musi upasc na ziemie w bok (nie zmieniajac pozycji podlogi), ale tez moze go wyrzucic pod katem - czyli wtedy jego "y_podloga" sie nieco zmieni

 

Przygotowalem na szybko obrazek pogladowy:

obrazek_pogladowy.gif

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...