Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Секционная разбивка
для любителей покопаться в коде, у меня это выглядет несколько по другому :
Global maxArrayX
Global maxArrayY
Global maxArrayThings
Global ArrayStartX = 0
Global ArrayStartY = 0
Global ArrayStepX = 10
Global ArrayStepY = 10
Global ArrayHeroRadiusX = 1
Global ArrayHeroRadiusY = 1
Global maxArrayParams = 3
Dim ThingsArray(maxArrayX,maxArrayY,maxArrayThings,maxArrayParams)
Const ArrayThingType = 0, ArrayThingHNDL = 1, ArrayThingCnt=2, ArraySingleMesh=3
Function InitArrayThings(x, y, thingsCnt)
Dim ThingsArray(0,0,0,0)
maxArrayX = x
maxArrayY = y
maxArrayThings = thingsCnt
Dim ThingsArray(maxArrayX,maxArrayY,maxArrayThings,maxArrayParams)
End Function
Function GetArrayX(x#)
Return Floor ((x - ArrayStartX) / ArrayStepX)
End Function
Function GetArrayY(y#)
Return Floor ((y - ArrayStartY) / ArrayStepY)
End Function
Function AddThingToArray(HNDL)
Local dx#,dy#,dz#,cnt
Local t.ThingT = Object.ThingT(HNDL)
dx = GetArrayX(xEntityX(t\ent,1))
dy = GetArrayY(xEntityZ(t\ent,1))
If dy>=0 And dx>=0 And dy <= maxArrayY And dx <= maxArrayX Then
If ThingsArray(dx,dy,0,ArrayThingCnt) < maxArrayThings Then
ThingsArray(dx,dy,0, ArrayThingCnt) = ThingsArray(dx,dy,0, ArrayThingCnt) + 1
cnt = ThingsArray(dx,dy,0, ArrayThingCnt)
ThingsArray(dx,dy,cnt, ArrayThingType) = t\typ
ThingsArray(dx,dy,cnt, ArrayThingHNDL) = HNDL
t\ArrayX = dx
t\ArrayY = dy
t\ArrayNum = cnt
Return True
Else
;RuntimeError("no more things to array.")
Return False
EndIf
Else
;RuntimeError("thing out from array.")
Return False
EndIf
End Function
Function MergeThingArray(HNDL,n,x,y)
FreeThingFromArray(x,y,n)
AddThingToArray(HNDL)
End Function
Function FreeThingFromArray(x,y,n)
Local cnt, k, t.ThingT
cnt = ThingsArray(x,y,0,ArrayThingCnt)
If n = cnt Then
ThingsArray(x,y,n,ArrayThingType) = 0
ThingsArray(x,y,n,ArrayThingHNDL) = 0
Else
For k = n+1 To cnt
ThingsArray(x,y,k-1,ArrayThingType) = ThingsArray(x,y,k,ArrayThingType)
ThingsArray(x,y,k-1,ArrayThingHNDL) = ThingsArray(x,y,k,ArrayThingHNDL)
t.ThingT = Object.ThingT(ThingsArray(x,y,k,ArrayThingHNDL))
t\ArrayNum = k-1
Next
EndIf
ThingsArray(x,y,0,ArrayThingCnt) = ThingsArray(x,y,0,ArrayThingCnt) - 1
End Function
Function UpdateArrayThings()
Local cnt, N, X, Y
For X = H\ArrayX-ArrayHeroRadiusX To H\ArrayX+ArrayHeroRadiusX
For Y = H\ArrayY-ArrayHeroRadiusY To H\ArrayY+ArrayHeroRadiusY
If InArrayCheck(X, Y) Then
cnt = ThingsArray(X,Y,0,ArrayThingCnt)
For N = 1 To cnt
CheckAndUseThing(ThingsArray(X,Y,N,ArrayThingType), ThingsArray(X,Y,N,ArrayThingHNDL))
Next
EndIf
Next
Next
End Function
Function InArrayCheck(x, y)
If y>=0 And x>=0 And y <= maxArrayY And x <= maxArrayX Then Return True
Return False
End Function
|