|
01.02.2009, 00:46
|
#1
|
Разработчик
Регистрация: 18.10.2007
Сообщений: 349
Написано 64 полезных сообщений (для 95 пользователей)
|
Функции работы с геометрией для игр
Вот решил вернуться временно к BlitzMax.
Создаю функции работы с геометрией для 2d игр.
Пока применения им нету,
но потом создам более мощные функции,
например для определения столкновений.
Пока только:
1: Определение дистанции
2: Нормирование
3: Проекция
(получение нового вектора,
с помощью проецирования другово вектора на прямую)
Статья: http://noregret.org/tutor/n/collision/
Очень хорошая статья
''''''''''''''''''''''''''''''Проект''''''''''''''''''''''''''''''
SuperStrict
SeedRnd(MilliSecs())
AppTitle$ = "GEOMETRY FUNCTIONS VERSION 1.0"
''''''''''''''''''''''''''''''Типы''''''''''''''''''''''''''''''
Global azgf_function : String[3]
Global azgf_forms : Byte[3]
Global azgf_form : tzgf_form[4]
Type tzgf_form
Field f: Byte
Field x: Short
Field y: Short
Field w: Short
Field h: Short
Field a: Short
Field r: Byte
Field g: Byte
Field b: Byte
Field s: Byte
Method Update( _c: Byte )
If point_d = 1 And MouseX()>x-w And MouseX()<x+w And MouseY()>y-h And MouseY()<y+h
point_n=_c
End If
If point_n=_c And point_d>0
x=MouseX()
If x<(gfx_width-gfx_height) Then x=gfx_width-gfx_height
If x>gfx_width Then x=gfx_width
y=MouseY()
If y<0 Then y=0
If y>gfx_width Then y=gfx_width
End If
If x<0 Then x = 0
If y<0 Then y = 0
If x>gfx_width Then x = gfx_width
If y>gfx_height Then y = gfx_height
End Method
Method Draw( _c: Byte )
SetColor r,g,b
If f=1
DrawRect x-w,y-h,w*2,h*2
DrawText _c,x+w,y+h
End If
End Method
Function Create: tzgf_form( _f: Byte, _x: Short, _y: Short, _w: Short, _h: Short, _a: Short, _r: Byte, _g: Byte, _b: Byte, _s: Byte )
Local _obj: tzgf_form= New tzgf_form
_obj.f= _f
_obj.x= _x
_obj.y= _y
_obj.w= _w
_obj.h= _h
_obj.a= _a
_obj.r= _r
_obj.g= _g
_obj.b= _b
_obj.s= _s
Return _obj: tzgf_form
End Function
End Type
''''''''''''''''''''''''''''''Переменные''''''''''''''''''''''''''''''
Global menu: Byte= False
Global gfx_width: Int= 640
Global gfx_height: Int= 480
Global gfx_widthdiv: Int= gfx_width/2
Global gfx_heightdiv: Int= gfx_height/2
Global gfx_depth: Int= 32
Global gfx_hertz: Int= 75
Global time_old: Long
Global time_new: Short
Global time_next: Long
Global time_nrnd_max: Short
Global time_nrnd_min: Short
Global time_nfps: Short
Global time_ornd_max: Short
Global time_ornd_min: Short
Global time_ofps: Short
Global point_d: Byte= 0
Global point_m: Byte= False
Global point_r: Byte= False
Global point_f: Byte= 0
Global point_n: Byte= 255
Global n: Short= 0
''''''''''''''''''''''''''''''Загрузка''''''''''''''''''''''''''''''
azgf_function[0]="distance"
azgf_function[1]="normalization"
azgf_function[2]="projection"
azgf_forms[0]=2
azgf_forms[1]=3
azgf_forms[2]=4
fzgf_create( )
''''''''''''''''''''''''''''''Установка графики''''''''''''''''''''''''''''''
SetGraphicsDriver GLMax2DDriver()
Graphics gfx_width , gfx_height , 0 , 0
AutoMidHandle(True)
ShowMouse()
SetClsColor 127,127,127
''''''''''''''''''''''''''''''Главный цикл''''''''''''''''''''''''''''''
While Not KeyDown(KEY_ESCAPE)
time_new=(MilliSecs()-time_old)
time_old=MilliSecs()
If time_next < time_old
time_next=time_old/1000*1000+1000
time_ornd_max=time_nrnd_max
time_ornd_min=time_nrnd_min
time_ofps=time_nfps
time_nrnd_max=0
time_nrnd_min=65535
time_nfps=0
End If
time_nfps:+1
If time_nrnd_max < time_new Then time_nrnd_max = time_new
If time_nrnd_min > time_new Then time_nrnd_min = time_new
Cls
If MouseDown(MOUSE_LEFT) And point_d=0 Then point_d=1
If Not MouseDown(MOUSE_LEFT)
point_d=0
point_n=255
End If
For n = 0 Until azgf_forms[point_f]
If azgf_form[n].s= 1 Or azgf_form[n].s= 3 Then azgf_form[n].Update(n)
Next
fzgf_update( )
For n = 0 Until azgf_forms[point_f]
If azgf_form[n].s> 1 Then azgf_form[n].Draw(n+1)
Next
If point_d=1 Then point_d=2
SetColor 255,255,255
DrawLine gfx_width-gfx_height,0,gfx_width-gfx_height,gfx_height
DrawText "GEOMETRY FUNCTIONS" , 0 , 0
DrawText "VERSION 1.0" , 0 , 10
DrawText "AUTHOR: ZHELEZNOV" , 0 , 20
DrawText " ANDREY IVANOVICH" , 0 , 30
DrawText "SET FUNCTION" , 0 , 50
DrawText " WITH KEY TAB" , 0 , 60
DrawText " CURRENT IS "+point_f , 0 , 70
DrawText " NAME IS " , 0 , 80
DrawText " "+azgf_function[point_f] , 0 , 90
If KeyHit(KEY_TAB)
point_f:+1
If point_f>2 Then point_f=0
fzgf_create( )
End If
DrawText "FRAME: " + time_ornd_Min + "ms-" + time_ornd_max + "ms" , 0 , gfx_height-30
DrawText "FPS: " + time_ofps + "frame/s" , 0 , gfx_height-20
Flip
Wend
End
Function fzgf_create( )
Select point_f
Case 0
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
Case 1
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
azgf_form[2]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
Case 2
azgf_form[0]= tzgf_form.Create( 1,300,200,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,255,0,0,3 )
azgf_form[2]= tzgf_form.Create( 1,350,100,5,5,0,0,0,255,3 )
azgf_form[3]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
End Select
End Function
Function fzgf_update( )
Local _x1:Int, _y1:Int, _x2:Int, _y2:Int, _xxpyy:Float, _distance:Double
SetColor 255,255,255
Select point_f
Case 0
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+_x1 , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+_y1 , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
DrawText " =sqrt("+_x1+"*"+_x1+"+" , 0 , 200
DrawText " +"+_y1+"*"+_y1+")=" , 0 , 210
_xxpyy=_x1*_x1+_y1*_y1
DrawText " =sqrt("+_xxpyy+")=" , 0 , 220
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 230
Case 1
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+_x1 , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+_y1 , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 200
If _distance<>0
azgf_form[2].x=azgf_form[0].x+_x1/_distance*100
azgf_form[2].y=azgf_form[0].y+_y1/_distance*100
DrawText "x3=x1+x/DIST*100=" , 0 , 210
DrawText " ="+azgf_form[2].x , 0 , 220
DrawText "y3=y1+y/DIST*100=" , 0 , 230
DrawText " ="+azgf_form[2].y , 0 , 240
Else
DrawText "DIV TO 0" , 0 , 210
End If
SetLineWidth 5
SetColor 255,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetLineWidth 1
Case 2
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
DrawText "x3="+azgf_form[2].x , 0 , 160
DrawText "y3="+azgf_form[2].y , 0 , 170
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+_x1 , 0 , 180
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+_y1 , 0 , 190
_x2=azgf_form[0].x-azgf_form[2].x
DrawText "vx=x3-x1="+_x2 , 0 , 200
_y2=azgf_form[0].y-azgf_form[2].y
DrawText "vy=y3-y1="+_y2 , 0 , 210
_xxpyy=Float(_x2*_x1+_y2*_y1)/Float(_x1*_x1+_y1*_y1)
DrawText "coefficient=" , 0 , 220
DrawText " =(vx*_x+_vy*_y)/" , 0 , 230
DrawText " /(x*_x+_y*_y)=" , 0 , 240
DrawText " =("+_x2+"*"+_x1+"+" , 0 , 250
DrawText " +"+_y2+"*"+_y1+")/" , 0 , 260
DrawText " /("+_x1+"*"+_x1+"+" , 0 , 270
DrawText " +"+_y1+"*"+_y1+")=" , 0 , 280
DrawText " ="+_xxpyy , 0 , 290
DrawText "x4=x1-coeff*x=" , 0 , 300
DrawText " ="+(azgf_form[0].x-_xxpyy*_x1) , 0 , 310
DrawText "y4=y1-coeff*y=" , 0 , 320
DrawText " ="+(azgf_form[0].y-_xxpyy*_y1) , 0 , 330
azgf_form[3].x=azgf_form[0].x-_xxpyy*_x1
azgf_form[3].y=azgf_form[0].y-_xxpyy*_y1
SetLineWidth 3
SetColor 255,0,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[1].x,azgf_form[1].y
SetColor 0,0,255
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetColor 0,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[3].x,azgf_form[3].y
SetLineWidth 1
End Select
End Function
|
(Offline)
|
|
02.02.2009, 00:02
|
#2
|
Разработчик
Регистрация: 18.10.2007
Сообщений: 349
Написано 64 полезных сообщений (для 95 пользователей)
|
Ответ: Функции работы с геометрией для игр
Вот уже есть опыт для определения столкновения квадратов.
Пока код не очень удачный, но на этом примере
я понял как определять столкновения разных фигур.
Опять-же рекомендую хорошую статью по коллизиям,
в ней изложен один из способов: http://noregret.org/tutor/n/collision/
Добавлена новая функция квадраты:
Действует по формулам в конце статьи.
Версия 2.0
''''''''''''''''''''''''''''''Проект''''''''''''''''''''''''''''''
SuperStrict
SeedRnd(MilliSecs())
AppTitle$ = "GEOMETRY FUNCTIONS VERSION 1.0"
''''''''''''''''''''''''''''''Типы''''''''''''''''''''''''''''''
Global azgf_function : String[4]
Global azgf_forms : Byte[4]
Global azgf_form : tzgf_form[18]
Type tzgf_form
Field f: Byte
Field x: Short
Field y: Short
Field w: Short
Field h: Short
Field a: Short
Field r: Byte
Field g: Byte
Field b: Byte
Field s: Byte
Method Update( _c: Byte )
Local _a:Int
If point_m = 1 And MouseX()>x-w And MouseX()<x+w And MouseY()>y-h And MouseY()<y+h
point_n=_c
point_x=MouseX()-x
point_y=MouseY()-y
End If
If point_n=_c And point_m>0
x=MouseX()-point_x
If x<(gfx_width-gfx_height) Then x=gfx_width-gfx_height
If x>gfx_width Then x=gfx_width
y=MouseY()-point_y
If y<0 Then y=0
If y>gfx_width Then y=gfx_width
Else
If point_r = 1 And MouseX()>x-w And MouseX()<x+w And MouseY()>y-h And MouseY()<y+h
point_n=_c
point_a=a-MouseX()
End If
If point_n=_c And point_r>0
_a=MouseX()+point_a
While _a<0
_a:+360
Wend
While _a>=360
_a:-360
Wend
a=_a
End If
End If
If x<0 Then x = 0
If y<0 Then y = 0
If x>gfx_width Then x = gfx_width
If y>gfx_height Then y = gfx_height
End Method
Method Draw( _c: Byte )
SetColor r,g,b
If f=1
DrawRect x-w,y-h,w*2,h*2
DrawText _c,x+w,y+h
ElseIf f=2
SetHandle w,h
SetRotation a
DrawRect x,y,w*2,h*2
SetHandle 0,0
SetRotation 0
DrawText _c,x+w,y+h
End If
End Method
Function Create: tzgf_form( _f: Byte, _x: Short, _y: Short, _w: Short, _h: Short, _a: Short, _r: Byte, _g: Byte, _b: Byte, _s: Byte )
Local _obj: tzgf_form= New tzgf_form
_obj.f= _f
_obj.x= _x
_obj.y= _y
_obj.w= _w
_obj.h= _h
_obj.a= _a
_obj.r= _r
_obj.g= _g
_obj.b= _b
_obj.s= _s
Return _obj: tzgf_form
End Function
End Type
''''''''''''''''''''''''''''''Переменные''''''''''''''''''''''''''''''
Global menu: Byte= False
Global gfx_width: Int= 640
Global gfx_height: Int= 480
Global gfx_widthdiv: Int= gfx_width/2
Global gfx_heightdiv: Int= gfx_height/2
Global gfx_depth: Int= 32
Global gfx_hertz: Int= 75
Global time_old: Long
Global time_new: Short
Global time_next: Long
Global time_nrnd_max: Short
Global time_nrnd_min: Short
Global time_nfps: Short
Global time_ornd_max: Short
Global time_ornd_min: Short
Global time_ofps: Short
Global point_m: Byte= 0
Global point_r: Byte= 0
Global point_f: Byte= 0
Global point_n: Byte= 255
Global point_x: Int= 0
Global point_y: Int= 0
Global point_a: Int= 0
Global n: Short= 0
Global sqrt2: Double= Sqr(2)
''''''''''''''''''''''''''''''Загрузка''''''''''''''''''''''''''''''
azgf_function[0]="distance"
azgf_function[1]="normalization"
azgf_function[2]="projection"
azgf_function[3]="rectslanges"
azgf_forms[0]=2
azgf_forms[1]=3
azgf_forms[2]=4
azgf_forms[3]=18
fzgf_create( )
''''''''''''''''''''''''''''''Установка графики''''''''''''''''''''''''''''''
SetGraphicsDriver GLMax2DDriver()
Graphics gfx_width , gfx_height , 0 , 0
AutoMidHandle(True)
ShowMouse()
SetClsColor 127,127,127
''''''''''''''''''''''''''''''Главный цикл''''''''''''''''''''''''''''''
While Not KeyDown(KEY_ESCAPE)
time_new=(MilliSecs()-time_old)
time_old=MilliSecs()
If time_next < time_old
time_next=time_old/1000*1000+1000
time_ornd_max=time_nrnd_max
time_ornd_min=time_nrnd_min
time_ofps=time_nfps
time_nrnd_max=0
time_nrnd_min=65535
time_nfps=0
End If
time_nfps:+1
If time_nrnd_max < time_new Then time_nrnd_max = time_new
If time_nrnd_min > time_new Then time_nrnd_min = time_new
Cls
If MouseDown(MOUSE_LEFT) And point_m=0 Then point_m=1
If Not MouseDown(MOUSE_LEFT) Then point_m=0
If MouseDown(MOUSE_RIGHT) And point_r=0 Then point_r=1
If Not MouseDown(MOUSE_RIGHT) Then point_r=0
If point_m=0 And point_r=0 Then point_n=255
SetViewport gfx_width-gfx_height,0,gfx_width,gfx_height
For n = 0 Until azgf_forms[point_f]
If azgf_form[n].s= 1 Or azgf_form[n].s= 3 Then azgf_form[n].Update(n)
Next
fzgf_update( )
For n = 0 Until azgf_forms[point_f]
If azgf_form[n].s> 1 Then azgf_form[n].Draw(n+1)
Next
SetViewport 0,0,gfx_width,gfx_height
If point_m=1 Then point_m=2
If point_r=1 Then point_r=2
SetColor 255,255,255
DrawLine gfx_width-gfx_height,0,gfx_width-gfx_height,gfx_height
DrawText "GEOMETRY FUNCTIONS" , 0 , 0
DrawText "VERSION 2.0" , 0 , 10
DrawText "AUTHOR: ZHELEZNOV" , 0 , 20
DrawText " ANDREY IVANOVICH" , 0 , 30
DrawText "SET FUNCTION" , 0 , 50
DrawText " WITH KEY TAB" , 0 , 60
DrawText " CURRENT IS "+point_f , 0 , 70
DrawText " NAME IS " , 0 , 80
DrawText " "+azgf_function[point_f] , 0 , 90
If KeyHit(KEY_TAB)
point_f:+1
If point_f>3 Then point_f=0
fzgf_create( )
End If
DrawText "MOVE: MOUSE_LEFT" , 0 , gfx_height-70
DrawText "ROTATION:MOUSE_RIGHT" , 0 , gfx_height-60
DrawText "EXIT:KEYBOARD_ESCAPE" , 0 , gfx_height-50
DrawText "FRAME: " + time_ornd_Min + "ms-" + time_ornd_max + "ms" , 0 , gfx_height-30
DrawText "FPS: " + time_ofps + "frame/s" , 0 , gfx_height-20
Flip
Wend
End
Function fzgf_create( )
Select point_f
Case 0
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
Case 1
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
azgf_form[2]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
Case 2
azgf_form[0]= tzgf_form.Create( 1,300,200,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,255,0,0,3 )
azgf_form[2]= tzgf_form.Create( 1,350,100,5,5,0,0,0,255,3 )
azgf_form[3]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
Case 3
azgf_form[0]= tzgf_form.Create( 2,300,100,32,32,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 2,400,200,32,32,0,0,0,255,3 )
azgf_form[2]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[3]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[4]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[5]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[6]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[7]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[8]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[9]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[10]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[11]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[12]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[13]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[14]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[15]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[16]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[17]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
End Select
End Function
Function fzgf_update( )
Local _x1:Float, _y1:Float, _x2:Float, _y2:Float, _x3:Float, _y3:Float, _xxpyy:Float, _distance:Double
SetColor 255,255,255
Select point_f
Case 0
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+Int(_x1) , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+Int(_y1) , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
DrawText " =sqrt("+Int(_x1)+"*"+Int(_x1)+"+" , 0 , 200
DrawText " +"+Int(_y1)+"*"+Int(_y1)+")=" , 0 , 210
_xxpyy=_x1*_x1+_y1*_y1
DrawText " =sqrt("+Int(_xxpyy)+")=" , 0 , 220
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 230
Case 1
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+Int(_x1) , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+Int(_y1) , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 200
If _distance<>0
azgf_form[2].x=azgf_form[0].x+_x1/_distance*100
azgf_form[2].y=azgf_form[0].y+_y1/_distance*100
DrawText "x3=x1+x/DIST*100=" , 0 , 210
DrawText " ="+azgf_form[2].x , 0 , 220
DrawText "y3=y1+y/DIST*100=" , 0 , 230
DrawText " ="+azgf_form[2].y , 0 , 240
Else
DrawText "DIV TO 0" , 0 , 210
End If
SetLineWidth 5
SetColor 255,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetLineWidth 1
Case 2
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
DrawText "x3="+azgf_form[2].x , 0 , 160
DrawText "y3="+azgf_form[2].y , 0 , 170
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+Int(_x1) , 0 , 180
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+Int(_y1) , 0 , 190
_x2=azgf_form[0].x-azgf_form[2].x
DrawText "vx=x3-x1="+Int(_x2) , 0 , 200
_y2=azgf_form[0].y-azgf_form[2].y
DrawText "vy=y3-y1="+Int(_y2) , 0 , 210
_xxpyy=Float(_x2*_x1+_y2*_y1)/Float(_x1*_x1+_y1*_y1)
DrawText "coefficient=" , 0 , 220
DrawText " =(vx*_x+_vy*_y)/" , 0 , 230
DrawText " /(x*_x+_y*_y)=" , 0 , 240
DrawText " =("+Int(_x2)+"*"+Int(_x1)+"+" , 0 , 250
DrawText " +"+Int(_y2)+"*"+Int(_y1)+")/" , 0 , 260
DrawText " /("+Int(_x1)+"*"+Int(_x1)+"+" , 0 , 270
DrawText " +"+Int(_y1)+"*"+Int(_y1)+")=" , 0 , 280
DrawText " ="+_xxpyy , 0 , 290
DrawText "x4=x1-coefficient*x=" , 0 , 300
DrawText " ="+(azgf_form[0].x-_xxpyy*_x1) , 0 , 310
DrawText "y4=y1-coefficient*y=" , 0 , 320
DrawText " ="+(azgf_form[0].y-_xxpyy*_y1) , 0 , 330
azgf_form[3].x=azgf_form[0].x-_xxpyy*_x1
azgf_form[3].y=azgf_form[0].y-_xxpyy*_y1
SetLineWidth 3
SetColor 255,0,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[1].x,azgf_form[1].y
SetColor 0,0,255
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetColor 0,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[3].x,azgf_form[3].y
SetLineWidth 1
Case 3
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "a1="+azgf_form[0].a , 0 , 140
DrawText "x2="+azgf_form[1].x , 0 , 150
DrawText "y2="+azgf_form[1].y , 0 , 160
DrawText "a2="+azgf_form[1].a , 0 , 170
_x1=Cos(azgf_form[0].a)*azgf_form[0].w
_y1=Sin(azgf_form[0].a)*azgf_form[0].h
_x2=azgf_form[1].x-_x1-azgf_form[0].x
_y2=azgf_form[1].y-_x1-azgf_form[0].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n1="+_x1 , 0 , 180
DrawText "n1="+_y1 , 0 , 190
_x3=Cos(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].w*sqrt2
_y3=Sin(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[2].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[2].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[3].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[3].y=_xxpyy*_y1+azgf_form[0].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[4].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[4].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[5].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[5].y=_xxpyy*_y1+azgf_form[0].y
SetLineWidth 3
SetColor 255,255,0
DrawLine azgf_form[0].x-_x1*600,azgf_form[0].y-_y1*600,azgf_form[0].x+_x1*600,azgf_form[0].y+_y1*600
_x1=Cos(azgf_form[0].a+90)*azgf_form[0].w
_y1=Sin(azgf_form[0].a+90)*azgf_form[0].h
_x2=azgf_form[1].x-_x1-azgf_form[0].x
_y2=azgf_form[1].y-_x1-azgf_form[0].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n2="+_x1 , 0 , 200
DrawText "n2="+_y1 , 0 , 210
_x3=Cos(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].w*sqrt2
_y3=Sin(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[6].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[6].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[7].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[7].y=_xxpyy*_y1+azgf_form[0].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[8].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[8].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[9].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[9].y=_xxpyy*_y1+azgf_form[0].y
DrawLine azgf_form[0].x-_x1*600,azgf_form[0].y-_y1*600,azgf_form[0].x+_x1*600,azgf_form[0].y+_y1*600
_x1=Cos(azgf_form[1].a)*azgf_form[1].w
_y1=Sin(azgf_form[1].a)*azgf_form[1].h
_x2=azgf_form[0].x-_x1-azgf_form[1].x
_y2=azgf_form[0].y-_x1-azgf_form[1].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n1="+_x1 , 0 , 180
DrawText "n1="+_y1 , 0 , 190
_x3=Cos(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].w*sqrt2
_y3=Sin(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[10].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[10].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[11].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[11].y=_xxpyy*_y1+azgf_form[1].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[12].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[12].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[13].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[13].y=_xxpyy*_y1+azgf_form[1].y
SetColor 0,255,255
DrawLine azgf_form[1].x-_x1*600,azgf_form[1].y-_y1*600,azgf_form[1].x+_x1*600,azgf_form[1].y+_y1*600
_x1=Cos(azgf_form[1].a+90)*azgf_form[1].w
_y1=Sin(azgf_form[1].a+90)*azgf_form[1].h
_x2=azgf_form[0].x-_x1-azgf_form[1].x
_y2=azgf_form[0].y-_x1-azgf_form[1].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n2="+_x1 , 0 , 200
DrawText "n2="+_y1 , 0 , 210
_x3=Cos(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].w*sqrt2
_y3=Sin(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[14].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[14].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[15].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[15].y=_xxpyy*_y1+azgf_form[1].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[16].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[16].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[17].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[17].y=_xxpyy*_y1+azgf_form[1].y
DrawLine azgf_form[1].x-_x1*600,azgf_form[1].y-_y1*600,azgf_form[1].x+_x1*600,azgf_form[1].y+_y1*600
SetLineWidth 1
End Select
End Function
|
(Offline)
|
|
08.02.2009, 01:44
|
#3
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Ответ: Функции работы с геометрией для игр
блин, народ, столько кода, не понятно что к чему, не понял зачем это, посмотрел - пустота в мозгу осталась - собсно хоть кто-то понял что это и для чего и где хотя б применять? оО
при чем столько кода и не единого коммента
|
(Offline)
|
|
08.02.2009, 20:50
|
#4
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Ответ: Функции работы с геометрией для игр
ну дык это чувак, переписывает на БМ физику, реализованную в небезизвестной игре N. Это гуд, давно хотел заняться написанием статьи по методам нахождения/распознавания/оптимизации коллизий, думаю эти методы тоже пригодились бы. Тока сдается мне, что автор данного варианта, немного накосячил )))) Мельком глянув на статью, понял что у Матвея в колобках было почти тоже самое )))
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:43.
|