Показать сообщение отдельно
Старый 19.12.2008, 08:23   #13
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Радость Re: Реализация леса.

Вобщем, расскрываю секрет как сделать всё просто и быстро)
;-------------- В начале программы-----------------
Global 
idd=9000
Dim arrpalm
(idd,3)
Global 
palm=LoadMesh ("tree.b3d")
ScaleEntity palm,5,5,5
For 1 To idd
arrpalm
(i,0)=CopyEntity (palm)
.
tray
c_x
=Rnd(25000)
c_z=Rnd(25000)
c_y=TerrainY(terrain,c_x,100,c_z)
If 
c_y<90 Then Goto tray
arrpalm
(i,1)=Float(c_x)
arrpalm(i,2)=Float(c_y)-3
arrpalm
(i,3)=Float(c_z)
PositionEntity arrpalm(i,0),arrpalm(i,1),arrpalm(i,2),arrpalm(i,3),1
RotateEntity arrpalm
(i,0),0,Rnd(360),0
EntityAutoFade arrpalm
(i,0),1000,1001
Next
HideEntity palm
;----------------------Вызывать в теле игрыи желательно не каждый цыкл--------
Function 
updata_palm()
xf=Rnd(1,5)
Select xf
Case 1
For =1 To idd Step 1
distx
=arrpalm(i,1)-EntityX(plr,1)
distz=arrpalm(i,3)-EntityZ(plr,1)
If 
arrpalm(i,0)=0
If distx>-1100 And distx<1100
If distz>-1100 And distz<1100
arrpalm
(i,0)=CopyEntity (palm)
PositionEntity arrpalm(i,0),arrpalm(i,1),arrpalm(i,2),arrpalm(i,3),1
RotateEntity arrpalm
(i,0),0,Rnd(360),0
EntityAutoFade arrpalm
(i,0),1000,1400
EndIf 
EndIf
ElseIf 
arrpalm(i,0)<>0
If EntityDistance (arrpalm(i,0),plr)>1400
FreeEntity arrpalm
(i,0)
 
arrpalm(i,0)=0
Goto nexs
EndIf
EndIf
.
nexs
Next
Case 2
For =1 To idd Step 2
distx
=arrpalm(i,1)-EntityX(plr,1)
distz=arrpalm(i,3)-EntityZ(plr,1)
If 
arrpalm(i,0)=0
If distx>-1100 And distx<1100
If distz>-1100 And distz<1100
arrpalm
(i,0)=CopyEntity (palm)
PositionEntity arrpalm(i,0),arrpalm(i,1),arrpalm(i,2),arrpalm(i,3),1
RotateEntity arrpalm
(i,0),0,Rnd(360),0
EntityAutoFade arrpalm
(i,0),1000,1400
EndIf 
EndIf
ElseIf 
arrpalm(i,0)<>0
If EntityDistance (arrpalm(i,0),plr)>1400
FreeEntity arrpalm
(i,0)
 
arrpalm(i,0)=0
Goto nexs1
EndIf
EndIf
.
nexs1
Next
Case 3
For =1 To idd Step 2
distx
=arrpalm(i,1)-EntityX(plr,1)
distz=arrpalm(i,3)-EntityZ(plr,1)
If 
arrpalm(i,0)=0
If distx>-1100 And distx<1100
If distz>-1100 And distz<1100
arrpalm
(i,0)=CopyEntity (palm)
PositionEntity arrpalm(i,0),arrpalm(i,1),arrpalm(i,2),arrpalm(i,3),1
RotateEntity arrpalm
(i,0),0,Rnd(360),0
EntityAutoFade arrpalm
(i,0),1000,1400
EndIf 
EndIf
ElseIf 
arrpalm(i,0)<>0
If EntityDistance (arrpalm(i,0),plr)>1400
FreeEntity arrpalm
(i,0)
 
arrpalm(i,0)=0
Goto nexs2
EndIf
EndIf
.
nexs2
Next
Default
For 
=1 To idd Step 5
distx
=arrpalm(i,1)-EntityX(plr,1)
distz=arrpalm(i,3)-EntityZ(plr,1)
If 
arrpalm(i,0)=0
If distx>-1100 And distx<1100
If distz>-1100 And distz<1100
arrpalm
(i,0)=CopyEntity (palm)
PositionEntity arrpalm(i,0),arrpalm(i,1),arrpalm(i,2),arrpalm(i,3),1
RotateEntity arrpalm
(i,0),0,Rnd(360),0
EntityAutoFade arrpalm
(i,0),1000,1400
EndIf 
EndIf
ElseIf 
arrpalm(i,0)<>0
If EntityDistance (arrpalm(i,0),plr)>1400
FreeEntity arrpalm
(i,0)
 
arrpalm(i,0)=0
Goto nexs3
EndIf
EndIf
.
nexs3
Next
End Select
End 
Function 
Воть) у меня нормально тянет 30к (idd)деревьев на карту) можно сделать там коечто типами и ещё немного ускорить алгоритм, но это уже сами думайте
(Offline)
 
Ответить с цитированием