Matrix_ Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 Witam, słuchajcie czy mógłby mi ktoś pomóc zrozumieć ten kod z demo GM:S ? [CreateCollisionMap] GML var xx,yy,i,t,top,left,s; global.mapsize=floor(room_width/32)*floor(room_height/32); // Loop through the tile map, and find the tiles, then place them // in the "simple" collision map. for( yy=0;yy<room_height;yy+=32) { s=""; for( xx=0;xx<room_width;xx+=32) { i = (xx/32)+((yy/32)*(room_width/32)); global.map=-1; t = tile_layer_find(10,xx,yy); if( t>=0 ) { s = s+"1"; left = tile_get_left(t); global.map=left/32; }else s = s+"_"; } show_debug_message(s); } Ten kod chyba tworzy zastępczą siatkę z miejscami gdzie są tilesy ? [ProcessPlayer] GML var xx,yy,c1,c2; // Apply gravity (and jumping) y = y+grav; grav+=0.4; if( grav>=10 ) grav=10; // If falling, check UNDER the player if( grav<0 ) { if( dir=1){ sprite_index = jump_right; }else{ sprite_index = jump_left; } c2 = -1; c1 = GetCollision(x,y); if( (x&$1f)>0 ) { c2=GetCollision(x+32,y); } if( c1>=0 || c2>=0 ) { grav=0; y = (y&$ffffffe0)+32; } } else{ // Otherwise, check above player if( jump ) { if( dir=1){ sprite_index = fall_right; }else{ sprite_index = fall_left; } }else{ grav=0; jump=true; } c2 = -1; c1 = GetCollision(x,y+32); if( (x&$1f)>0 ) { c2=GetCollision(x+32,y+32); } if( c1>=0 || c2>=0 ) { y = (y&$ffffffe0); jump=0; if( dir=1){ sprite_index = walk_right; }else{ sprite_index = walk_left; } } } // If moving left, check LEFT collision if( keyboard_check(vk_left) ) { dir=-1; if(!jump){ sprite_index = walk_left; } x=x-xspeed; c2=-1; c1 = GetCollision(x,y); if( (y&$1f)>0 ) c2=GetCollision(x,y+32); if( c1>=0 ) || ( c2>=0 ) { x = (x&$ffffffe0)+32; } }else if( keyboard_check(vk_right) ) { // Otherwise, check collision to the right dir=1; if(!jump){ sprite_index = walk_right; } x=x+xspeed; c2 = -1; c1 = GetCollision(x+32,y); if( (y&$1f)>0 ) c2=GetCollision(x+32,y+32); if( c1>=0 ) || ( c2>=0 ) { x = (x&$ffffffe0); } } else { // If standing still, don't animate image_index =0; } Tutaj moją niezrozumiałą rzeczą są zmienne c1, c2 oraz x = (x&$ffffffe0) <--- co to daje ?? GML // // argument0 = X coordinate to get tile (in pixels, not tiles) // argument1 = Y coordinate to get tile (in pixels, not tiles) // if( argument0>=room_width ) return -1; if( argument1>=room_height ) return -1; if( argument0<0) return -1; if( argument1<0) return -1; var xx,yy; xx = floor(argument0/32) + (floor(argument1/32) * floor(room_width/32)); if( global.mapsize<xx ) return -1; return global.map[ xx ]; Ten kod sprawdza czy po lewej prawej, poniżej, powyżej gracza jest tiles ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 c1 i c2 to zmienne przechowujące pola z global.map na których stoi gracz. & to operator binarnego AND i działa on w tym wypadku na liczbach szesnastkowych. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matrix_ Opublikowano 3 Lipca 2014 Autor Udostępnij Opublikowano 3 Lipca 2014 c1 i c2 to zmienne przechowujące pola z global.map na których stoi gracz. & to operator binarnego AND i działa on w tym wypadku na liczbach szesnastkowych. A co ten operator binarny tutaj daje ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 Jeżeli użyjesz go na dwóch wartościach to zwróci trzecią. W takim np wypadku GML y = (y&$ffffffe0) wyrówna y do siatki 32px bo utnie wartości na ostatnich dwóch bitach. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matrix_ Opublikowano 3 Lipca 2014 Autor Udostępnij Opublikowano 3 Lipca 2014 Jeżeli użyjesz go na dwóch wartościach to zwróci trzecią. W takim np wypadku GML y = (y&$ffffffe0) wyrówna y do siatki 32px bo utnie wartości na ostatnich dwóch bitach. A da się to jakoś zrobić inaczej, żebym nie używał czegoś czego nie rozumiem ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 GML y = y - (y mod 32) Ale operacje binarne są o wiele szybsze. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matrix_ Opublikowano 3 Lipca 2014 Autor Udostępnij Opublikowano 3 Lipca 2014 GML y = y - (y mod 32) Ale operacje binarne są o wiele szybsze. Tylko trzeba je zrozumieć. Nie mogę znaleźć w tym kodzie gdzie jest informacja który layer ma być jako solid (10 to jest) ale chce znaleźć gdzie jest ustawienie tego. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 GML t = tile_layer_find(10,xx,yy); Solid są wszystkie umieszczone na layer (depth) 10. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matrix_ Opublikowano 3 Lipca 2014 Autor Udostępnij Opublikowano 3 Lipca 2014 GML t = tile_layer_find(10,xx,yy); Solid są wszystkie umieszczone na layer (depth) 10. Dzięki, nie mogłem tego znaleźć w tym kodzie, dobrze że tu nie ma tysiąca linijek :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matrix_ Opublikowano 3 Lipca 2014 Autor Udostępnij Opublikowano 3 Lipca 2014 Ciężko będzie tylko zrobić dla przeciwników ;/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 Ciężko? No nie wiem pomyślmy... przerobić ProcessPlayer() żeby zamiast keyboard_* były reakcje przeciwnika? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matrix_ Opublikowano 3 Lipca 2014 Autor Udostępnij Opublikowano 3 Lipca 2014 Ciężko? No nie wiem pomyślmy... przerobić ProcessPlayer() żeby zamiast keyboard_* były reakcje przeciwnika? Tylko że ja kożystam z GML mp_potential_step( obj_player.x , obj_player.y , 6 , solid ) Ale mam pomysł, żeby w miejscach gdzie jest tile, to tam tworzy się obiekt solid który jest solidem i bohater go omija i przeciwnik. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 3 Lipca 2014 Udostępnij Opublikowano 3 Lipca 2014 Ale mam pomysł, żeby w miejscach gdzie jest tile, to tam tworzy się obiekt solid który jest solidem i bohater go omija i przeciwnik. W takim razie nie ma to wcale sensu. Obejrzyj to i rób to w taki sposób, skoro chcesz uzywać tiles: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę