Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 09.10.2012, 20:27   #1
Eugenes
AnyKey`щик
 
Регистрация: 30.06.2012
Сообщений: 12
Написано 0 полезных сообщений
(для 0 пользователей)
Как вычислить повреждение

С помощью физического движка при столкновении двух тел можно получить импульс. Допустим, одно тело будет снарядом, а другое - кораблем. Хотелось бы вычислить повреждение, наносимое снарядом. Может кто подскажет приблизительную формулу. Пока для отладки пользуюсь бредовой, взятой из головы - импульс, умноженный на отношение массы текущего объекта, к массе объекта с которым происходит столкновение.
Т.е. чем легче тело, тем больший урон оно получит и наоборот - машина, въехавшая в поезд, например.
Буду признателен за более логичные формулы Заранее спасибо)
(Offline)
 
Ответить с цитированием
Старый 10.10.2012, 06:49   #2
Raion
Знающий
 
Аватар для Raion
 
Регистрация: 24.12.2008
Сообщений: 280
Написано 145 полезных сообщений
(для 775 пользователей)
Ответ: Как вычислить повреждение

Смотря из чего снаряд. Можно просто задавать кол-во повреждения в самом снаряде. Плазменый заряд - 60, нитронный заряд- 80, кинетический заряд-20. Например в моей игре столкновение корабля с более крупным ебъектом просто фатально. Мелкие объекты уничтожает щит.
(Offline)
 
Ответить с цитированием
Старый 10.10.2012, 13:39   #3
polopok
ПроЭктировщик
 
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений
(для 71 пользователей)
Ответ: Как вычислить повреждение

Вот варианты :
Думаю сам разберёшься в коде ...

вариант 1.
SeedRnd (MilliSecs())
Const frictiones# = 1
Global col ,oldTime ,units 


Function Dis(X1,Y1, xx,yy)
Return Abs(((xx-X1)*(xx-X1)+(yy-Y1)*(yy-Y1))^0.5)
End Function

Type bot
	Field x# ,y# ,mx# ,my# , speed# ,ang#
	Field seet% , mecii% , live% , maxlive%  , maxUp% , maxseet% , maxmecii% , uron%
	Field range% , rezult%[3]
End Type 


Function newbot.bot( x2#  , y2#  , mx1 = 50 , my1 =50 )
		b.bot = New bot
		b\x = x2
		b\y = y2
		b\mx = mx1
		b\my = my1
		b\speed = 5
		s = Rand (1,100)
		b\seet =s
		b\maxseet =s
		b\mecii =Rand(1,600)
		b\maxmecii =700
		b\live = 100
		b\maxlive = 100
		b\maxUp = 5
		b\range = 30
		b\uron = Rand (1,20)
		b\rezult[0] = 100
		b\rezult[1] = 100
		b\rezult[2] = 100
		b\rezult[3] = 100
End Function

Function colbot(b.bot)
	For bb.bot =Each bot 
		If bb<>b Then 
		If b<>Null Then 
		If bb<>Null Then 
			dx# = bb\x -b\x
			dy# = bb\y -b\y
			d#=Sqr(dx*dx+dy*dy)
			
			If d< ((b\range+2)  + (bb\range+2) ) Then 
				Color 100,0,0
				Oval bb\x# -d ,bb\y# -d, d *2, d *2 ,0			
			EndIf 
			
			If d< (b\range  + bb\range ) ;25  ;(b\r+bb\r)
			
			Color 255,0,0
			Oval bb\x# -d ,bb\y# -d, d *2, d *2 ,0
			
			
	If MilliSecs() < oldTime + 50 Then
		If b\mecii > bb\seet Then 
			damage% = Ceil ( b\uron *(0.05*( b\mecii - bb\seet  )))
		ElseIf b\mecii < bb\seet 
			 damage% = Ceil(bb\uron *(0.05*( bb\seet - b\mecii  )))
		EndIf 
		b\live = b\live -	damage
		bb\live = bb\live - damage
		b\seet = b\seet - 1
		bb\seet = bb\seet - 1
		b\mecii = b\seet - 0.1
		bb\mecii = bb\seet - 0.1
		

			If b\live <= 0 Then 
				If b\mecii > bb\mecii Then b\mecii = bb\mecii 			
				Delete b	
				units = units -1

			If bb<>Null Then  
				bb\maxUp = bb\maxUp +1
				bb\maxseet = 100  * bb\maxUp
				bb\maxlive = 100 * (bb\maxUp -4)
				bb\maxmecii = 100 *  (bb\maxUp -4)
				bb\live = bb\maxlive  ;  bb\live + ((bb\maxUp -4)*95) ; bb\live + ((bb\maxUp -4)*100)
				If bb\live >= 2500 Then bb\live = 2500
			bb\speed# = bb\speed# -1 
			bb\range = bb\range -5				
				If bb\mecii < bb\maxmecii Then bb\mecii =  bb\mecii + 1 ;Rand(10)   
				If bb\seet < bb\maxseet  Then bb\seet =  bb\seet + Rand(100) 
				
			EndIf 
			EndIf 	
		
			If bb\live <= 0 Then 
				If bb\mecii > b\mecii Then bb\mecii = b\mecii 			
				Delete bb 
				units = units -1
			If b<>Null Then  
				
				b\maxUp = b\maxUp +1
				b\maxseet = 100  * b\maxUp
				b\maxlive = 100 * (b\maxUp -4)
				b\maxmecii = 100 *  (b\maxUp -4)
				b\live = b\maxlive  ;b\live + ((b\maxUp -4)*95) ; b\live *   (b\maxUp -4)
				If b\live >= 5000 Then b\live = 5000
			b\speed# = b\speed# -1 
			b\range = b\range -5					
				If b\mecii < b\maxmecii Then b\mecii =  b\mecii + 1;Rand(10)   
				If b\seet < b\maxseet  Then b\seet =  b\seet + Rand(100) 
			EndIf 
			EndIf 
			
	
	EndIf		
			EndIf
		EndIf	
		EndIf	
		EndIf
	Next
End Function

Function dellbot(b.bot)
	Delete b
End Function



;For i=0 To 3
	newbot(  Rnd (10 , 790) ,  Rnd (10 , 590) ,  Rnd (10 , 790) ,  Rnd (10 , 590) )
;Next 
units =1

Graphics 800,600
SetBuffer BackBuffer() 
r% = 50
r2% = 2
ClsColor 190,190,200
While Not KeyHit(1) 
;SeedRnd (MilliSecs())
Cls ; Сначала очищаем экран 
;mx=MouseX() : my=MouseY()
oldTime = MilliSecs() 

For bb.bot = Each bot
	
		dist# = Dis(bb\mx,bb\my,bb\ x,bb\y) ;дистанция 


		
		colbot(bb)
		
	If bb<>Null Then 	
		If bb\speed# <= 0 Then bb\speed# = 1 
		If bb\range  <= 5 Then bb\range   = 10 
		
		Color 0,0,255
		Oval bb\x# -r2 ,bb\y# -r2 ,r2* 2, r2*2 ,1 
		
		Color 100,100,100
		Oval bb\x# -bb\range ,bb\y# -bb\range ,bb\range* 2, bb\range*2 ,0 
		 
		bb\rezult[0] = (20  * bb\live) / bb\maxlive
		bb\rezult[1] = (20  * bb\mecii) / bb\maxmecii
		bb\rezult[2] = (15  * bb\seet) / bb\maxseet
		
		Color 0,0,50
		Rect bb\x-2-24 ,bb\y -24 ,20+2 ,4 ,1
			Rect bb\x-1 -24 ,bb\y -14  ,2 ,20+2 ,1	
			Line bb\x-1 -26 ,bb\y +3  , bb\x-1 -20 ,bb\y +3
			Rect bb\x-1 -17 ,bb\y -14  ,8 ,15+2 ,1
			
		Color 200,0,0
		Rect bb\x -25,bb\y -23 , bb\rezult[0] ,2 ,1
		Color 120,120,255
			Rect bb\x-25 ,bb\y -13  ,1 ,bb\rezult[1] ,1
			Color 0,120,25
			Rect bb\x-16 ,bb\y -13  ,4 ,bb\rezult[2] ,1
					
		
		Color 0,0,50
		Text bb\x -23, bb\y +10," Speed: "+Int(bb\speed)
		Color 150,130,150
		Text bb\x -23, bb\y +9," Speed: "+Int(bb\speed)
		Text bb\x +17, bb\y -14, bb\uron
		Text bb\x +18, bb\y -4 , bb\maxUp-5
		Text bb\x-2+2 ,bb\y -24 , bb\live + "/" + bb\maxlive 
		
		If dist < r Then ; 25 порог после которого уменьшаем скорость 
			a# = dist / r 
		
			Color 2,20,2
			Oval bb\x# -dist  ,bb\y# -dist  , dist  *2, dist  *2,0
		Else 
			a# = 1
		EndIf 
		
		If dist <5 Then 
			bb\mx = Rnd (10 , 790) : bb\my = Rnd (10 , 590)
;			If units < 16 Then ;  col > 3 Then col = 0 
;			If units < 16 Then   ;col = 3 Then 
;			newbot(  Rnd (10 , 790) ,  Rnd (10 , 590) ,  Rnd (10 , 790) ,  Rnd (10 , 590) )
;			units = units +1
;			EndIf
;			EndIf
			;col = col + 1 
		EndIf
			
			If units < 6 Then ;  col > 3 Then col = 0 
			If units < 6 Then   ;col = 3 Then 
			newbot(  Rnd (10 , 790) ,  Rnd (10 , 590) ,  Rnd (10 , 790) ,  Rnd (10 , 590) )
			units = units +1
			EndIf
			EndIf
						
			bb\ang# = ATan2(bb\mx - bb\x ,bb\ my - bb\y)
			friction# = bb\speed# *a# 
		;	If x < mx Then x =x + friction#
		;	If x > mx  Then x=x - friction#
		;	If y > my  Then y =y - friction#
		;	If y < my  Then y =y + friction#
			
			bb\x =bb\x + friction# *Sin(bb\ang)
			bb\y =bb\y + friction# *Cos(bb\ang)
			
		Color 255,255,255
		Plot bb\mx -2,bb\my -2.5 
		Text 10 , 10 , col +"   "+ units; +" time: "+MilliSecs() + " oldTime : "+oldTime 
	EndIf
Next
Text 10 , 10 , col +"   "+ units
Flip

Wend 
Delete Each bot
End


вариант 2.

SeedRnd (MilliSecs())

Global col ,oldTime ,units 
Global r% = 25 , a# ,w%, sol% ,dae%

Dim CharName$(1)
CharName$(0) = "SOLDER"
CharName$(1) = "DAER"

Dim CharExp(9)							; массив необходимых очков Опыта для каждого уровня персонажа
CharExp(0) = 10
CharExp(1) = 20
CharExp(2) = 40
CharExp(3) = 90
CharExp(4) = 150
CharExp(5) = 280
CharExp(6) = 500
CharExp(7) = 900
CharExp(8) = 1300
CharExp(9) = 1850

Dim CharHp(9)							; массив необходимых очков Опыта для каждого уровня персонажа
CharHp(0) = 100
CharHp(1) = 300
CharHp(2) = 880
CharHp(3) = 1500
CharHp(4) = 2100
CharHp(5) = 3300
CharHp(6) = 4500
CharHp(7) = 5000
CharHp(8) = 6200
CharHp(9) = 7600

Function Dis(X1,Y1, xx,yy)
Return Abs(((xx-X1)*(xx-X1)+(yy-Y1)*(yy-Y1))^0.5)
End Function

Type bot
	Field x# ,y# ,mx# ,my# , speed# ,ang# , name$
	Field shit% , atak% , hp% , maxhp%  , xp% , maxxp% , text_maxx=False , uron% , level% 
	Field range% , hod#, numexp% , botTime% , attack
End Type 

Function newbot.bot(name$, x2#  , y2#  , mx1 = 50 , my1 =50 )
		b.bot = New bot
		;w% = 1- w
		If sol < dae Then name ="SOLDER"
		If sol > dae Then name = "DAER"
		b\name = name ;CharName$(w) ;Rand (100) Mod 1
		If name = "SOLDER" Then sol = sol +1
		If name ="DAER" Then dae = dae +1	
		b\x = x2
		b\y = y2
		b\mx = mx1
		b\my = my1
		b\speed = 5
		b\hod = Rand (1000,2000)
		b\shit = 100 ;Rand (1,100)
		b\atak = 100 ;Rand (1,120) ;Rnd(.1,.1)
		b\hp = 100
		b\maxhp = 100
		b\xp = 0
		b\level = 1
		b\maxxp = CharExp(0)
		b\range = 15
		b\uron = Rand (1,20)
		b\botTime = MilliSecs()
		b\attack = False 
End Function

Function mathbot(b.bot)
			If units < 17 Then   ;col = 3 Then 
				 newbot( CharName(Rand(0,1)), Rnd (10 , 790) ,  Rnd (10 , 590) ,  Rnd (10 , 790) ,  Rnd (10 , 590) )	
				units = units +1
			EndIf

						
			b\ang# = ATan2(b\mx - b\x ,b\ my - b\y)
			 friction# = b\speed# * a# 
			
			b\x =b\x + friction# *Sin(b\ang)
			b\y =b\y + friction# *Cos(b\ang)
End Function

Function botpointcollide(b.bot)
		dist# = Dis(b\mx,b\my,b\ x,b\y) ;дистанция 
		
		If dist < r Then ; 25 порог после которого уменьшаем скорость 
			a# = dist/r
		Else 
			a# =1
		EndIf 
		
		If dist <5 Then 
			b\mx = Rnd (10 , 790) : b\my = Rnd (10 , 590)
		EndIf
End Function

Function botdamage(b.bot)
	For bb.bot =Each bot 
		If bb<>b Then 
		If b<>Null Then 
		If bb<>Null Then 
		If b\name = "SOLDER" And bb\name = "DAER" Then 
			dx# = bb\x -b\x
			dy# = bb\y -b\y
			;d# = Sqr(dx*dx+dy*dy)
			d# = Dis(bb\x,bb\y, b\x,b\y)
			
			If d< (b\range  + bb\range )
			Color 110,Rand (100,210),150
			Oval b\x# - (b\range+1) ,b\y# - (b\range+1) ,(b\range+1)* 2, (b\range+1)*2 ,0 ;unit
			Oval bb\x# - (bb\range+1) ,bb\y# - (bb\range+1) ,(bb\range+1)* 2, (bb\range+1)*2 ,0 ;unit
			
				If b\hp > bb\hp Then b\xp = ( b\xp + (bb\level*3) +10)  ;Rnd (5)
				If b\hp < bb\hp Then bb\xp = ( bb\xp + (b\level*3)+10)  ; Rnd (5)	
							
				If   botTime1 + b\hod < MilliSecs() Then
;					If b\atak > bb\shit Then 
;						damage1 = Ceil ( b\uron * 1 *(1+(b\atak - bb\shit)*0.05) )
;					ElseIf b\atak < bb\shit
;						damage1 = Ceil ( bb\uron * 1/(1+(bb\shit - b\atak)*0.05) )
;					EndIf
					damage1 = Ceil((b\atak * b\shit ) * b\uron* (bb\level)*0.00005); / 10000)
					bb\hp = bb\hp - Abs( damage1) ;
					;Text 20,100,damage1
					botTime1 = MilliSecs()
				EndIf
				
				If   botTime2 + bb\hod < MilliSecs() Then
;					If bb\atak > b\shit Then 
;						damage2 = Ceil( bb\uron * 1 *(1+(bb\atak - b\shit)*0.05) )
;					ElseIf bb\atak < b\shit
;						damage2 = Ceil( b\uron * 1/(1+(b\shit - bb\atak)*0.05) )
;					EndIf
					damage2 = Ceil((bb\atak * bb\shit ) * bb\uron* (b\level) *0.00005);/ 10000)
					b\hp = b\hp -  Abs( damage2)
					botTime2 = MilliSecs()
				EndIf
				

				;
			End If 
		End If
		End If
		End If
		End If
	Next 
End Function
						
Function botexpirients(b.bot)

	If b\xp >=b\maxxp And b\maxxp = CharExp(9) Then 
	b\maxxp  = CharExp(9) 
	b\xp =b\maxxp
	 b\text_maxx=True 
	Else 
	If b\xp > b\maxxp  And (b\maxxp  < CharExp(9)) Then 
		b\numexp = b\numexp +1
		b\xp = 0 
		b\maxxp = CharExp(b\numexp)
		b\hp = CharHp(b\numexp)
		b\maxhp = CharHp(b\numexp)
		b\level = b\numexp 
		b\range = b\range +1
		b\speed = b\speed - 0.5
		b\shit = b\shit + Rand (1,20) ;Rand (1,100)
		b\atak = b\atak + Rand (1,30)
	EndIf 
	EndIf
End Function

Function delbot(b.bot)
	If b\hp <= 0 Then 
	If b\name = "SOLDER" Then
		sol = sol -1
	Else 
		dae = dae - 1
	EndIf 
	Delete b
	units = units -1
	 
	EndIf
End Function

Function drawbot(b.bot)
		If b\attack = True  Then  
	
		EndIf 	
		If b\name = "SOLDER" Then 
			Color 110,110,150
			Oval b\x# - b\range ,b\y# - b\range ,b\range* 2, b\range*2 ,1 ;uni
		ElseIf b\name = "DAER" 
			Color 150,110,110
			Oval b\x# - b\range ,b\y# - b\range ,b\range* 2, b\range*2 ,1 ;unit		
		EndIf 

		Color 0,0,5
		Line b\x#  ,b\y# , b\x#+22*Sin(b\ang)  ,b\y#+22*Cos(b\ang)
		life_bar(b\x -10 ,b\y -10,20,4, b\maxhp , b\hp ,250,0,0,0,0,50)
		working_bar(b\x -10 ,b\y -4 ,20,4, b\maxxp, b\xp ,200,200,0,0,0,50)	
			
		Color 5,5,2
		Plot b\mx -2,b\my -2.5 ;unit point
		Text b\x-19,b\y-16 ,b\level ;+" "+b\numexp"hp "+b\hp+
		Text b\x+17,b\y-16 ,(b\speed)
		Text b\x+17,b\y+16 ,b\hp
		
		If b\text_maxx=False Then 
			Color 255,255,252
			Text b\x-10,b\y+1 ,b\xp +"/"+b\maxxp 
		Else 
			Color 255,0,0
			Text b\x-10,b\y+1 ,"MaxExp "
		EndIf 
		Color 255,255,252
		Text b\x-10,b\y+21 ,b\name
		Color 44,44,44
		Text 600,20,"Unit: "+units+"   soldier: "+sol+"  daer: "+dae
End Function

For q=1 To 3 
	newbot( CharName(0), Rnd (10 , 790) ,  Rnd (10 , 590) ,  Rnd (10 , 790) ,  Rnd (10 , 590) )
Next 
For q=1 To 3
	newbot( CharName(1), Rnd (10 , 790) ,  Rnd (10 , 590) ,  Rnd (10 , 790) ,  Rnd (10 , 590) )
Next 
;===================================================================================
Graphics 800,600
SetBuffer BackBuffer() 

botTime = MilliSecs()
ClsColor 190,190,200
While Not KeyHit(1) 
Cls ; Сначала очищаем экран 
;mx=MouseX() : my=MouseY()
;oldTime = MilliSecs() 

For bb.bot = Each bot
	If bb<>Null Then 
		
		If   bb\botTime + 19 < MilliSecs() Then
		 bb\hp = bb\hp  + 2
		bb\botTime = MilliSecs()
		EndIf 
		If bb\hp >= bb\maxhp Then bb\hp = bb\maxhp 
		botexpirients(bb)

		mathbot(bb)
		botdamage(bb)
		botpointcollide(bb)	
		drawbot(bb)		
		delbot(bb)			
	End If 	
Next 
Text 10,20,botTime
;	For bb.bot = Each bot
;		If bb<>Null Then 
;			
;		End If 	
;	Next 	
Flip

Wend 
Delete Each bot
End 

; working_bar([x position],[y position],[width],[height],[current position],
; [maximum position],[red],[green],[blue],[background red],[background green],[background blue])

Function working_bar(x,y,width#,height,pos#,top#,r=0,g=0,b=0,bgr=255,bgg=255,bgb=255)
Color bgr,bgg,bgb
Rect x,y,width,height
;real_width#=((width#-4)/top#)*pos#   ;curw = (wbar  * curpts) / maxpts
real_width# =(width#  *top# ) / pos#
Color r,g,b
Rect x+1,y+1,real_width#-2,height-2
End Function

Function life_bar(x,y,width#,height,pos#,top#,r=0,g=0,b=0,bgr=255,bgg=255,bgb=255)
Color bgr,bgg,bgb
Rect x,y,width,height
;real_width#=((width#-4)*pos#)/top#  ;curw = (wbar  * curpts) / maxpts
real_width# =(width#  *  top#) / pos#
Color r,g,b
Rect x+1,y+1,real_width#-2,height-2
End Function
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Eugenes (23.10.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 00:31.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com