Показать сообщение отдельно
Старый 16.10.2011, 11:35   #14
Markova
ПроЭктировщик
 
Аватар для Markova
 
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений
(для 218 пользователей)
Ответ: Как сделать в 3ds MAX карту с настроенной физикой и партиклами?

Пообщавшись с автором выше изложенной демки, я понял, что мало чего понимаю в оптимизации кода, но он дал мне парсер тот самый который он сам использовал в демке.
Function parser$(txt$,index,delim$=" ")

Local search$
Local searched
Local lendelim%

txt$=txt$+delim$
lendelim=Len(delim$)

For i=1 To index
searched=Instr(txt$,delim$)
If searched<>0 Then

If i = index Then
txt$=Mid(txt$,1,searched-1)
Return txt$
Else
txt$=Mid(txt$,searched+lendelim)
EndIf

Else
Return ""
EndIf
Next

End Function

Я его сразу задействовал в своём проекте, вот полный исходный код:
; Graphics3D Example
; ------------------
Global FL_Pitch2#,FL_Yaw2#,FL_Roll2#,FL_XSpeed2#,FL_YSpee d2#,FL_ZSpeed2#,pp1$,aa1,p1$,Trik2$,Forror=1,gRAVI TY#=-1.6
Function FreeLook2(FL_Cam2)
FL_Pitch2#=FL_Pitch2#-(-MouseYSpeed()*0.02) : FL_Pitch2#=FL_Pitch2#/1.2
FL_Yaw2#=FL_Yaw2#+-(MouseXSpeed()*0.02) : FL_Yaw2#=FL_Yaw2#/1.2
MoveMouse (GraphicsWidth()/2,GraphicsHeight()/2)
FL_ZSpeed2#=FL_ZSpeed2#+Float(KeyDown(17)-KeyDown(31))*0.12 : FL_ZSpeed2#=FL_ZSpeed2#/1.14; w &amp; s
FL_XSpeed2#=FL_XSpeed2#+Float(KeyDown(32)-KeyDown(30))*0.12 : FL_XSpeed2#=FL_XSpeed2#/1.14 ; a &amp; d
FL_YSpeed2#=FL_YSpeed2#+Float(KeyDown(19)-KeyDown(33))*0.12 : FL_YSpeed2#=FL_YSpeed2#/1.14 ; r &amp; f
FL_Roll2#=(FL_Yaw2#*1.1)-(FL_XSpeed2#*2.3)
MoveEntity FL_Cam2,FL_XSpeed2#,FL_YSpeed2#+Abs(FL_Roll2#*FL_X Speed2#)/50,FL_ZSpeed2#
Local cp2#=EntityPitch(FL_Cam2,True)+FL_Pitch2#
If cp2<-89 Then cp2=-89
If cp2>89 Then cp2=89
RotateEntity FL_Cam2,cp2,EntityYaw(FL_Cam2)+FL_Yaw2#,FL_Roll2#
End Function

Global fpsindex#, fpstime#, fpsfold_millisecs#, fpsfps#, fpsfold2_Millisecs#
Function fps2#(time=1000)
fpsindex=fpsindex+1
fpstime=fpstime+MilliSecs()-fpsfold_millisecs
If fpstime=>time
fpsfps=fpsindex
fpstime=0
fpsindex=0
EndIf
fpsfold_Millisecs=MilliSecs()
Return fpsfps
End Function

Function parser$(txt$,index,delim$=" ")
Local search$
Local searched
Local lendelim%
txt$=txt$+delim$
lendelim=Len(delim$)
For i=1 To index
searched=Instr(txt$,delim$)
If searched<>0 Then

If i = index Then
txt$=Mid(txt$,1,searched-1)
Return txt$
Else
txt$=Mid(txt$,searched+lendelim)
EndIf

Else
Return ""
EndIf
Next
End Function

Global Maps,delet,deletStart,Start

Type LoadM
Field ChildMaps
Field ChildName$
Field AutoHide$
End Type

Function LoadMap(Maps_File$)
Maps=LoadAnimMesh(Maps_File$)
For ChildN=1 To CountChildren(Maps)
LM.LoadM=New LoadM
Getemp=GetChild(Maps,ChildN)
LM\ChildName$=EntityName(Getemp)
LM\ChildMaps=FindChild(Maps,LM\ChildName$)
LM\AutoHide$=parser(LM\ChildName$,1,".");Âûäèëÿåì òî÷üêè ñòàðòà èç îáùåãî èìåíè ÷èëäà. ÷èëäû äåéñòâèÿ Pick, GizmoBox...
EntityPickMode LM\ChildMaps,2
If LM\AutoHide$="Start" Or LM\AutoHide$="Exid" Or LM\AutoHide$="Pick" Or LM\AutoHide$="GizmoBox" Then HideEntity LM\ChildMaps;Ñêðûâàåì ÷èëäû ñòàðòà è äåéñòâèÿ

If Not Instr(RSet(LM\ChildName$,1),"@")>0 Then Delete LM;Óäàëÿåì èç ñïèñêà ÷èëäîâ íå èñïîëüçóåìûå èìåíà ÷èëäîâ
Next
End Function


Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global camera=CreateCamera()
light=CreateLight()

MapsStarted$="Testmap.b3d|Start.@|";Ïðîãðàììíûé ñêðèïò


LoadMap(parser(MapsStarted$,1,"|"))

For LM.LoadM=Each LoadM
If Instr(LM\ChildName$,parser(MapsStarted$,2,"|"))>0 Then
PositionEntity camera,EntityX(LM\ChildMaps),EntityY(LM\ChildMaps) +20,EntityZ(LM\ChildMaps)
EndIf
Next

deletStart=1

While Not KeyDown( 1 )
FreeLook2(camera)
Mouse_Hit1=MouseHit(1)
pick=CameraPick(camera,MouseX(),MouseY())

For LM.LoadM=Each LoadM
;Îáðàáîòêà ïðîãðàììíîãî ñêðèïòà
If Instr(LM\ChildName$,"Pick.DoorLabEnt@")>0
If PickedEntity()=LM\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap2.b3d|Start.Lab@|"
delet=1
EndIf
EndIf

If Instr(LM\ChildName$,"Pick.DoorLab@")>0
If PickedEntity()=LM\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap.b3d|Exid.Lab@|"
delet=1
EndIf
EndIf

If Instr(LM\ChildName$,"Pick.DoorLab1@")>0
If PickedEntity()=LM\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap.b3d|Start.|"
delet=1
EndIf
EndIf

Next

If Start=1
LoadMap(parser(MapsStarted$,1,"|"))
For LM.LoadM=Each LoadM
If Instr(LM\ChildName$,parser(MapsStarted$,2,"|"))>0 Then
PositionEntity camera,EntityX(LM\ChildMaps),EntityY(LM\ChildMaps) +20,EntityZ(LM\ChildMaps)
EndIf
Next
deletStart=1
Start=0
EndIf

For LM.LoadM=Each LoadM
If Instr(LM\AutoHide$,"Pick")>0
;EntityAlpha LM\ChildMaps,0
Dis#=EntityDistance(camera,LM\ChildMaps)
If Dis#<9
ShowEntity LM\ChildMaps
Else
HideEntity LM\ChildMaps
EndIf
EndIf
Next

If deletStart=1
For LM.LoadM=Each LoadM
If LM\AutoHide$="Start" Or LM\AutoHide$="Exid" Then Delete LM;Óäàëÿåì èç ñïèñêà èìåíà òî÷åê ñòàðòà, ïîñëå ñòàðòà îíè íàì áîëüøå íå íóæíû!
Next
deletStart=0
EndIf

If delet=1 ;Óäàëÿåì âñ¸ ïåðåä çàãðóçêîé ñëåäóþùåé êàðòû
For LM.LoadM=Each LoadM
Delete LM
Delete Each LoadM
Next
FreeEntity Maps
Start=1
delet=0
EndIf

UpdateWorld()
RenderWorld()

;For LM.LoadM=Each LoadM
;Print LM\ChildName$
;Next

Text 0,0,"Current FPS: "+fps2#(1000)
Flip

Wend
For LM.LoadM=Each LoadM
Delete LM
Delete Each LoadM
Next
FreeEntity Maps
End

Если я буду делать так переход с карты на карту, это будет правильно?
или лучше использовать команды Handle() и Object ну типа
If Mouse_Hit1 Then
CurrObj=Object.LoadM(EntityName(pick))
If PickedEntity()=CurrObj\ChildMaps And Mouse_Hit1
MapsStarted$="Testmap2.b3d|Start.Lab@|"
delet=1
EndIf
EndIf
Вот для наглядности с тест картами, подлетаем к двери, кликаем по кваду, переходим.
Вложения
Тип файла: rar New.rar (623.8 Кб, 701 просмотров)
(Offline)
 
Ответить с цитированием