Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

a myślałem, że rysowanie na surface nie zabiera pamięci, dopiero samo jego rysowanie już tak:/

Dobra zostawię narazie tilesy tak jak są. Jak będę zmieniał testowego rooma już na tego właściwego( większego) i zobaczę jakiś znaczący spadek wydajności to machnę własny edytor ( pomysł na niego już mam ale nie chciałbym siedzieć nad tym nie potrzebnie)

 

Odkopię temat ale swego czasu bardzo pomocne przy tworzeniu ogromnych lokacji były dla mnie artykuły o "Gigantach świata 2d" na stronie epomoce.pl

GML
http://www.epomoce.pl/spisgieromega.php?Lewy=1
Odnośnik do komentarza
Udostępnij na innych stronach

mam dziwny problem

 

W create obiektu enemy1_body mam kod

GML
own_head=instance_create(x,y,enemy1_body_head)

own_head.cialo=self.id

 

A w create obiektu enemy1_body_head mam

GML
image_angle=cialo.image_angle

 

mimo to, widzi błąd w obiekcie enemy1_body_head - mianowicie nie ma takiego obiektu jak cialo :(

co zrobić

 

@EDIT:

ok, dałem to drugie do stepa i działa, ale dlaczego nie działa w create?

 

I w ten sposób w stepie wykonuje ci zbędny kod co krok. Spróbuj w create obiektu enemy1_body_head ustawić alarm[0]:=1; a do alarmu wrzuć przypisanie image_angle=cialo.image_angle. Jeśli to pomoże to oznacza, że pierwsza linijka obiektu body tworząca głowę tworzy obiekt, który od razu wykonuje kod ze swojego create a przypisanie own_head.cialo=self.id w body następuje później.

 

Obsługa JSON jest tylko w Studio. Ale w poprzednich GM było już ds_map_write() i ds_map_read(). I tego użyj. Jest niesamowicie łatwo, wygodnie, i bezproblemowo. Tylko nie ma plusu struktury drzewa.

 

Z tym, że w GM 8.1 był zupełnie inny format zapisu danych (dla laika nieczytelny), natomiast te funkcje w GM:S zapisują już w formacie JSON (czytelny niemal jak zwykłe ini) i zapisy są niekompatybilne.

 

Ponawiam bo nadal nie mam pojęcia o co chodzi

 

"W pewnym momencie gry (jeszcze nie odkryłem dokładnie w którym) gra zaczyna zwalniać- cały czas mam 60/60 nagle z każdą kolejną mapą spada kilka fps.Jeżeli zresetuje grę dana mapa która spowolniła już np do 40fps ma już normalnie 60/60- tak więc proces następuje wraz z czasem grania- i tutaj kluczowy element i pytanie używam sobie "show_debug_overlay" i wraz ze spadkiem fps drastycznie rośnie mi żółty pasek , według opisu funkcji to :

"Yellow - The time required for the draw event"

Co to oznacza w praktyce? Praktycznie nie używam funkcji draw (poza jakimś wyświetlaniem fps itp).Co może spowalniać? "

 

Ktoś wie?

 

Trop: sprawdź czy plik wykonywalny pod task managerem zużywa coraz więcej pamięci w windowsie. Ja tak kiedyś miałem jak źle zwalniałem pamięć przy ładowaniu kolejnych backgroundów z pliku u używaniu surfejsów.

 

Przejrzałem sobie, na pierwszy rzut oka wydaje się ciekawe a po przeczytaniu nie wiem za bardzo jak to ma pomóc,niewiele rozumiem- do jakiego programu to się odnosi,o co tu w ogóle chodzi?

 

http://www.epomoce.pl/ladujpodstrone.php?p...mp;parametr2=16

 

 

Chodzi o samą filozofię budowania ogromnych światów. Sprawa sprowadza się do wyświetlania w jednym czasie tak naprawdę tylko jednego rooma o wielkości Viewa a reszta jest przechowywana w tabelach. Podczas "przesuwania" ekranu tak naprawdę przesuwasz same obiekty generując je na bieżąco na podstawie danych w tabelach. Przykłady w artykułach są dla Delphi ale polecam przeczytać całość i zaadaptować dla swoich potrzeb. Budując świat w ten sposób można praktycznie zrobić grę o przeogromnej mapie na przysłowiowy wyświetlacz z pralki.

Odnośnik do komentarza
Udostępnij na innych stronach

Z tym, że w GM 8.1 był zupełnie inny format zapisu danych (dla laika nieczytelny), natomiast te funkcje w GM:S zapisują już w formacie JSON (czytelny niemal jak zwykłe ini) i zapisy są niekompatybilne.

 

W dalszym ciągu ds_map_write() zapisuje w nie czytelnym formacie. Nie chce mi się teraz testować ale dokumentacje mówi:

NOTE: The returned string is not a human readable string, but rather a dump of the contents of the data-structure

Wcześniej to był ciąg znaków nie wiem czy same cyfry czy cyfry wymieszane z literami, ale to był nie czytelny format. Czy jest kompatybilny? Nie wiem, nie mam czasu przetestować. Pewne jest to że ds_map_write() nie zapisuje jako JSON.

Odnośnik do komentarza
Udostępnij na innych stronach

W dalszym ciągu ds_map_write() zapisuje w nie czytelnym formacie.

 

Przerabiałem to już jakiś czas temu w edit nr 2, gdy konwertowałem HS i SAVE z GM 8.1 na HTML5. Dla przykładu treść HigScore z mojej produkcji po zapisie ds_map_write() z GM:S

GML
{"width":6,"height":4,"body":["Zuzia umyła auto","Xperia html5 firefox","Zuzia","Retrospect Workshop","android gr","żźćąśęółńŃŁÓĆŹŻĄŚĘ Da",

851,751,688,637,614,599,3,5,2,5,4,1,

"B:130.59 K:18.42 U:738.84 Br:640 Bt:257 Tl:22.35","B:123.88 K:17.16 U:644.38 Br:1578 Bt:232 Tl:23.75","B:129.84 K:51.51 U:609.23 Br:1922 Bt:692 Tl:21.75",

"B:115.81 K:41.72 U:563.02 Br:2403 Bt:564 Tl:26.27","B:109.97 K:35.05 U:538.94 Br:2469 Bt:442 Tl:26.20","B:137.58 K:11.54 U:472.95 Br:3295 Bt:155 Tl:19.35"]}

Więc format jak najbardziej czytelny. W GM 8.1 to był ciąg cyfr.

Odnośnik do komentarza
Udostępnij na innych stronach

Mam problem z tworzeniem budynku... Zamiast jednego tworzy się ich od cholery. Liczba dochodzi do 20 :/

 

Info z kodu budynku:

 

Information about object: o_Gbuild
Sprite: s_OreGraber
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent: 
Children: 
Mask: 

No Physics Object
Create Event:

execute code:

can = false;
col = c_white;
direction = 0;

Step Event:

execute code:

image_angle = direction;
x = mouse_x;
y = mouse_y;
if place_free(x,y){
   can = true;
   col = c_white;
} else {
   can = false;
   col = c_red;
}

Mouse Event for Left Pressed:

execute code:

if can = true{
   instance_create(x,y,o_Gbuilding);
   instance_destroy();
}

Mouse Event for Glob Right Pressed:

execute code:

instance_destroy();

Draw Event:

execute code:

draw_sprite_ext(sprite_index,0,x,y,1,1,direction,col,1);

 

Po końcu alarmu ma stworzyć się ten obiekt:

 

Information about object: o_Graber
Sprite: s_OreGraber
Solid: true
Visible: true
Depth: 0
Persistent: false
Parent: 
Children: 
Mask: 

No Physics Object
Create Event:

execute code:

direction = 0;
type = 0;
select = false;
index = 0;
x += choose(0,128,256,512)// kod by sprawdzić czy tworzy się więcej jak jeden.

Step Event:

execute code:

if select = true{
   instance_create(x+128,y,o_Gtype);
}

Mouse Event for Left Pressed:

execute code:

select = not select;

Mouse Event for Glob Right Pressed:

execute code:

select = false;

Draw Event:

execute code:

if select = true{
   //draw_rectangle_colour(x-68,y-68,x+68,y+68,c_green,c_green,c_green,c_green,1);
   draw_sprite_ext(s_select,image_index,x,y,1,1,0,c_white,0.5)
   draw_sprite_ext(s_arrow,0,x+128,y,1,1,direction,c_black,0.5)


}
draw_sprite_ext(sprite_index,type,x-10,y+10,1,1,direction,c_black,0.2);
draw_sprite_ext(sprite_index,type,x,y,1,1,direction,c_white,1);

draw_text_colour(x,y,index,c_white,c_white,c_white,c_white,1);

 

Pozdrawiam.

 

EDIT:

 

Dobra przeszukałem wszystko i problem znalazłem. Dopiero ogarnąłem to, że tworzyło mi się kilka ikonek budowy budynku, po kliknięciu wszystkie się aktywowały...

Odnośnik do komentarza
Udostępnij na innych stronach

To kod tworzenia plomieni, chcę by plonień pokazywał się przez sekunde i przez sekundę nie, próbowałem na wiele sposobów, ale zawsze jak dochodziło do 0 to wieża przestawała działać, jak to zrobić ?

GML
if (timer1 <= 0)

{

if (object_exists(obj_flamethrower))

{

instance_deactivate_object(obj_flamethrower)

}

timer1 = 60;

 

} else

{

timer1 -= 1;

repeat (3)

{

instance_create(x+32,y, obj_flamethrower);

}

}

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Przede wszystkim tworzysz za dużo obiektów, a potem je deaktywujesz i nigdy więcej nie używasz, po co?

GML
if (timer1 <= 0) {

with(obj_flamethrower) { instance_destroy();}

timer1 = 60;

} else {

timer1 --;

repeat (3) {

instance_create(x+32,y, obj_flamethrower);

}

}

 

 

Jak zablokować grę w poziomie? Żeby nie dało się na androidzie obracać?

Odnośnik do komentarza
Udostępnij na innych stronach

Zapomniałem o tym XD

GML
if (timer1 <= 0) {

with(obj_flamethrower) { instance_destroy();}

timer1 = 120;

} else if timer1<=60{

repeat (3) {

instance_create(x+32,y, obj_flamethrower);

}

}

timer1 --;

Dzięki tej opcji w obiekcie1 możesz wykonać kod w obiekcie2 :D

Odnośnik do komentarza
Udostępnij na innych stronach

Jak zrobić przesuwanie ekranu w androidzie tak jak to wygląda w 99% wszystkich komórkowych aplikacji(np przy podglądzie zdjęć).Tzn przesuwam palcem w lewo i ekran przesuwa się w prawo.Mam obiekt za którym podąża view ale nie mam żadnego pomysłu jak uzyskać podobny efekt

 

 

 

edit.ogarnąłem temat, jakby ktoś szukał rozwiązania to

GML
if (dragging) {

// actual dragging logic:

view_xview = drag_x - (mouse_x - view_xview)

view_yview = drag_y - (mouse_y - view_yview)

// make sure view doesn't go outside the room:

view_xview = max(0, min(view_xview, room_width - view_wview))

view_yview = max(0, min(view_yview, room_height - view_hview))

}

Odnośnik do komentarza
Udostępnij na innych stronach

Chce żeby obiekt po zbliżeniu się do innego obiektu stawał się niewidzialny

 

GML
if (distance_to_object(obj_eye)<150){image_alpha=0}

else image_alpha=1

 

Proste , banalne i działa.

 

Ale tych obiektów które mają się zmienić w ten sposób jest sporo rodzajów i nie chcę w każdym pojedynczym wklejać tego kodu.

 

W pierwszej kolejności spróbowałem w kodzie obj_eye (czyli tego który uruchamia niewidzialnośc)

 

GML
if (distance_to_object(obj_mobile_parent)<150){with obj_mobile_parent image_alpha=0}

else with obj_mobile_parent image_alpha=1

 

skutek- nic się nie dzieje,zero efektu

 

Następnie próbowałem w parencie wszystkich obiektów które mają się zmieniać- nie działa nic, kiedy dorzucę event_inherited() - także nic się nie dzieje.Kod działą tylko i wyłącznie użyty bezpośrenio w stepie danego obiektu co bardzo mi nie odpowiada.Dodam że użycie jakiejkolwiek innej funkcji zamiast image_alpha działa dobrze np

 

GML
if (distance_to_object(obj_mobile_parent)<150){with obj_mobile_parent instance_destroy()}

 

Problem dotyczy tylko image_alpha

 

Ktoś wie o co tu chodzi?

Odnośnik do komentarza
Udostępnij na innych stronach

GML
///boss

if object_exists(obj_boss)

{

if (obj_boss.image_index = 6)

{

if place_meeting(x,y+1,obj_block_yellow)

{

with obj_boss image_index=0;

}

}

if (obj_boss.image_index = 7)

{

if place_meeting (x,y+1,obj_block_blue)

{

with obj_boss image_index=1;

}

}

if (obj_boss.image_index = 8)

{

if place_meeting(x,y+1,obj_block_green)

{

with obj_boss image_index=2;

}

}

if (obj_boss.image_index = 9)

{

if place_meeting(x,y+1,obj_block_red)

{

with obj_boss image_index=3;

}

}

if (obj_boss.image_index = 10)

{

if place_meeting(x,y+1,obj_block_bluee)

{

with obj_boss image_index=4;

}

}

if (obj_boss.image_index = 11)

{

if place_meeting(x,y+1,obj_block_purple)

{

with obj_boss image_index=5;

}

}

}

 

Czemu, gdy obj_boss znika wywala mi błąd ?

Odnośnik do komentarza
Udostępnij na innych stronach

"This function returns whether an object with the specified index exists or not. Note that this checks to see if an object is present in the resource tree, and not actually in the game room. For that you should use the function instance_exists. "

 

Zakładam, że to do użycia przy dynamicznych obiektach, które się tworzy i usuwa w locie, aby się upewnić, że dany istnieje.

Odnośnik do komentarza
Udostępnij na innych stronach

@Ignatus:

Funkcja distance_to_object(x) działa poprawnie, jeżeli za x wstawisz ID instancji obiektu lub słowo specjalne "other". Jeżeli jako x wstawisz nazwę obiektu (czyli ID obiektu), to funkcja wyliczy odległość od tylko jednej instancji tego obiektu (prawdopodobnie tej, która powstała jako pierwsza). Zakładam, że istnieje tylko jedna instancja obiektu obj_eye i że obj_mobile_parent jest nazwą obiektu, a nie zmienną przechowującą ID pewnej instancji obiektu.

Wtedy kod

GML
if (distance_to_object(obj_mobile_parent)<150){with obj_mobile_parent image_alpha=0}

else with obj_mobile_parent image_alpha=1

wyliczy odległość od instancji obiektu obj_eye do pierwszej powstałej instancji obiektu obj_mobile_parent, i jeśli spełni warunek, to zmieni image_alpha WSZYSTKIM instancjom obiektu obj_mobile_parent.

Następujący kod:

GML
with(obj_mobile_parent) image_alpha=(distance_to_object(other)>150)

wykonywany w stepie obiektu obj_eye zrobi to, czego wymagasz. (a przynajmniej powinien : |)

 

 

@kso:

Jeśli to platformówka, to możesz zapisywać w obiekcie ostatnią pozycję, na której obiekt stoi na platformie czy na czymkolwiek, a w momencie rozbicia powracać do tej pozycji.

Odnośnik do komentarza
Udostępnij na innych stronach

Amaterasu- dziękuje za odpowiedź ale mój problem nie tyczy się tego że nie działa "distance_to_object" lub że akcja odnosi się do wszystkich obiektów danego rodzaju a nie tylko do tej jednostki która wpadnie w "zasięg"- problem polega na tym że każda inna akcja działa poza zmianą image_alpha- przy tym zupełnie nic się nie dzieje.

 

Problem teoretycznie rozwiązałem używając visible

 

GML
with obj_mobile parent

if (distance_to_object(obj_eye)<100){visible=0}

else visible=1

 

I działa bez problemu tak jak powinno ale nie ukrywam że wolałbym żeby to przechodzenie w niewidzialność było płynne,np poprzez

GML
image_alpha-=.1
ale jak to zrobie nic się nie dzieje (jak zrobię image_alpha=0 w tym kodzie- także nie działa)

 

Mówiąc w skrócie jak użyję w jakimkolwiek "odnośniku" image_alpha to nigdy nic się nie dzieje.Gdzie jest błąd?

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