Skocz do zawartości

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

Odnośnik do komentarza
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.

Odnośnik do komentarza
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 : )

Odnośnik do komentarza
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 +.

Odnośnik do komentarza
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

Odnośnik do komentarza
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

Odnośnik do komentarza
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

Odnośnik do komentarza
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 );

Odnośnik do komentarza
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 );

Odnośnik do komentarza
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;

Odnośnik do komentarza
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?

Odnośnik do komentarza
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.

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