Skocz do zawartości

Zachowanie położenia


Rekomendowane odpowiedzi

Cześć, jakiś czas tamu pisałem tutaj temat o zachowaniu położenia po przejściu z rooma 1 do do 2 czyli np z ulicy do budynku. Wszystko działa, problem zaczyna się jednak, gdy chcę przejść z rooma 2 do 3 i tak dalej :) czyli np. z budynku do jego kolejnej części, próbowałem kombinować, niestety nie wiem jakbym się starał, postać nie zachowuje położenia z rooma 2 po wyjściu z rooma 3. Jakiego kodu mam użyć w tym przypadku?

 

 

@EDIT - dodam że kod po części działa, przenosi mnie z roomów, ale nie do końca zachowuje wyjściowe położenie.

Odnośnik do komentarza
Udostępnij na innych stronach

nie mam tego ustawionego w żadnym, a jak odpalam, to błędy niektórych obiektów wyskakują.

EDIT - Rozrysuję jak to ma być.

Stoję przed blokiem, wchodzę:

fr1.png

 

Stoję na klatce:

fr2.png

Jestem koło drzwi do piwnicy, wchodzę:

fr3.png

Jestem w piwnicy, wychodzę i chcę być w tym samym punkcie, w którym wszedłem:

fr4.png

A Ląduję albo gdzieś na schodach, albo tu:

fr2.png

Odnośnik do komentarza
Udostępnij na innych stronach

Zrób listę, będziesz potrzebować 3.

1 ma ID rooma, 2 ma X a 3 Y.

Działanie w następujący sposób:

1.Chcesz wejsc w inny room

2.Kod szuka czy na liscie jest info z tego roomu, jesli tak to je usuwa.

3.Nastepnie tworzy nowe info dla tego roomu z obecną pozycją.

4.Przechodzisz do następnego rooma, do tego który chciałeś odwiedzić.

5.Sprawdza liste w poszukiwaniu id rooma

6.Jesli znajdzie to ustawia cie na odczytanej pozycji x i y.

 

GML (create)
roomList=ds_list_create();

roomX=ds_list_create();

roomY=ds_list_create();

 

GML (przejsciedoinnegorooma)
for(i=0;i<ds_list_size(roomList);i+=1)

{

if ds_list_find_value(roomList,i) = room

{

ds_list_delete(roomList,i);

ds_list_delete(roomX,i);

ds_list_delete(roomY,i);

}

}

ds_list_add(roomList,room);

ds_list_add(roomX,x);

ds_list_add(roomY,y);

// Tutaj robisz przejscie do nastepnego rooma</span></span>

 

GML (kodprzynowymroomie)
for(i=0;i<ds_list_size(roomList);i+=1)

{

if ds_list_find_value(roomList,i) = room

{

x=ds_list_find_value(roomX,i);

y=ds_list_find_value(roomY,i);

}

}

 

Pisane z głowy w szkole, kod niekoniecznie musi działać, ale idea sama w sobie powinna działać.

 

Problem moze sie pojawic jedynie w sytuacji w ktorem mozesz np. wejsc w room drzwiami z lewej, wyjsc srodkowymi a nastepnie spowrotem wejsc jakims wejsiem dodatkowym z prawej, wtedy cie wrzuci w te na srodku..

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Proszta wersja:

 

kolizja z drzwiami/czymstam co ma prowadzić do następnego roomu:

GML
global.initX = 10;

global.initY = 20;

i potem w obiekcie player, w evencie room start:

GML
x = global.initX;

y = global.initY;

Nie zapomnij przed pierwszym etapem ustalić tych zmiennych, może być np. w menu gdy klikasz "nowa gra", lub w pustym roomie który ustawi te zmienne i wykona room_goto_next();

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

To co ja podałem, nie wymaga niczego więcej - tylko dwie zmienne - przy zmianie etapu (przed room_goto(xxx)) dajesz to pierwsze, w room start to drugie i jeszcze w GameStart (jeśli w pierwszym roomie jest postać) lub w pierwszym roomie jeśli gra zaczyna się od drugiego ustawiasz gdzie zacznie się gra. Tyle. Prościej się nie da i używam tego sposobu już od 9 lat.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

znaczy co, chcesz wejsc jednymi drzwiami, a wychodzac stać przy innych? myślalem, ze wracasz do tych samych, a wtedy wystarczy tylko dobre x i y dać w obiekcie.

 

Hint

Creation code może ustalić te pozycje i wystarczy wtedy tylko jeden obiekt.

Odnośnik do komentarza
Udostępnij na innych stronach

A może tak:

'Create' w obiekcie 'objPlayer'.

GML
if( variable_global_exists( "door" ) )

with( objDoor )

{

if( global.door == door_id )

{

other.x = x;

other.y = y;

break;

}

}

 

'Create' w obiekcie 'objDoor'.

GML
// door_id = 0; - nie należy ustawiać tej zmiennej w evencie 'Create' obiektu, ponieważ będzie ona przypisywana w roomie poprzez "Ctrl+PPM >> Creation code..." dla każdej instancji oddzielnie

// taki bug-tracer do zapobiegania braku wymaganej zmiennej

if( !variable_local_exists( "door_id" ) )

{

show_message( "Zmienna door_id jest wymagana do zdefiniowania#ID instancji: "+string(id) );

door_id = 0;

}

 

Wejście do drzwi, w jakimś evencie 'objPlayer' np. poprzez collision with ...

GML
global.door = other.door_id;

room_goto( roomGarden );

 

Jak to działa?

Przy evencie 'Create' obiektu 'objPlayer', skrypt sprawdza, którymi drzwiami weszliśmy - dzięki lokalnej zmiennej 'door_id' każdej instancji 'objDoor'. Ta zmienna lokalna powinna być taka sama dla obu drzwi którymi wchodzimy i wychodzimy - można ją ustawić w room edytorze poprzez "Ctrl+PPM" na instancji i wybrać opcję "Creation code...".

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