alwin Opublikowano 25 Lutego 2010 Udostępnij Opublikowano 25 Lutego 2010 Na początku chciałbym się przywitać. Witam serdecznie, mam nadzieję że współpraca z Wami będzie dobrze sie układać :thumbsup: Od razu powiem może jak trafiłem do Was- otóż z grami mam juz trochę wspólnego.. zajmowałem się programowaniem w actionscripcie flashowym, zawsze kłóciłem sie z bratem który- tworzy gry w GM czym się je lepiej robi- flashem czy właśnie GM. No i sam nie wiem.. choc z tego co widzę(przez ostatni tydzień studiowałem dokumentację, przykłady i tutoriale) to macie ogromna pomoc w postaci gotowych juz zmiennych, np odszukiwanie drogi,kolizje czy omijanie przeszkód.. aż się zgarbiłem bo w AS musiałem wszystkie funkcje,klasy itp pisać samemu. A tu proszę - miła niespodzianka:) No więc postanowiłem spróbować sił tutaj. Mam problemy z przestawieniem się niestety na sposób robienia gier w tym programie- jest całkiem inny niż we flashu.. ale damy radę;) No więc na początek chciałbym się podszkolić ogólnie, tworząc jakiegos tower defensa. I pytanie nr 1- mam obj_tower- czyli wieża z której będą strzelali do wrogów.Obraca się ona w kierunku wroga No i jeżeli wróg wejdzie w zasięg mojego obiektu tworzony jest pocisk lecący w jego stronę. dla pocisku zrobiłem tak GML direction=obj_tower.direction; no i Leci sobie w stronę gdzie "patrzy" tower. z Jedną wierzą nie ma problemu.. ale jak to w takiej grze będzie ich więcej no i tu przy testowaniu wychodzi problem.. kolejne pociski z innych wierz przyjmują za direction , direction tej PIERWSZEJ wieży która została stworzona. Także wszystkie naboje lecą w kierunku takim samym.. Myślałem że każdy tower to osobny obiekt z którego będzie szczytywana prywatna zmienna dirtection ale sie pomyliłem. Pewnie to cos prostego ale no nie wiem jak sobie poradzic z tym.. w AS uzywałem CLASS dla obiektów więc każdy był czymś odrębnym. pozdro Alwin Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Mentoss Opublikowano 25 Lutego 2010 Udostępnij Opublikowano 25 Lutego 2010 szczerze mowiac nie wiem jak to bezproblemowo rozwiazac, ale wiem 2 rzeczy: 1. jezeli piszesz obj_tower. to już masz sciezke prowadzaca do wiezy, a ze kierunki wiez sa rozne, to GM bierze pierwsza 2. mozesz zrobic limit wiez, i nazwac je np. wieza1, wieza2... wiezaN, a następnie pociski pocisk1, pocisk2... pociskN. Działałoby to na zasadzie: wieza1 tworzy obiekt pocisk1, który leci w kierunku, wskazywanym przez wieze1 itd. do tego pytanie: Czy pocisk nie bedzie skrecal, jesli wieza po wystrzeleniu zmieni kierunek ??? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lenin Opublikowano 25 Lutego 2010 Udostępnij Opublikowano 25 Lutego 2010 zmień to na: GML (step wiezy) near_wrog=instance_nearest(x,y,o_wróg) //pobierasz id najbliższego obiektu o_wrog to zmiennej near_wrog direction=point_direction(x,y,near_wrog.x,near_wrog.y) //ustawiamy direction w kierunku najbliższego wroga p=instance_create(x,y,o_pocisk) //tworzymy pocisk i jego id zapisujemy do zmiennej p p.direction=direction //stworzonemu pociskowi nadajemy kierunek równy kierunkowi wieży p.speed=10 //i speed</span> jednym słowem operuj tym wszystkim z poziomu wieży :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 25 Lutego 2010 Autor Udostępnij Opublikowano 25 Lutego 2010 Znaczy akurat speed i inne tego typu dla pocisku będę tworzył w ich obiektach, tak bedzie chyba lepiej bo jedna wieża może używać różnych broni::) Dzieki za podpowieź, ciekawa ta funkcja wykrywająca najblizszego wroga. A jeszcze mam takie pytanko- w create wierzy mam zmienną bullet_int=8; odpowiada ona za ilość pocisków którą dysponuje. przy każdym wystrzale zrobiłem -=1 . Zrozumiałe. hmm ale problem w tym że znów mam podobny błąd.. próbowałem z tym ID robić ale nie wyszło. GML id_number=instance_id; id_number.bullet_int=8; i później w alarmie GML id_number.bullet_int-=1; Ale się kaszani i wystrzał jednej wieży skutkuje odjęciem naboju każdej z nich:/ jak myślisz? jak to rozwiązac? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
copoconaco Opublikowano 25 Lutego 2010 Udostępnij Opublikowano 25 Lutego 2010 bardzo latwo: jesli wykonujesz operacje na zmiennych wewnatrz jakiegos obiektu - np w evencie step dla obj_tower to wpisanie 'amunicja-=1' bedzie dotyczyc zmiennej amunicja wewnatrz danej instancji objektu obj_tower wiec albo w alarmie, albo w stepie dla obj_tower dopisujesz to co napisal lenin if(amunicja>0) { near_wrog=instance_nearest(x,y,o_wróg) //pobierasz id najbliższego obiektu o_wrog to zmiennej near_wrog direction=point_direction(x,y,near_wrog.x,near_wrog.y) //ustawiamy direction w kierunku najbliższego wroga p=instance_create(x,y,o_pocisk) //tworzymy pocisk i jego id zapisujemy do zmiennej p p.direction=direction //stworzonemu pociskowi nadajemy kierunek równy kierunkowi wieży p.speed=10 //zmniejszanie amunicji amunicja-=1; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lenin Opublikowano 25 Lutego 2010 Udostępnij Opublikowano 25 Lutego 2010 chwila w którym obiekcie to masz? W pocisku czy wieży? daj normalnie w create wieży bullet_int=8 i przy strzale bullet_int-=1 i po problemie. Znaczy akurat speed i inne tego typu dla pocisku będę tworzył w ich obiektach, tak bedzie chyba lepiej bo jedna wieża może używać różnych broni rodzaj broni przechowuj w zmiennej. Naprawdę wygodniej jest w takim wypadku mieć to w jednym obiekcie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 25 Lutego 2010 Autor Udostępnij Opublikowano 25 Lutego 2010 Czyli np damage,speed bulleta- wszytsko mieć z towerze? a pózniej nie będzie problemu z zaimplementowaniem kolizji i odejmowaniem, odpowiedniego damage wrogowi? PS D&B, Dubstep ROX:D:D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lenin Opublikowano 25 Lutego 2010 Udostępnij Opublikowano 25 Lutego 2010 możesz jeszcze inaczej np: GML //create wieży bron=0 //0- blaster 1- laser itd. // step wieży if(amunicja>0) { near_wrog=instance_nearest(x,y,o_wróg) //pobierasz id najbliższego obiektu o_wrog to zmiennej near_wrog direction=point_direction(x,y,near_wrog.x,near_wrog.y) //ustawiamy direction w kierunku najbliższego wroga p=instance_create(x,y,o_pocisk) //tworzymy pocisk i jego id zapisujemy do zmiennej p p.direction=direction //stworzonemu pociskowi nadajemy kierunek równy kierunkowi wieży p.speed=10 switch(bron) { case 0: { p.damage = 10; break; } //gdy bronią jest blaster case 1: { p.damage = 30; break; } //gdy bronią jest laser //itd------------------------- } amunicja-=1; } GML //create pocisku damage=noone //kolizja z wrogiem other.hp-=damage if other.hp<=0 with(other) instance_destroy() instance_destroy() Po prostu przy tworzeniu pocisku ustawiasz jego damage w zależności od tego jaka broń jest aktualna. PS D&B, Dubstep ROX:D:D Dubstepy u mnie akurat odpadają :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 27 Lutego 2010 Autor Udostępnij Opublikowano 27 Lutego 2010 Witka znów :thumbsup: Naprawdę idzie mi coraz lepiej nauka gm, dzieki Wam chłopaki. Teraz kolejna sprawa- w step wieży mam taki oto kod: GML if (instance_exists(obj_bug)){ // sprawdzamy czy istnieje jakikolwiek wróg near_wrog=instance_nearest(x,y,obj_bug) //pobierasz id najbliższego obiektu o_wrog to zmiennej near_wrog direction=point_direction(x,y,near_wrog.x,near_wrog.y) //ustawiamy direction w kierunku najbliższego wroga if (point_distance(x,y,near_wrog.x,near_wrog.y) < bullet_zasieg) // jezeli najblizszy wrog jest w zasiegu wiezy { if strzela=true { p=instance_create(x,y,obj_bullet_tower1) //tworzymy pocisk i jego id zapisujemy do zmiennej p p.direction=direction //stworzonemu pociskowi nadajemy kierunek równy kierunkowi wieży p.speed=bullet_speed; //i speed</span> p.image_angle=direction bullet_int-=1; alarm[0]=bullet_delay; strzela=false } image_angle=direction; } else{}; } gdzie obj_bug to wróg do którego mierzy tower. Słuchajcie a jeżeli tych wrogów będzie np 10 rodzajów? powiedzmy obj_bug1,obj_bug2,obj_bug3 itp to jak przerobić ten kod wyżej? tzn głównie chodzi mi o GML if (instance_exists(obj_bug)){ Czy muszę ten cały blok powtarzać do każdego kolejnego buga? GML if (instance_exists(obj_bug2)){ GML if (instance_exists(obj_bug3)){ próbowałem cos zrobic na petli GML for (i=0; i<=9; i+=1){ list = i+1; zmienna="obj_bug"+string(i); if instance_exists(zmienna){ Cos takiego wymyśliłem ale nie działa.. ps. czy jest możliwość porządkowania kodu w programie? tzn żeby się ładnie poukładał blokami, ifami itp? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 27 Lutego 2010 Udostępnij Opublikowano 27 Lutego 2010 Stwórz obiekt bug_parent i każdemu robalowi ustaw Parent:bug_parent. Teraz odwołuj się towerem do parenta, nie trzeba do każdego z osobna. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 27 Lutego 2010 Udostępnij Opublikowano 27 Lutego 2010 Zamiast robić 10 obiektów o nazwach "obj_bug1",...,"obj_bug10", można zrobić cały kod 10 bugów w jednym :) Jak to działa? No np. tworzysz w jakimś miejscu buga i dajesz mu typ = /i sobie wybierzesz/ Np. w obiekcie "creator_bug1" możesz tak zrobić: GML a = instance_create(x,y,obj_bug) a.typ = 1 No i używając konstrukcji switch typ {case 1:{kod buga 1} case 2:{kod buga 2}...} można wytworzyć dowolny kod w jednym obiekcie :) Jeśli się nie mylę, to istnieje możliwość użycia parentów, ale to już kto inny opisze, ja używam mojego sposobu. Może brzmi to trochę niezrozumiale, ale kiedyś się przyzwyczaisz. Całkiem niedługo - mnie zajęło to 8 mies. :) E: tak myślałem - wątpliwości wzbudził u mnie "instance_nearest" - pomyślałem, że parent tego nie wykrywa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 27 Lutego 2010 Udostępnij Opublikowano 27 Lutego 2010 próbowałem cos zrobic na petli GML for (i=0; i<=9; i+=1){ list = i+1; zmienna="obj_bug"+string(i); if instance_exists(zmienna){ To raczej nie zadziała, ponieważ argumentem w instance_exist() id objektu, a nie string. Jakby co, to mnie poprawcie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 27 Lutego 2010 Autor Udostępnij Opublikowano 27 Lutego 2010 To raczej nie zadziała, ponieważ argumentem w instance_exist() id objektu, a nie string. Jakby co, to mnie poprawcie. Też właśnie doszedłem do takich wniosków.. próbowałem rozwiazać ten problem tak jak to zawsze robiłem w ActionScript, jak widać różnice są widoczne:) Zamiast robić 10 obiektów o nazwach "obj_bug1",...,"obj_bug10", można zrobić cały kod 10 bugów w jednym :) Jak to działa? No np. tworzysz w jakimś miejscu buga i dajesz mu typ = /i sobie wybierzesz/ Np. w obiekcie "creator_bug1" możesz tak zrobić: GMLa = instance_create(x,y,obj_bug) a.typ = 1 No i używając konstrukcji switch typ {case 1:{kod buga 1} case 2:{kod buga 2}...} można wytworzyć dowolny kod w jednym obiekcie :) Jeśli się nie mylę, to istnieje możliwość użycia parentów, ale to już kto inny opisze, ja używam mojego sposobu. Może brzmi to trochę niezrozumiale, ale kiedyś się przyzwyczaisz. Całkiem niedługo - mnie zajęło to 8 mies. :) Dobry pomysł! Też jest to jakieś rozwiązanie, na pewno kiedyś skorzystam z tego myku, ale teraz zrobie to jak napisał Makary155- dzięki wielkie, teraz to już pikus z tego co widzę :thumbsup: Dzięki chłopaki. EDIT: No i mam kolejny problem.. Otóż zrobiłem akcję w Tower1= że jeżeli dojdzie do kolizji(event) z inną wieżą, wtedy coll_path=1; jezeli zmienna ma tą wartość- wtedy nie można w tym miejscu wybudować innego towera. Ale myk powstaje kiedy 'zjadę' juz z tegom obiektu- ta mienna nadal posiada ta wartość! próbowałem zrobić tak: W begin step wieży GML { if !collision_rectangle(x-48,y-29,x+48,y+29,ob_tower_parent,0,1) coll_path = 0; } ale dupa:/ ps origin sprita jest wycentrowany na x:48,y:29 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 7 Marca 2010 Udostępnij Opublikowano 7 Marca 2010 Przerzuć warunek do stepa: GML if(warunek sprawdzania==1) coll_path=1; else//dopisz to coll_path=0; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 8 Marca 2010 Autor Udostępnij Opublikowano 8 Marca 2010 Dzięki, wspólnymi siłami powoli kończę tę grę:) hmm a jak w GML zastąpić klocka Align to Grid? Szukałem w pomocy ale nic nie ma na ten temat. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Assassin Opublikowano 8 Marca 2010 Udostępnij Opublikowano 8 Marca 2010 move_snap(hsnap,vsnap) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 Poradziłem sobie:) Niedługo zamieszczę wersje demo a narazie screen- grafika by blizzard entertainment, efekty i programowanie grafiki moje:) na tym wynalazku wszytskiego sie uczę, dlatego graficzki pozyczyłem;) A teraz kolejne pytanko- mam taki kod gml w mouse released mojej ikony Marina którego to mozna nająć do bunkra- GML if (global.money >=marine_price){ //mamy kasy wiecej niz potrzeba if instance_exists(global.ii_select){ // obj zaznaczony-tower if(global.ii_select.in_tower_MAX=2){ // jezeli max mozemy miec 2 w bunkrze; if(global.ii_select.in_tower<2){ // sprawdz czy mamy w bunkrze mniej niz 2 //////////////////// ALLERT ///////////////// run_allert_massage=instance_create(320,780,obj_allert_massage); run_allert_massage.color=c_yellow; run_allert_massage.massage="+1 Marine w bunkrze!"; //////////////////// ALLERT ///////////////// global.money-=5; global.ii_select.in_tower+=1;} // i dodaj jednego }else if(global.ii_select.in_tower_MAX=4){ // jezeli max mozemy miec 4 w bunkrze; if(global.ii_select.in_tower<4){ // sprawdz czy mamy w bunkrze mniej niz 4 //////////////////// ALLERT ///////////////// run_allert_massage=instance_create(320,780,obj_allert_massage); run_allert_massage.color=c_yellow; run_allert_massage.massage="+1 Marine w bunkrze!"; //////////////////// ALLERT ///////////////// global.money-=5; global.ii_select.in_tower+=1;} // i dodaj jednego }}} else if(global.money<marine_price){ //////////////////// ALLERT ///////////////// run_allert_massage=instance_create(320,780,obj_allert_massage); run_allert_massage.color=c_red; run_allert_massage.massage="${:content:}lt;"+string(marine_price); //////////////////// ALLERT ///////////////// } Mam bunkier. Klikamy na niego- i domyślnie można mieć w nim 2 marinsów, po upgradzie- 4. No i po zaznaczeniu go pojawia sie ikonka \- button dzieki któremu kupujemu jednostkę. Dlaczego jeżeli np marine kosztuje 5$, a mam kasy 20$ to po kliknięciu na ikonkę kupuje mi od razu 4? a nie jednego? chyba cos namieszałem w tym kodzie.. czasami klikam ten button i mi normalnie kupi jednego za 5$, a jak kliknę tak jakby mocniej i dłużej to wyda mi kase- tyle ile mam obecnie i kupi powiedzmy do max 4 marinów.. ktos coś zrozumiał?;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 Masz if(mouse_check_button_released(mb_left)){cała reszta}, czy if(!mouse_check_button(mb_left)){cała reszta}? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 Wiesz co zrobiłem to klockiem- left released - w akcji dałem ten kod. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 Klockiem Check Mouse? Jeżeli tak, to on sprawdza ciągle czy masz naciśnięty LPM czy też nie. Dlatego Ci czasem wariuje. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 Poważnie? Hmm ale jak.. przecież mouse released- akcja powinna się wykonać raz- kiedy nacisnę i "wycisnę" klawisz mychy. Ale spróbuję z czystym kodem jak mi podałeś. To w stepie tal? juz sprawdzam. EDIT: Dupa.. GML if(mouse_check_button_released(mb_left)){ if ((instance_position(mouse_x,mouse_y,obj_icon_marine))){ i efekt ten sam.. cos musi być w kodzie nie tak.. kurczak sam nie wiem:/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 GML if mouse_check_button_released(mb_left) & mouse_check_button_pressed(mb_left) if ((instance_position(mouse_x,mouse_y,obj_icon_marine))){ teraz powinno byc dobrze(chyba) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 GMLif mouse_check_button_released(mb_left) & mouse_check_button_pressed(mb_left) To nigdy nie będzie prawdziwe- jak mozna jednocześnie mieć myszkę wcisniętą i wycisniętą? <_< :rolleyes: EDIT: rozkminiłem jak to mi działa/sie sypie. klikam ikonkę szybko- normalnie dodaje mi jednego. jak kliknę dłużej i trzymam ja wcisniętą przez kilka sekund, puszczam- juz dodaje mi 2, 3 marinsów:/ Chyba liczy mi ten kod juz przy wcisnięciu ikony i zależnie jak długo trzymam wcisniętą.. help:/ paranoja.. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 "&& != &" & = bitwise :) E: Btw, w Twoim kodzie raczej nie ma błędów. Może gdzieś go powtarzasz? E2: Spróbuj jeszcze tak. Przerzuć cały ten kod do Eventa Mouse Left releassed Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 ja tak robilem jak powiedzialem i dzialalo sprawdz a candy moze miec racje Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 O tym operatorze nie słyszałem jeszcze:) Ten kod w ogóle mi nie działa na mojej ikonce.. hmm w zasadzie kod jest powtarzany ponieważ jeżeli zaznaczymy bunkier jest tworzona, kiedy odznaczymy ikona znika i pojawia sie nowa po zaznaczeniu innego budynku.no nic.. bedę musiał powalczyc trochę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 to moze tak: w evencie "left pressed" wpisz GML if kasa>5 {tworzenie marina} git? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 Hmm.. chyba rozkminiłem ten błąd. Wszyscy mieliśmy rację- mój kod od początku powinien działać. Mam błąd w silniku gry global.ii_select.in_tower+=1; powinno dodawac marina do obecnej zmiennej obiektu, a dodaje mi do zmiennej poprzednio zaznaczonego. Ale babol! Dzięki wszytkim za uwagę, narazie kończę, jeszcze sie odezwę :thumbsup: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
TheMarcQ Opublikowano 14 Marca 2010 Udostępnij Opublikowano 14 Marca 2010 przez ciebie stracilem tyle czasu a ty wyskakujesz z takim czyms?! ARGHHHH! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
alwin Opublikowano 14 Marca 2010 Autor Udostępnij Opublikowano 14 Marca 2010 Naprawdę to doceniam.. przecież specjalnie tego nie zrobiłem żeby Ci czas zająć. Chociaż...;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę