Skocz do zawartości

Temat zbiorczy na drobnostki


Chell

Rekomendowane odpowiedzi

Jak dołączyć float do int? Zmienić int w float, ale tak, żeby ten int było po przecinku. Coś takiego:
 

zmienna = 0.hspeed
zmienna = 0. && hspeed
zmienna = 0. and hspeed
zmienna = 0.+hspeed (tak wiem, to jest bez sensu, bo to zwykłe dodawanie dwóch liczb)

Chodzi mi o to, żeby liczba przed przecinkiem zawsze wynosiła 0

Odnośnik do komentarza
Udostępnij na innych stronach

Trochę innym rozwiązaniem (dłuższym) jest podzielenie zmiennej przez wielokrotność 10:

zmienna = 4467;
zmienna2 = string(zmienna); // zmiana liczby na string
zmienna3 = string_length(zmienna2); //policzenie z ilu cyfr składa sie string zmienna
zmienna4 = zmienna / power(10, zmienna3); // podzielenie zmiennej przez dzisiątkę do potęgi zmienna3

zmienna5 = string_format(zmienna4, 1, zmienna3); // wypisuje zmienną po z odpowiednią ilością miejsc po przecinku

Zmienna5 jest po to. bo GM zaokrąglał wynik do 2 miejsc po przecinku.

A tu wklejając wszystko do przykładu Threefa :)

zmienna2 = string_format(real("0."+string(zmienna)), 1, string_length(string(zmienna)));

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Mam do narysowania setki drzew.Tzn dokładnie każde drzewo w top-down jest "fake 3d" rysuje się kilka razy  w zależności od pozycji gracza-wygląda to spoko ale x100 to zaczyna zamulać.Teraz pytanie jak to najskutczniej zoptymalizować?

 

Próbowałem w draw drzew:

if (distance_to_object(obj_Player<900)){
   // Draw } 

- nic to nie dało

 

albo

if (rectangle_in_rectangle(bbox_left, bbox_top, bbox_right, bbox_bottom, bview_xview[0], view_yview[0], view_xview[0] + view_wview[0], view_yview[0] + view_hview[0])) { // Do something }

Trochę lepiej ale niewiele i do tego drzewa pojawiają sie na skraju view co jest widoczne

 

Jakieś pomysły?

Odnośnik do komentarza
Udostępnij na innych stronach

@Ignatus Drugie rozwiązanie, ale musisz uwzględnić rozmiar drzew. Niestety ale prawdopodobnie rysujesz tego za dużo. 

Poza tym nie rób if(rectangle_in_rectangle()){draw_sprite()}

Rób w step: if(point_in_rectangle()) {visible =true} else {visible=false}

W ten sposób całkiem wyłączasz event draw. To o wiele bardziej przyśpiesza bo dany obiekt wcale nie wykonuje eventu draw. Sprawdzenie punktu też jest szybsze niż prostokąta. Dobież tylko marginesy w rozmiarach sprite.

Odnośnik do komentarza
Udostępnij na innych stronach

Jakoś nie potrafię tego skutecznie ogarnąć, zapewne dlatego że view obraca się razem z graczem i zawsze jakiś fragment widoku jest w innej pozycji niż zakładałem -a drzewa pojawiają sie i znikają z kosmosu..

 

 

Stąd kolejne pytanie jak zrobić pole większe od view np o połowę?

 

jak testowo zrobię draw_rectangle(view_xview[0], view_yview[0], view_xview[0] + view_wview[0], view_yview[0] + view_hview[0],0) to widzę wyraźnie że jest mnóstwo miejsca poza obrazem zaznaczonym-jak zaznaczyć pole większe o połowę od aktualnego view?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli dobrze przyjrzysz się temu jak się obraca kamera to zauważysz ze lewy górny punkt zostaje w miejscu ale pozostałe rogi się obracają dookoła punktu w lewym górnym rogu. Jeżeli obrócisz kamerę o 90 stopni to zamienią się osie. W górę będziesz mieć x a w prawo y. Wtedy szerokość ekranu która wynosiła np 1280 jest w przeciwną stronę. To co jest najbezpieczniej robić to w twoim wypadku operować na promieniu względem środka ekranu.

var r = max(view_wview[0],view_hview[0])+margines
var px = view_xview[0]+view_wview[0]/2
var py = view_yview[0]+view_hview[0]/2

with (drzewo) {
	if(point_distance(x,y,px,py)>r) {
		visible=false
	} else {
		visible=true
	}
}

 

 

Edit:

A nie, bo właśnie w tym chyba problem. Musiałbyś wymnażać to przez sin i -cos z view_angle[0] żeby dawało ci dobrą pozycję środka kamery... Chyba.

Nie jestem już w stanie odpowiedzieć. Z dużo wypiłem. :|

Odnośnik do komentarza
Udostępnij na innych stronach

Działa idealnie.Wstawiłem z 200 drzew i zerowa ścina.Teraz pytanie- czy lepiej zrobić te var r,px,py w każdym obiekcie drzewo, zrobić to tylko np w obj control czy walnąć z tego global? Co najlepsze dla optymalizacji (teraz mam w obj_tree_parent i dziala dobrze ale może da się lepiej;p?)

Odnośnik do komentarza
Udostępnij na innych stronach

W teorii teraz jedynie wyłączasz rysowanie. Dzięki temu kolizje dalej zachodzą poza ekranem, więc unikniesz dzięki temu sytuacji że np jakiś NPC utknie w drzewie gdy zbliżysz się.

Ale jeżeli nie potrzebujesz sprawdzać kolizji to możesz równie dobrze dezaktywować obiekty. Jeżeli dezaktywujesz to lepiej wrzucić ten kod do drzew. Ale jeżeli nie to ja bym zrobił jeden obiekt który zarządzałby tym rysowaniem. Może to też robić gracz.

 

No i 200 drzew to... ok. Ja przy tej technice w GM miałem 200000 obiektów w 30FPS na Pentium 4

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

Zaimportowałem do projektu grupę skryptów z innego projektu.W tamtym projekcie wszystko śmiga ok- tutaj natomiast

 

Reading project file....Error : script missing "scripts\animated_tile_add.gml"
Error : script missing "scripts\animated_tile_cleanup.gml"
Error : script missing "scripts\animated_tile_disable_all.gml"
Error : script missing "scripts\animated_tile_enable_all.gml"
Error : script missing "scripts\animated_tile_get_animation_speed.gml"
Error : script missing "scripts\animated_tile_get_background.gml"
Error : script missing "scripts\animated_tile_get_current_background.gml"
Error : script missing "scripts\animated_tile_get_current_frame.gml"
Error : script missing "scripts\animated_tile_get_frame_count.gml"
Error : script missing "scripts\animated_tile_get_next_frame.gml"
Error : script missing "scripts\animated_tile_init.gml"
Error : script missing "scripts\animated_tile_is_playing.gml"
Error : script missing "scripts\animated_tile_update.gml"

Projekt w ogóle się nie kompiluje bo wyskakuje  od razu okienko z takimi błędami.

Odpowiedź wydaje się oczywista- błąd w końcu oznacza że nie istnieją takie skrypty- problem polega na tym że jak najbardziej istnieją i to o dokładnie takich nazwach.

O co tu chodzi?

Odnośnik do komentarza
Udostępnij na innych stronach

  • 4 tygodnie później...

Walczyłem z tym parę miesięcy temu ale okazało się że problem nie jest rozwiązany :/

 

 

Top down.System kolizji

 

Kod kolizji gracza z nieruchomym obiektem (np sciana)

a = point_direction(x, y, other.x, other.y); //Get the direction from the colliding object
xoff = lengthdir_x(1, a); //Get the offset vector
yoff = lengthdir_y(1, a);

//Move out of collision
while (place_meeting(x, y, other))
{
x -=xoff //Move the instance out of collision
y -=yoff
x = round(x)
y = round(y)
}

Wszystko spoko,tylko następuje bardzo nienaturalne ślizganie.Np idę w ścianę,delikatnie skręcę w bok i nagle przerzuca na kraniec obiektu.Kombinuje od bardzo dawna i nic nie potrafię wymyśleć.Zależy mi tylko na tym żeby tak zmienić ten kod żeby gracz po prostu wracał do poprzedniej pozycji-nie ruszał się.Akcje typu x=xprevious nie mają sensu bo po prostu utyka jak w bagnie.Zatrzymanie ruchu kiedy jest blisko ściany też się nie sprawdza bo działa tylko przy prostym poruszaniu.Jak gracza popchnie przeciwnik na ścianę albo zrobię obrót dotykając ściany to wszystko się wali.....

 

Jak zrobić żeby TYLKO się zatrzymał?

Odnośnik do komentarza
Udostępnij na innych stronach

Eh :( 

 

Potrzebuję cofnięcia do poprzedniej pozycji, ruch nie ma znaczenia.Mój system jest sporo bardziej skomplikowany i jedyny element który kuleje to ślizganie w kolizji.W przypadku elementów ruchomych np.innych wrogów sprawdza się super ale do ścian już nie koniecznie.Ściana musi odepchnąć gracza do jego poprzedniej pozycji-bez uwięzienia go

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety rozwiązania w kodzie nie znalazłem więc użyłem drogi na skróty.Kolizje zrobiłem zamiennie zawsze z obiektami mniejszymi od gracza-stąd ślizganie na koniec obiektu którego dotyka jest niezauważalne.Jakby nie patrzeć problem rozwiązany

 

Teraz mam coś dużo prostszego ale nie wiem jak się za to zabrać.

Chciałbym żeby krew zostawiała ślady na ścianie.Jak zrobić żeby rysował się tylko kawałek sprite krwii i to tylko w tej części w której nastąpiła kolizja z obj_blood ? Przykłady które znalazłem (np z gry Ink) są dla nie absurdalnie skomplikowane i nie potrzebuje czegoś takiego.Wystarczy mi określenie tego miejsca na ścianie gdzie ma się rysować.Macie jakieś pomysły?

Odnośnik do komentarza
Udostępnij na innych stronach

Godzinę temu, Ignatus napisał:

Chciałbym żeby krew zostawiała ślady na ścianie.Jak zrobić żeby rysował się tylko kawałek sprite krwii i to tylko w tej części w której nastąpiła kolizja z obj_blood ? Przykłady które znalazłem (np z gry Ink) są dla nie absurdalnie skomplikowane i nie potrzebuje czegoś takiego.Wystarczy mi określenie tego miejsca na ścianie gdzie ma się rysować.Macie jakieś pomysły?

są skomplikowane bo to nie jest taki prosty trick na zrobienie tego w grze z widokiem top-down. jak ja bym to zrobił:

  1. dzielisz rendering na kilka passów (pass to w skrócie przebieg renderingu, dla przykładu pierwej renderujesz scenę normalnie do surface, w kolejnym passie renderujesz informacje o światłach do drugiego surface, w trzecim renderujesz same normalki sceny do trzeciego surface, a w czwartym zaś w shaderku renderujesz już kombinację trzech surface na ekran gdzie masz wynikowy obraz oświetlonej sceny z cieniowaniem wypukłości - oczywiście tak się dokłądnie nie robi oświetlenia, ale rozumiesz już jak działają passy renderingu);
  2. w pierwszym passie renderujesz scenę normalnie na ekran;
  3. w drugim passie renderujesz na biało elementy, na których ma się odkładać krew i zabrudzenia zaś na czarno wszystko to, czego ma nie brudzić, do surface #1 - to będzie maska krwi i zabrudzeń;
  4. w trzecim passie renderujesz krew i zabrudzenia do surface #2 - to będzie kolor krwi i zabrudzeń;
  5. w czwartym passie rysujesz pełnoekranowy czworokąt z shaderkiem, w którym jako alphe stosujesz któryś z kanałów RGB z surface #1, a kolor zabrudzenia i krwi bierzesz z RGB surface #2. ten pass renderujesz na ekran.

jeśli uznasz tę metodę za wartościową, to daj znać to zrobię przykład jak takie coś działa.

Odnośnik do komentarza
Udostępnij na innych stronach

Doceniam- ale ja z tego po prostu nic nie rozumiem :) Ja chcę iść po najniższej lini oporu-tak żebym miał nad tym później pełną kontrolę

Potrzebuje takiego planu,nic więcej do szczęścia mi niepotrzebne :

 

blood.png

 

Na razie próbowałem:

Kolizja:

Cytuj

splash=true
vspeed=0
hspeed=0

wl=instance_place(x,y,other)
depth=wl.depth-10
sh=sprite_height/2

pd=point_direction(x,y,wl.x,wl.y)


                   
        xx = x + lengthdir_x(sh, pd);                      
        yy = y + lengthdir_y(sh, pd);

x=xx
y=yy
 

Draw:

if (splash=true){ draw_sprite_part(sprite_index,im,0,0,sprite_width,sh,xx,yy)

}

I jest beznadziejnie :D Nic nie działa jak powinno
 

Odnośnik do komentarza
Udostępnij na innych stronach

@Ignatus a powiedz mi, z ktorej wersji GMa korzystasz? sprobuje znalezc ominiecie problemu dla niej,

Odnośnik do komentarza
Udostępnij na innych stronach

okej, w domu pokombinuje z tym, dzis raczej nie ale jutro najpredzej

Odnośnik do komentarza
Udostępnij na innych stronach

w pierwszym poście napisałem " Przykłady które znalazłem (np z gry Ink) są dla nie absurdalnie skomplikowane i nie potrzebuje czegoś takiego.Wystarczy mi określenie tego miejsca na ścianie gdzie ma się rysować.Macie jakieś pomysły?"

 

Nie chce shaderów ani surface bo mam ich ze względu na dość złożony system oświetlenia już dużo,dodatkowo skomplikowane przez system save nad którym dobre kilkanaście godzin spędziłem .W pierwszej kolejności chcę spróbować najprostszego możliwego wyjścia-z obj_blood które po prostu zostaje na ścianie.Naprawdę nikt nie wie jak zrobić to metodą którą zaproponowałem?

 

 

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