Skocz do zawartości

Kilka Obiektów jednego typu.


alwin

Rekomendowane odpowiedzi

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

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

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

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

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

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

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

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

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

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

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

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;)

screen1sg.png

 

 

 

 

 

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

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

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

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

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

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ę...