Skocz do zawartości
Arekadiusz

Lokalizacja początkowa

Rekomendowane odpowiedzi

gml prawde Ci powie!

 

GML
instance_number( object ) //zwróci Ci ilość obiektów

instance_find( object, num ) //zwróci Ci id obiektu o podanej nazwie i numerze instancji</span>

 

polecam również moj przykład bloczów https://gmclan.org/up1558_11_bloczki.html

w odstępie czasowym losuje jeden z kilku bloczków, wykorzystując jego id usuwa je, zmieniając mu przy tym sprite : )

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

To może innaczej bo nie kapuje.

Założmy że chcę zrobic edytor plansz do mojej gry.

Mam siedem obiektów: obj_ludzik, obj_sciana , obj_punkt , obj_mis , obj_bomba, obj_wrog1 ,obj_wrog2. Tworzę planszę w edytorze map. Umieszczam w niej 1 ludzika,8 ścian, 3 misie, 6 bomb, 5 wrogów1 i 5 wrogów2 .I tu proszę o pomoc. Nie chcem zapisywac planszy jako .sav lub inne rozszerzeni tylko jako plik tekstowy, w którym będą zapisane pozycje wszystkich obiektów(tych których jest po kilka też). Proszę też o pomoc w zrobieniu potem mechanizmu wczytywania tej planszy do gry (tak aby wszystkie obiekty były w tym samym miejscu co w edytorze i żeby każdy miał swoją funkcję taką jak w innych planszach).

Chybaże jest jeszcze prostszy sposób o którym niewiem?

 

Prosiłbym o jakiś przykład.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nie wiem czy takie coś ma prawo bytu. Ale może:

GML
with (all)

Teraz zapisujesz te wszystkie pierdółki (x i y i cośtam) oraz nazwę obiektu.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

GML
ob[ 0 ] = obj_ludzik

ob[ 1 ] = obj_sciana

ob[ 2 ] = obj_punkt

ob[ 3 ] = obj_mis

ob[ 4 ] = obj_bomba

ob[ 5 ] = obj_wrog1

ob[ 6 ] = obj_wrog2

 

file_txt = file_text_open_write( 'mapa_txt.map' );

for ( i = 0; i < 6; i += 1 )

{

for ( n = 0; n < instance_number( ob[ i ] ); n += 1 )

{

id_ = instance_find( ob[ i ], n )

text = string( ob[ i ] ) + '|' + string( id_.x ) + '|' + string( id_.y );

file_text_write_string( file_txt, text );

file_text_writeln( file_txt );

}

}

file_text_close( file_txt );

 

 

po wykonaniu kodu wpisze Ci do pliku mniej więcej coś takiego:

7|488|215

74|98|798

...

numer_obiektu|jego_poz_X|jego_poz_Y

 

Co do wczytywania to wczytujesz po kolei linijki z pliku, dzielisz string względem separatorów ( znak: "|" ) i tworzysz obiekty : )

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

po to są dwie pętle.

 

pierwsza przelatuje po zindeksowanych obiektach,

a druga po każdej instancji wyżej iterowanego obiektu : )

 

sam sprawdź!

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Marek.S :

U mnie wyświetla się taki błąd:

 

 

___________________________________________

ERROR in

action number 1

of Create Event

for object object0:

 

Error in code at line 14:

text = ob[ i ] + '|' + id_.x + '|' + id_.y

^

at position 23: Wrong type of arguments to +.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

pisałem z głowy, nie sprawdzałem =p

 

zmień na

GML
text = string( ob[ i ] ) + '|' + string( id_.x ) + '|' + string( id_.y );

 

E: dobra pomieszałem i z n, poprawiłem powyższe kod.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Marek.S :

Zmieniłem.

Teraz wywala kolejny błąd:

 

 

___________________________________________

ERROR in

action number 1

of Create Event

for object object0:

 

Error in code at line 11:

for ( n = 0; i < instance_number( ob[ i ] );

^

at position 37: Unknown variable ob or array index out of bounds

 

EDIT:

Ten już znikł ale jest kolejny:

___________________________________________

ERROR in

action number 1

of Create Event

for object object0:

 

Error in code at line 11:

for ( n = 0; n < instance_number( ob[ n ] ); n += 1 )

^

at position 36: Unknown variable ob or array index out of bounds

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jo. :P

 

przeczytaj mój edit,

skopiuj sobie ponownie ten kod z 3 postów wyżej

 

E: jeszcze jedna mała poprawka ;p

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ok działa.

Prosiłbym jeszcze tylko o pomoc we wczytywaniu planszy do gry.

Czy trzeba tworzyc każdy obiekt osobno??

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ja mam to tak zrobione:

GML
var numeracja, sec, nr;

sec=0

nr=0

numeracja[nr]=0

with (all) {

ini_open('mapa.ini')

sec = x div 1000 + y div 1000 * 3;

nr = sec;

numeracja[nr] += 1;

ini_write_string('s' + string(sec), 'obj' + string(numeracja[nr]), object_get_name(object_index));

ini_write_real('s' + string(sec), 'objind' + string(numeracja[nr]), object_index);

ini_write_real('s' + string(sec), 'objx' + string(numeracja[nr]), x);

ini_write_real('s' + string(sec), 'objy' + string(numeracja[nr]), y);

ini_write_real('s' + string(sec), 'total', numeracja[nr]);

ini_close()

}

Można też z pętlą for, ale chyba łatwiej z with :). Ten kod ci zapisze nazwę obiektu, index, x, y, podzieli na sektory i zapisze liczbę wszystkich obiektów w sektorze. Łatwo go zmodyfikować żeby nie zapisywał sektora. Tylko potem jeszcze musisz sobie zaszyfrować plik za mapą coby nikt sobie nie edytował :)

Marek, też próbowałem z for ale jak ktoś ma dużo obiektów w grze to niewygodne bo trzeba wszystkie do tablic dodać ;/ A jak nie chce żeby wszystkie obiekty sie zapisywały to wystarczy sprawdzać ifem index obiektu.

EDIT: jak dodawałem to posta wyżej jeszcze nie było :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Może jest to dobry sposób, lecz proszę o pomoc Marka.S ponieważ on pomógł mi napisac ten pierwszy kod.

EDIT: Niedoczytałem że to jeszcze dotyczyło zapisu.

 

Proszę o pomoc Marka.S z wczytaniem planszy do gry.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

bartas mylisz sie :P moj sposób wcale nie jest skomplikowany. A jeśli chodzi o ta większą ilość obiektów to tak samo moge sprawdzić warunkiem na pętli :P

Napisze Ci ten odczyt jak bede w domu, teraz pisze z komorki :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Kiedyś był taki art na GMClanie (nie mogę go teraz znaleźć) gdzie bodajże Tymon przedstawiał właśnie taki skrypt do zapisywania i odczytywania obiektów z rooma. Marek.S ma bardzo podobny skrypt ;) Kiedyś mniej/więcej zapisałem ten skrypt Tymona, więc umieszczę go tu, jeśli Tymek pozwoli ;p A ewentualne błędy sobie poprawisz.

GML
var _ilosc_obiektów, _wszystko;

_ilosc_obiektow = 0;

_wszystko = "";

 

file_read_open( argument0 );

_wszystko = file_read_string();

file_close();

 

_ilosc_obiektow = string_copy(_wszystko, 1, string_pos('|', _wszystko) - 1);

_wszystko = string_replace(_wszystko, _ilosc_obiektow + '|', '');

 

repeat (real(_ilosc_obiektow))

{

_data_temp = string_copy(_wszystko, 1, string_pos('|', _wszystko) - 1);

_wszystko = string_replace(_wszystko, _data_temp + '|', '');

if (string_replace_all(_data_temp, ' ', '') != '')

{

_x = string_copy(_data_temp, 1, string_pos('|', _data_temp) - 1);

_data_temp = string_replace(_data_temp, _x + '|', '');

_y = string_copy(_data_temp, 1, string_pos('|', _data_temp) - 1);

_data_temp = string_replace(_data_temp, _y + '|', '');

_object_index = string_copy(_data_temp, 1, string_pos('|', _data_temp) - 1);

_data_temp = string_replace(_data_temp, _object_index, '');

if (string_replace_all(_x, ' ', '') != '' && string_replace_all(_y, ' ', '') != '' && string_replace_all(_object_index, ' ', '') != '')

{

instance_create(_x, _y, _object_index);

}

}

}

To Ci pewnie też pomoże :) Pozmieniałem nazwy (jakie to były czasy) żeby sobie wtedy ułatwić, a wyszły błędy ;P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

możesz sprawdzić czy działa:

GML
file_txt = file_text_open_read( 'mapa_txt.map' );

 

while ( not file_text_eof( file_txt ))

{

line = file_text_read_string( file_txt );

file_text_readln( file_txt );

 

pos = string_pos( '|', line );

object = string_copy( line, 1, pos -1 );

line = string_copy( line, pos + 1, string_length( line ))

 

pos = string_pos( '|', line );

xx = string_copy( line, 1, pos -1 );

line = string_copy( line, pos + 1, string_length( line ))

 

yy = line;

 

instance_create( real( xx ), real( yy ), real( object ));

 

}

file_text_close( file_txt );

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Marek.S :

Niestety nie działa. Nie pojawia się także żaden błąd. Poprostu nic nie wczytuje.

Pokombinuje jeszcze, ale proszę o pomoc.

EDIT: W jakim evencie to wywoływac? Ja wywołuje w Left Button.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Mój projekt?

Jeszcze nie zacząłem go robić.

Zrobiłem tylko jakąś próbną gierkę z jakiś gotowych spritów. Nie da się jeszcze nawet ustawiać obiektów.Poustawiałem je ręcznie

Ale dam ci link do tego pliku. Prosiłbym abyś poprawił błąd.

Link: >>>PLIK<<<

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Po pierwsze wczytywany tekst jest stringiem, trzeba go na liczbe rzeczywistą przerobić.

Niestety zła kolejność argumentów w instance_create =p

 

GML
file_txt = file_text_open_read( 'mapa_txt.map' );

 

while ( not file_text_eof( file_txt ))

{

line = file_text_read_string( file_txt );

file_text_readln( file_txt );

 

pos = string_pos( '|', line );

object = string_copy( line, 1, pos -1 );

line = string_copy( line, pos + 1, string_length( line ))

 

pos = string_pos( '|', line );

xx = string_copy( line, 1, pos -1 );

line = string_copy( line, pos + 1, string_length( line ))

 

yy = line;

 

instance_create( real( xx ), real( yy ), real( object ));

 

}

file_text_close( file_txt );

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Marku a jeżeli mam w grze do każdego z tych obiektów dodaną zmienną active- dzieki której dany obiekt sie włącza to jak po załadowaniu Twoim kodem dodać do tworzonych obi tą zmienną?

np mam obj tower_photon_cannon który ma active=true w grze, dzięki czemu strzela. Zapisuje Twoim sposobem i później przy odczycie chciałbym ustawic tę zmienną także na true.

 

zrobiłem tak ale dupa z tyłu.. :

GML
instance_create( real( xx ), real( yy ), real( object ));

object.active=true;

 

E: poradziłem sobie

 

GML
tower=real(object);

tower.active=true;

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Mam problem!!

Robiłem kodem Marka.S zapis w edytorze w oddzielnej grze i sprawdziłem że jest poprawny.

Wczytywanie w grze też działa lecz np. zamiast opunkt tworzy osciana, a niektórych obiektów nie tworzy wogóle! Dlaczego?

Czy gra i edytor muszą byc w jednej grze?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

nie muszą, ale jeśli przy tworzeniu drugiego projektu dodawałeś obiekty w innej kolejności niż w pierwszym to przypiszą im się różnie indexy

moje wczytywanie polega właśnie na zapisie tych indeksów i potem odczytaniu i na ich zasadzie odtwarzane są instancje

 

po chłopksu, jeśli w projekcie zapisu masz np o_sciana z indeksem 1, a w projekcie drugim obiektem o indeksie 1 jest miś to stworzy misia a nie ścianę.

 

jeśli chcesz aby było tak samo dopilnuj aby w obu projektach obiekty były tych samych obiektów, jeśli nie to trzeba przebudować system, zapisywać zamiast indeksów nazwy bądź jakiś identyfikator zastępczy.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Marek.S:

A to dużo trzeba by było przebudowywać?

Bo jeżeli tak to jaki jest inny sposób bo zależy mi na tym żeby to było oddzielnie, a nie chcem układać obiektów od nowa.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×