Skocz do zawartości

Tile Collisions


Rekomendowane odpowiedzi

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

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

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

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