Matrix_ Opublikowano 3 Lipca 2014 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 ?
Threef Opublikowano 3 Lipca 2014 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.
Matrix_ Opublikowano 3 Lipca 2014 Autor 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 ?
Threef Opublikowano 3 Lipca 2014 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.
Matrix_ Opublikowano 3 Lipca 2014 Autor 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 ?
Threef Opublikowano 3 Lipca 2014 Opublikowano 3 Lipca 2014 GML y = y - (y mod 32) Ale operacje binarne są o wiele szybsze.
Matrix_ Opublikowano 3 Lipca 2014 Autor 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.
Threef Opublikowano 3 Lipca 2014 Opublikowano 3 Lipca 2014 GML t = tile_layer_find(10,xx,yy); Solid są wszystkie umieszczone na layer (depth) 10.
Matrix_ Opublikowano 3 Lipca 2014 Autor 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
Matrix_ Opublikowano 3 Lipca 2014 Autor Opublikowano 3 Lipca 2014 Ciężko będzie tylko zrobić dla przeciwników ;/
Threef Opublikowano 3 Lipca 2014 Opublikowano 3 Lipca 2014 Ciężko? No nie wiem pomyślmy... przerobić ProcessPlayer() żeby zamiast keyboard_* były reakcje przeciwnika?
Matrix_ Opublikowano 3 Lipca 2014 Autor 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.
Threef Opublikowano 3 Lipca 2014 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:
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ę