forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Как вычислить повреждение (http://forum.boolean.name/showthread.php?t=17355)

Eugenes 10.10.2012 00:27

Как вычислить повреждение
 
С помощью физического движка при столкновении двух тел можно получить импульс. Допустим, одно тело будет снарядом, а другое - кораблем. Хотелось бы вычислить повреждение, наносимое снарядом. Может кто подскажет приблизительную формулу. Пока для отладки пользуюсь бредовой, взятой из головы - импульс, умноженный на отношение массы текущего объекта, к массе объекта с которым происходит столкновение.
Т.е. чем легче тело, тем больший урон оно получит и наоборот - машина, въехавшая в поезд, например.
Буду признателен за более логичные формулы :) Заранее спасибо)

Raion 10.10.2012 10:49

Ответ: Как вычислить повреждение
 
Смотря из чего снаряд. Можно просто задавать кол-во повреждения в самом снаряде. Плазменый заряд - 60, нитронный заряд- 80, кинетический заряд-20. Например в моей игре столкновение корабля с более крупным ебъектом просто фатально. Мелкие объекты уничтожает щит.

polopok 10.10.2012 17:39

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

вариант 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



Часовой пояс GMT +4, время: 23:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot