Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
а вот само решение:

Type TViz
Field I%, J%, EndI%, EndJ%
Field Direction%
End Type
Function *CreateVisPoints(plrNum%)
Local plrI%=CXtoI%(plr(plrNum)\X%)
Local plrJ%=CZtoJ%(plr(plrNum)\Z%)
Local plrDir%=plr(plrNum)\Direction%
Local CI%=plrI%, CJ%=plrJ%
Local I%, J%
Local EI%
Local Dist%=VizDistanse%
Select plrDir%
Case Dir_Up
* CJ%=plrJ%-VizDistanse%
Case Dir_Right
* CI%=plrI%+VizDistanse%
Case Dir_Down *
* CJ%=plrJ%+VizDistanse%
Case Dir_Left
* CI%=plrI%-VizDistanse%
End Select
VizUpd(plrI%,plrJ%,3)
Select plrDir%
Case Dir_Up, Dir_Down
*If plrDir%=Dir_Up Then
* EI=plrJ%-VizDistanse%
*Else
* EI=plrJ%+VizDistanse%
*EndIf
*CreateVPoint(plrI%,plrJ%,CI%,CJ%,plrDir%)
*For I%=1 To VizDistanse%
* If I=A Then
* *For TVizPoint.TViz = Each TViz
* * If (TVizPoint\I=plrI%) Then If (TVizPoint\J=plrI%) Then If (TVizPoint\Direction%=plrDir%) Then Return
* *Next
* EndIf
* CreateVPoint(plrI%,plrJ%,CI+I%,EI,plrDir%)
* CreateVPoint(plrI%,plrJ%,CI-I%,EI,plrDir%)
*Next
Case Dir_Right, Dir_Left
* If plrDir%=Dir_Right Then
* *EI%=plrI%+VizDistanse%
* Else
* *EI%=plrI%-VizDistanse%
* EndIf
* CreateVPoint(plrI%,plrJ%,CI%,CJ%,plrDir%)
*For J%=1 To VizDistanse%
* If J=A Then
* *For TVizPoint.TViz = Each TViz
* * If (TVizPoint\I=plrI%) Then If (TVizPoint\J=plrI%) Then If (TVizPoint\Direction%=plrDir%) Then Return
* *Next
* EndIf
* CreateVPoint(plrI%,plrJ%,EI%,CJ+J%,plrDir%)
* CreateVPoint(plrI%,plrJ%,EI%,CJ-J%,plrDir%)
*Next
End Select
End Function
Function CreateVPoint(I%,J%,EndI%,EndJ%,Direction%)
TVizPoint.TViz = New TViz
TVizPoint\I%=I%
TVizPoint\J%=J%
TVizPoint\EndI%=EndI%
TVizPoint\EndJ%=EndJ%
TVizPoint\Direction%=Direction%
End Function
Function UpdPlrViz()
Local AngleKoef#, sg%=1
Local D%, D1%, TI%,TJ%, A%, B%
Local Index%
Index%=0
For TV.TViz=Each TViz
*Index=Index+1
*Select TV\Direction%
*Case Dir_Up
* *D%=TV\EndI%-TV\I%
* *For J%=TV\J% To TV\EndJ% Step -1
* * TI%=TV\I% + Float(D%*Abs(TV\J%-J%))/Float(VizDistanse%)
* * TJ%=J%
* * If UPVAddon(TV, TI, TJ) Then Goto n
* *Next
*Case Dir_Right
* *D%=TV\EndJ%-TV\J%
* *For I%=TV\I% To TV\EndI%
* * TJ%=TV\J% + Float(D%*Abs(I%-TV\I%))/Float(VizDistanse%)
* * TI%=I%
* * If UPVAddon(TV, TI, TJ) Then Goto n
* *Next
*Case Dir_Down
* *D%=TV\EndI%-TV\I%
* *For J%=TV\J% To TV\EndJ%
* * TI%=TV\I% + Float(D%*Abs(J%-TV\J%))/Float(VizDistanse%)
* * TJ%=J%
* * If UPVAddon(TV, TI, TJ) Then Goto n
* *Next
*Case Dir_Left
* *D%=TV\EndJ%-TV\J%
* *For I%=TV\I% To TV\EndI% Step -1
* * TJ%=TV\J% + Float(D%*Abs(TV\I%-I%))/Float(VizDistanse%)
* * TI%=I%
* * If UPVAddon(TV, TI, TJ) Then Goto n
* *Next
*End Select
* *If Not (TV=Null) Then
* * Delete TV
* *EndIf
*.n
*If index>VizD2% Then Return
Next
End Function
Function UPVAddon%(TV.TViz,TI%,TJ%)
Local I%=0
If TI<0 Then I%=1
If TJ<0 Then I%=1
If TI>CornerW Then I%=1
If TJ>cornerH Then I%=1
If I Then
*Delete TV
*Return 1
EndIf
If Not Sceneobject(TI%,TJ%)\Visibaly Then VizUpd(TI,TJ,2)
Select Sceneobject(TI%,TJ%)\GeometryType%
*Case GTNothing,GTWeapon%,GTTool%,GTTreasure%,GTStoneBall%;,GTPlayer%,GTMonster%,GTBlood%
* Return 0
*Default
* Delete TV
* Return 1
End Select
End Function
скопировал прям из кода игры, так что неволнуйтесь, если чего-то не поймете 
|