Skocz do zawartości
Czołg Krymski

heightmap po zmianie roomu

Rekomendowane odpowiedzi

hej, mam obrzydliwy problem, którego źródła nie mogę zlokalizować. W moim aktualnym projekcie używam skryptów do rysowania terraina w 3D z tego starego .gmk http://www.host-a.net/u/the sivart/3d 15.gmk

Problem jest natury takiej, że chcąc zmienić room, gdzie rysuję kolejną heightmapę, wszystko się glitchuje i zwykle wszystko jest po prostu płaskie jak deska. Skrypty operują na zmiennych globalnych, więc zapewne właśnie w tym jest problem, że niektóre zmienne przechodzą z poprzedniego rooma czy cóś, ale cholercia słabo się akurat w tym orientuję i potrzebuję na gwałt pomocy. Bylibyście w stanie po przejrzeniu tego gmk pomóc napisać jakiś skrypt terrain_end() przy zmianie rooma, albo cokolwiek innego co by podziałało? Bo ni cholery nie wiem jak to ugryźć, koledzy. Z góry dzięki

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Chciałem otworzyć projekt w GM 8.0 i mi wyskoczył błąd "Cannot find extension d3d". Miejscami są "nieznane akcje" więc nie mogę przetestować kodu. Pomóż mi jakoś to obejść to może dam radę zanalizować kod.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am vader

kurcze rzeczywiście. Dobra, wrzucę po prostu kod, bo terrain i tak oparty jest na dwóch skryptach terrain_create i terrain_draw:

create

global.swidth=sprite_get_width(argument0);
global.sheight=sprite_get_height(argument0);
global.terrainsize = argument1;
global.terraingrid=ds_grid_create(global.swidth,global.sheight);
global.terrainmodel=d3d_model_create();
draw_sprite_stretched(argument0,0,0,0,global.swidth+2,global.sheight+2)
for(w=0;w<global.swidth+2;w+=1){
    for(h=0;h<global.sheight+2;h+=1){
        val=draw_getpixel(w,h)
        valex=color_get_value(val)
        ds_grid_set(global.terraingrid,w,h,valex/240*argument2)
        } 
    } 
for(xx=0;xx<global.swidth-1;xx+=1){
d3d_model_primitive_begin(global.terrainmodel,pr_trianglestrip); 
adraw=true;
for (yy=0;yy<global.sheight;yy+=1){
  adraw = !adraw; 
  z2=ds_grid_get(global.terraingrid,yy,xx+1);
  d3d_model_vertex_normal_texture(global.terrainmodel,yy*global.terrainsize,(xx+1)*global.terrainsize,z2,0,0,1,adraw,1);
  z1=ds_grid_get(global.terraingrid,yy,xx);
  d3d_model_vertex_normal_texture(global.terrainmodel,yy*global.terrainsize,xx*global.terrainsize,z1,0,0,1,adraw,0);
  }
d3d_model_primitive_end(global.terrainmodel);
}
depth=-1;



draw


//argument0 = terrain texture
d3d_set_culling(1);
d3d_model_draw(global.terrainmodel,0,0,0,background_get_texture(argument0))
d3d_set_culling(0);

i to w zasadzie tyle, ale nic nie potrafię wymyślić. Z góry dziękuję za fatygę z serca całego

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Ten kod widzę w projekcie, chodzi o to że nie mogę skompilować w celach testowych.Najlepsze co mogę zrobić w takim wypadku to szukać po omacku.

 

Ogólnie kod terrain_create sugeruje ze po jego ponownym wywołaniu wszystko powinno się zresetować na nowe wartości i nie powinno być bugów.

 

Najlepsze co mi przychodzi do głowy to oczyszczenie pamięci ze zbędnych danych:

ds_grid_destroy(global.terraingrid);

d3d_model_destroy(global.terrainmodel);

A następnie wezwanie funkcji terrain_create od nowa.

 

Jesteś pewien że argumenty które podajesz dla drugiego roomu są poprawne?

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am vader szczerze prócz d3d_set_projection nie trzeba raczej nic więcej, by to sprawdzić. Tym bardziej, że przetestowałem też zmienianie roomów na tym źródłowym gmk i tam tak samo występuje ten problem, więc to nie wynik mojej ingerencji. Zwalniać z pamięci również próbowałem na wszystkie możliwe sposoby i nic to nie daje, cały czas po przejsciu do kolejnego rooma terrain jest płaski. Aj no, naprawdę nie mam najmniejszego pojęcia w czym problem. Myślałem o depthie może, ale też nic to nie zmienia.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jakieś Deja vu chyba mam, nie wrzucałeś wcześniej czegoś takiego i nie odpisywałem ci? hmm

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am Lord a było było. Chodziło o teksturowanie później tej heightmapy. A teraz niestety kolejny mi się problem pojawił

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Odkryłem, że jeśli opóźnić funkcję terrain_create a chociażby 1 step, to już za 1szym razem(bez restartu spacją) mapa jest płaska. Zakładam, że model wykonany później niż na starcie gry z jakiegoś powodu nie generuje się.

Aby odtworzyć ten bug w obiekcie terrain w create wpisz:

alarm[0]=1;
ready=false;

w alarm[0]

terrain_create(heightmap,128,1000)
ready=true;

i w draw:

if ready=true then terrain_draw(green)

 

Licze ze znalezienie tego buga pomoze Ci jakos w rozwiazaniu problemu. Ja bede grzebac dalej az cos znajde.

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am vader dzięki wielkie za fatygę I również kombinuję cały czas od dwóch dni, bo przez to nie mogę rozwijać w ogóle tego projektu. Ten prosty skrypt na rysowanie terraina zdawał się zawsze perfekcyjny, ale nigdy nie próbowałem go rysować w innych roomach i teraz się okazuje, że coś się pieprzy przez to. Tak czy inaczej jak też coś znajdziesz to daj od razu znać, bo cholera wszystko się przez to psuje, a się serio napaliłem na ten projekt :(

Może da się jakoś do naprawy tego wykorzystać creation code w roomie. Nie wiem, zielony na tym polu dosyć jestem niestety

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zamieniłem kod żeby operował na surface i nie działało. A potem zmieniłem trochę randomowego kodu i DZIAŁA, zarówno przy ponownym wczytaniu jak i przy restarcie roomu.

Link poniżej, nie wiem dlaczego teraz działa, ale działa(tylko na nowo wczytaj height mapę bo się nią trochę bawiłem i jest inna od oryginalnej):

 

https://led.feen.us/wpgrzu1m.rar

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

draw spritu może nie działać w evencie create ( z milionów różnych losowych powodów ) a tam jest wywoływany, po za tym, może jeszcze coś innego przykrywać ten sprite gdy getpixel próbuje pobrać pixele z ekranu.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am vader ech, naprawdę dzięki za pomoc, ale dupa, u mnie nadal płasko nie wiem czemu. I po spacji i po enterze. Do tego pojawił się jakiś problem z depthem. Aj, naprawdę nie wiem czemu mi nie działa w takim razie. Strasznie pizdowaty i nielogiczny problem, nie wiadomo o co chodzi. Nadal próbuję coś zdziałać na własną rękę, ale już kompletnie zgłupiałem. Jak myślisz, czemu występuje u mnie ten problem w Twoim gmk? Kurde no, to wszystko nie ma w ogóle sensu.

m6d4qr.png

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A może to przez wejście w tryb 3D? 
Być może model się generuje zanim tryb 3D wejdzie w życie i to jest poprawne a potem już po wejściu w 3D i zmianie perspektywy sprite się nie rysuje tam gdzie powinien.

 

Założenie tego skryptu było takie by sprite na chwilę się wyświetlał w górnym lewym rogu ekranu i getpixel miał z ekranu pobrać kolory no ale po wejściu w tryb 3D ten sprite będzie się wyświetlać gdzieś tam na ziemi w ustalonej perspetywie a nie na ekranie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Tak, tylko, że to właśnie miała naprawić konwersja do surface, którą zrobiłem w swojej wersji. Spróbuję jeszcze popracować nad tym.

 

Edit:

Tak myśląc o słowach hudera - spróbuj dać d3d_end() na starcie terrain_create() i d3d_start() na końcu terrain_create().

Jak nie zadziała spróbuj zamienić miejscami d3d_end i d3d_start, może to pomoże.

 

Samo d3d_start(); w 1 lini terrain_create() ?

Jak ponownie odpalilem projekt znowu mi nie dzialalo, a po wpisaniu d3d_start zadziałało mimo kilkukrotnego restartu GM'a.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Tylko że tryb 3D nie koniecznie może się aktualizować już w chwili wywołania funkcji. Może zmiana następuje klatkę gry później? 

Najgorsze jest to że w GM8 trzeba było kombinować, w GMS dałoby się ten skrypt do eventu GUI i by nie było problemu z niczym.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am vader @I am Lord naprawdę dzięki wielkie za pomoc, ale jednak mijają dni, ciągle próbuję coś tu wskórać i nijak nie idzie tego rozwiązać. Chyba muszę dać sobie spokój i kombinować jakoś inaczej ukształtowanie terenu. Strasznie pluję sobie w brodę, że nie zacząłem tego projektu w Studio, bo już nawet chyba nie ma co próbować go przenieść do gmz. Mimo wszystko jeżeli może znacie jakieś inne sposoby na rysowanie terraina byłbym bardzo wdzięczny, bo jednak żal trochę pozbawiać gry tego elementu. Co prawda można próbować renderować po prostu modele .gmmod, ale to strasznie czasochłonne i problematyczne przy znajdowaniu wysokości w danym punkcie mapy, więc ten pomysł raczej odpada. Jeżeli macie jakieś pomysły to jestem w pełni otwarty

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Powiedz tylko, nie działa przykład czy nie działa przykład jak go zaimportujesz do siebie? Może coś w Twoim kodzie walczy z d3d?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

no niestety już sam gmk Twój mi nie działa poprawnie. Może też wina leży w innych wersjach GM. Robiłeś to w ósemce?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A czekajcie nie było w GM8 czegoś takiego jak screen_redraw czy refresh? już nie pamiętam.  Można by spróbować to wstawić przed pętlą która odczytywać ma pixele

 

Pamiętam jak ja debugowałem sobie takiego typu rzeczy że wywoływałem redraw i potem sleep() / keyboard_wait() i patrzyłem na ekran czy coś się wyświetla w miejscu w którym miało się wyświetlać.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

@I am Lord rzeczywiście są funkcje screen_redraw i screen_refresh i może są kluczem do tego wszystkiego. Ale cholera nie ma nigdzie już w dokumentacji o tym i nie wiem jak się tych funkcji używa. Jak proponujesz to w kodzie umieścić? I czym się te funkcje właściwie od siebie różnią?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

MAM TO SKURWESYNY

tzn tak połowicznie. Kluczem okazał się być screen_refresh() połączony z wyłączeniem d3d przy room end. Haczyk jest w tym, że przez to przez około sekundę w lewym górnym rogu pojawia się sprite heightmapy w czasie gdy room się ładuje, ale pokombinuję i może da radę to zatuszować. A nawet jeśli nie to koło dupy mi to lata, bo w końcu mogę ruszyć ten projekt do przodu. Chylę wam czoła koledzy, byliście bardzo pomocni. Całuję sygnety :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Skoro sprite pokazuje sie w lewym gornym rogu nie oznacza to ze nie uzywasz mojego przykladu ktory bazuje na surface'ach?

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

nie, użyłem tylko tego screen_refresh. Ale i tak już nieważne, bo znowu przestało działać i chuj wie kompletnie czemu. Daję już sobie spokój, nie mam nerwów.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nie ale serio, jeśli nie próbowałeś używać surface to nie mów, że próbowałeś wszystkiego. Jedyny powód że bardziej nie mogę Ci pomóc jest taki, że u mnie wszystko działa perfekcyjnie w sposób w jaki to zrobiłem.. coś musi być w Twoim kodzie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jak duży jest ten projekt? Może dałoby radę na gms go przerobić?

Jak ja portowałem Maze Strategy z GM8 na GMS to się na początku załamałem ile tam było błędów i problemów ale okazało się że wystarczył tydzień by wszystko było cacy. Tydzień w porównaniu z 6 miesiącami pracy to był pikuś :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

dobra @I am vader, zwracam całkowicie honor i chylę czoła. Twój przykład co przesłałeś mi nie działał należycie, ale analogicznie używając surface'ów i screen_refresh() u siebie w projekcie wszystko zaczęło jednak śmigać :) I do tego wszystko jest diabelnie idealne teraz. Wcześniej gdy mi chwilę działało po prostu dbałem też o to, by w czasie tworzenia terraina nic innego się nie rysowało i dlatego wyświetlała się heightmapa na chwile w rogu. A teraz nawet mając zawalone całe gui i bez wyłączania D3D wszystko działa. Ciężko mi nadal ogarnąć czemu ten terrain_create() był tak na wszystko czuły i wybredny, ale naprawdę serce się raduje, że w końcu mam to z głowy. Więc panowie @I am vader i @I am Lord jestem wam wdzięczny całym sobą i dzięki, że ten temat nie umarł bez rozwiązania. A co do przeniesienia projektu do gms - oczywiście próbowałem, ale w studio tekstury są zupełnie inaczej przetwarzane. Ja lecę tradycyjnie, tekstury o wymiarach w potęgach dwójki, więc każdy sprite składający się na model gracza jest w tych samych wymiarach, ale po prostu jest dużo pustki. Może mało to wydajne, ale to i tak wciąż parę pixeli i bardzo ułatwia pracę. W Studio ta pusta przestrzeń w ogóle nie jest brana pod uwagę i automatycznie "wycina" ją z tych sprajtów, przez co wszystko się kiełbasi. Poza tym alpha w 3D też już trochę inaczej chyba działa, a do udźwiękowienia używam DLLa, których też inaczej się używa w gms. Ogólnie trzeba by było przepisać wszystko na nowo i nie wiem czy gra warta świeczki, bo po rozwiązaniu teraz tego problemu z heightmapą, ósemka powinna mi już całkowicie wystarczyć. Zbyt się przyzwyczaiłem do niej. Żałuję tego, ale co zrobić ;)

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

×