Collision en Circulo (Code_Snippet)

Previous topic - Next topic

mentalthink

Hola compañeros, pues justo hoy he leído en Emuzone, un compañero que explicaba el tema de los funcionamientos internos en las collisiones, supongo que sería para gente que desarrolla para le tema de 8 bits, aunque es totalmente utilizable en cualquier lenguaje, ya que explica, a parte de muy bien, el tema de las mates.

Bien he hecho esté code Snipet, porque Glbasic, no tiene colision en circulo, y creo que a parte de ser más rápida que la collision por pixel, y debido que la colision por caja, pues eso... solo es una caja he echo está función.

Supongo que el rendimiento será más optimo que el SPRCOLL, no se..., pero creo que puede ser útil por ejemplo para el tema de las naves que estoy haciendo, creo que puede estar bien.

Un saludo,
Iván
Code (glbasic) Select
// --------------------------------- //
// Project: circle_Box_Coll
// Start: Sunday, July 31, 2011
// IDE Version: 10.057


// SETCURRENTDIR("Media") // go to media files

GLOBAL distancia,distancia1,distancia2,distancia3,distancia_Final

GLOBAL x2=300
GLOBAL x1=500

GLOBAL y2=300
GLOBAL y1=200

GLOBAL radio=50
GLOBAL mx,my,b1,b2
GLOBAL preview=TRUE

GLOBAL move_in_X=0
WHILE TRUE

INC move_in_X,1
MOUSESTATE mx,my,b1,b2
func_coll_Cirlce(radio,preview)

SHOWSCREEN
WEND

FUNCTION func_coll_Cirlce:radio,preview
//VARIABLES FOR CALCULE THE POSITIONS OF EVERY POINT
x1=300+(COS(move_in_X)*40)
y1=200+(SIN(move_in_X)*40)


distancia1=POW((x2-x1),2)
distancia2=POW((y1-y2),2)

distancia3=distancia1+distancia2
distancia_Final=SQR(distancia3)


//REALLY THIS IS THE MATHEMATICAL FORMULE
IF distancia_Final-radio<radio THEN PRINT "Collide",0,0      //PRINT COLLIDE
// OR WHAT DO YOU WANT MAKE


//TEST THE COLLIDE, ONLY DRAW A GREEN CIRCLE ON EVERY POSITION
//OF EACH PONT IN TEH SCREEN
IF preview=TRUE
//testing
FOR cir1=0 TO 360
SETPIXEL x1+(COS(cir1)*radio),y1+(SIN(cir1)*radio),RGB(0,255,0)
SETPIXEL x2+(COS(cir1)*radio),y2+(SIN(cir1)*radio),RGB(255,0,0)
NEXT
ENDIF

//ONLY DRAW A PIXEL (USE SPRITE OR XOBJ[USING THE 2D TO 3D CONVERSION])
MOUSESTATE mx,my,b1,b2
x2=mx
y2=my
SETPIXEL x1,y1,RGB(255,0,0)

SETPIXEL x2,y2,RGB(0,0,255)

ENDFUNCTION


PS: No se si el código estará muy bien elaborado....



Kitty Hello

Code (glbasic) Select

dx = x1-x2
dy = y1-y2
dist = SQR(dx*dx + dy*dy)
dist * dist = SQR(dx*dx + dy*dy) * SQR(dx*dx + dy*dy)
->
dist * dist = dx*dx+dy*dy

IF dx*dx+dy*dy < (R1+R2) * (R1+R2) // muchas mas rapido - (no hablar Espaniol :( - bailar la bamba! )


mentalthink

Thanks Kitty  :-* :-* :-* much better now.  :nw:  :nw:  :nw:

:offtopic:
QuoteIF dx*dx+dy*dy < (R1+R2) * (R1+R2) // muchas mas rapido - (no hablar Espaniol :( - bailar la bamba! )

Well in Spain "la Bamba" not it´s a popular dance, in Spain the topic always it´s "Flamenco, Sevillana and Los Toros", I don´t undertand never this topic becuase this it´s principally only in the South of Spain.

Todo mis respetos a MSX y el otro compañero de Sevilla.   <3 <3 :booze: :booze: :-* :-*

msx


mentalthink

JAjAJa!!!, no MSX, pero es verdad tio...  pero vamos yo soy medio Andaluz , no te pienses cosas malas.
<3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3
:booze: :booze: :booze: :puke: :puke: :puke: :shit: :shit: :shit: :shit: :help: :help: :help: