|
2D-программирование Вопросы, касающиеся двумерного программирования |
10.10.2012, 00:27
|
#1
|
AnyKey`щик
Регистрация: 30.06.2012
Сообщений: 12
Написано 0 полезных сообщений (для 0 пользователей)
|
Как вычислить повреждение
С помощью физического движка при столкновении двух тел можно получить импульс. Допустим, одно тело будет снарядом, а другое - кораблем. Хотелось бы вычислить повреждение, наносимое снарядом. Может кто подскажет приблизительную формулу. Пока для отладки пользуюсь бредовой, взятой из головы - импульс, умноженный на отношение массы текущего объекта, к массе объекта с которым происходит столкновение.
Т.е. чем легче тело, тем больший урон оно получит и наоборот - машина, въехавшая в поезд, например.
Буду признателен за более логичные формулы Заранее спасибо)
|
(Offline)
|
|
10.10.2012, 10:49
|
#2
|
Знающий
Регистрация: 24.12.2008
Сообщений: 280
Написано 145 полезных сообщений (для 775 пользователей)
|
Ответ: Как вычислить повреждение
Смотря из чего снаряд. Можно просто задавать кол-во повреждения в самом снаряде. Плазменый заряд - 60, нитронный заряд- 80, кинетический заряд-20. Например в моей игре столкновение корабля с более крупным ебъектом просто фатально. Мелкие объекты уничтожает щит.
|
(Offline)
|
|
10.10.2012, 17:39
|
#3
|
ПроЭктировщик
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:19.
|