Skocz do zawartości

Surfacy


kt1117

Rekomendowane odpowiedzi

Bardzo prosta rzecz. Podam zaraz kod. Chodzi o to, że dopóki lina się nie zginała, to miałem tylko jeden surfek, a teraz mam ich więcej.

 

Kod:

GML (step)
ilosc=0

while (ilosc<=czek)

{

if ilosc<czek

{

execute_string("surface_set_target(sprite_linka"+string(ilosc)+")")

///////////////////////////////////długości liczone z pitagorasa/////////////////

draw_rectangle(0,0,1000,32,0)

draw_clear_alpha(c_white,0)

xx=max(czek_x[ilosc],czek_x[ilosc+1])

xxx=min(czek_x[ilosc],czek_x[ilosc+1])

 

yy=max(czek_y[ilosc],czek_y[ilosc+1])

yyy=min(czek_y[ilosc],czek_y[ilosc+1])

}

else

{

surface_set_target(sprite_linka)

///////////////////////////////////długości liczone z pitagorasa/////////////////

draw_rectangle(0,0,1000,32,0)

draw_clear_alpha(c_white,0)

xx=max(czek_x[ilosc],player.x)

xxx=min(czek_x[ilosc],player.x)

 

yy=max(czek_y[ilosc],player.y)

yyy=min(czek_y[ilosc],player.y)

}

 

 

xxxx=xx-xxx

yyyy=yy-yyy

 

dlll=power(power(xxxx,2)+power(yyyy,2),0.5)

///////////////////////////////pętelka rysujaca///////////////////////

a=0

while (a+58<dlll)

{

draw_sprite(sprite6,0,a,0)

a+=58

}

 

 

draw_sprite_part(sprite6,0,0,0,dlll-a,7,a,0)

 

surface_reset_target()

ilosc+=1

}

 

if player.lina=1

{

surface_set_target(sprite_linka)

///////////////////////////////////długości liczone z pitagorasa/////////////////

draw_rectangle(0,0,1000,32,0)

draw_clear_alpha(c_white,0)

xx=max(x,player.x)

xxx=min(x,player.x)

 

yy=max(y,player.y)

yyy=min(y,player.y)

 

xxxx=xx-xxx

yyyy=yy-yyy

 

dlll=power(power(xxxx,2)+power(yyyy,2),0.5)

///////////////////////////////pętelka rysujaca///////////////////////

a=0

while (a+58<dlll)

{

draw_sprite(sprite6,0,a,0)

a+=58

}

 

 

draw_sprite_part(sprite6,0,0,0,dlll-a,7,a,0)

 

surface_reset_target()

ilosc+=1

}

 

Wiem, że lepiej było by zamienić tą tablicę na listę, ale to utrudnia debug.

 

sprite6, to sprite 32x58 z teksturką liny.

E:Dam jeszcze kod na zaginanie:

GML (draw)
draw_set_color(c_red)

if player.lina=2

{

n=0

while (n<czek)

{

execute_string("draw_surface_ext(sprite_linka"+string(n)+",/*tutaj czek*/czek_x[n],/*tutaj czek*/czek_y[n],1,1,point_direction(/*tutaj czek*/czek_x[n],/*tutaj czek*/czek_y[n],czek_x[n+1],czek_y[n+1]),c_white,1)")

//draw_line(czek_x[n],czek_y[n],czek_x[n+1],czek_y[n+1])

n+=1

}

draw_surface_ext(sprite_linka,czek_x[czek],czek_y[czek],1,1,point_direction(czek_x[czek],czek_y[czek],player.x,player.y),c_white,1)

}

 

if player.lina=1

draw_surface_ext(sprite_linka,/*tutaj czek*/x,/*tutaj czek*/y,1,1,point_direction(/*tutaj czek*/x,/*tutaj czek*/y,player.x,player.y),c_white,1)

//draw_line(x,y,player.x,player.y);</span></span>

i

GML (begin step)
if collision_line(czek_x[czek],czek_y[czek],player.x,player.y,parent,1,1) and player.lina=2

{

czek+=1

pk=point_direction(czek_x[czek-1],czek_y[czek-1],player.x,player.y)

 

po=0

 

///while(!collision_line(czek_x[czek-1],czek_y[czek-1],czek_x[czek-1]+lengthdir_x(po,pk),czek_y[czek-1]+lengthdir_y(po,pk),parent,0,0))

//{

// po+=1

// }

//////////////////////////////////////////////////Wyszukiwanie binarne\\\\\\\\\\\\\\\\\\\\\\\\\

p=0

k=point_distance(czek_x[czek-1],czek_y[czek-1],player.x,player.y)

 

while(p!=k) //w pewnym momencie nasz przedział będzie tak krótki, że będzie zawierał jeden element (p==k). To będzie nasz wynik

{

po=floor((p+k)/2); //Strzelamy w połowę przedziału i zapisujemy do zmiennej q

if(collision_line(czek_x[czek-1],czek_y[czek-1],czek_x[czek-1]+lengthdir_x(po,pk),czek_y[czek-1]+lengthdir_y(po,pk),parent,0,0)) //jeśli q spełnia nasz warunek...

k=po; //ucinamy przedział o wszystkie liczby większe od q

else //w przeciwnym wypadku...

p=po+1; //ucinamy przedział o wszystkie liczby mniejsze i równe q (bo q też jest złe więc je też ucinamy, stąd q+1)

}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

czek_x[czek]=czek_x[czek-1]+lengthdir_x(po-1,pk)

czek_y[czek]=czek_y[czek-1]+lengthdir_y(po-1,pk)

 

execute_string("sprite_linka"+string(czek)+"=surface_create(1000,5)")

}

 

m=0

ok=0

 

 

while (ok=0)

{ if czek>0

{

if !collision_line(czek_x[czek-1],czek_y[czek-1],player.x,player.y,parent,0,0)

{

 

czek_x[czek]=0

czek_y[czek]=0

 

execute_string("surface_free(sprite_linka"+string(czek)+")")

 

czek-=1

}

else

ok=1

}

else

ok=1

}

if !collision_line(x,y,player.x,player.y,parent,0,0)

{

n=1

repeat(czek)

{

czek_x[czek]=0

czek_y[czek]=0

 

execute_string("surface_free(sprite_linka"+string(n)+")")

 

czek-=1

n+=1

 

}

}

z=0

while (z+2<=czek)

{

if point_distance(czek_x[z],czek_y[z],czek_x[z+2],czek_y[z+2])<5

{

while(zz<czek-z)

{

czek_x[z+zz]=czek_x[z+zz+1]

czek_y[z+zz]=czek_y[z+zz+1]

zz+=1

}

 

execute_string("surface_free(sprite_linka"+string(czek)+")")

czek-=1

}

z+=1

}

 

E2:Trochę kodu zaczerpnięte z przykładów.

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