Schienen verlegen mit Editor für n3xtd-Bahn-Sim

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Schienen verlegen mit Editor für n3xtd-Bahn-Sim

Beitrag von super_castle »

Hallo, ich habe einen Bahn-Sim angefangen mit n3xtd.
Es wird nur aus dem Fenster rausgeschaut , man hat keine Aussenansicht.
Die Amaturen kann man in n3xtd gut aus 2dSprite herstellen auf dem 3dFenster.
Ein nicht sichtbares Schienensystem kann ich schon verlegen, wo auch die SimLok mit verschiedenen Geschwindigkeiten durchs Gelände fährt, Vorwärts wie Rückwärts.
Es braucht dann nur noch mit Signalen bestückt werden und das Gelände verschönern.

Ein Halbkreis wird durch 18 Schienen hergestellt, also 10Grad eine gebogene Schiene.
Nun brauche ich ein Pixelverhältnis auch zu den geraden Schienen um etwas im Editor darzustellen.
Wenn die Schienen im Editor angesetzt werden, dann brauchen in der Datei eigentlich nur die Schienentypen erscheinen, wie sie hintereinander verlegt werden.
Mein Program setzt die Typen dann in das 3dGelände um.
For zs=1 To 20
schiene_gerade()
Next
For zs=1 To 18
schiene_kurve_re()
Next
For zs=1 To 20
schiene_gerade()
Next
For zs=1 To 18
schiene_kurve_li()
Next
18 Schienen-gerade....18 Schienen-kurve-re...18 Schienen-gerade...18 Schienen-kurve-li
Funktioniert so auch schon wunderbar.
Das heisst, wenn ich nur 4 Schienen-kurve-re verlege so wird auch genau in diesem Winkel die Gerade verlegt,
Wie da oben funktioniert einwandfrei.

Und dieses zusammenstellen wollte ich optisch mit einer Grafik machen, darum brauchi ich nur die Typen die dann wie in der For-Schleife erzeugt werden.

Wer kann mir beim Grafikeditor mal Tipps geben.
Das Programm kann jeder benutzen wenn er möchte als Ansatz mit n3xtd.

Danke.

Code: Alles auswählen

IncludePath "includes"   
IncludeFile "n3xtD_PB.pbi"

Global *speicher.l,zz.l,n.l,nn.l,nnn.l,sdx.f,sdz.f,sdw.f,swc.f,weiter.l,xzv.l,xzr.l,gehe.l,zs.l
Global x1.f,z1.f,dx.f,dz.f,wi.f

Global *auto.IMesh,*cam.ICamera

Declare schiene_gerade()
Declare schiene_kurve_li()
Declare schiene_kurve_re()
Declare fahre_vor()
Declare fahre_zur()

Global linie.iVECTOR3

Enumeration
  #Window_0 
  #Container_0
  #Button_0
EndEnumeration

*speicher = AllocateMemory(10000000)

 OpenWindow(0, 0, 0, 800,600, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

 ButtonGadget(#Button_0, 20, 40, 110, 40, "ende")
 
 ContainerGadget(#Container_0, 160, 10, 500,500)
 iGraphics3DGadget(500,500, GadgetID(#Container_0))

 SetCurrentDirectory("media/") 
 
 iTextureCreation( #ETCF_CREATE_MIP_MAPS, #False )

 *terrain.IMesh = iCreateCube(1.0)
 iPositionNode(*terrain, 0,-0.6,0) 
 iLoadTextureNode(*terrain, "grille1.bmp") 
 iScaleMeshBuffer( iMeshGeometry(*terrain), 200,0.1,200)
 
 *bill.IBillboard = iCreateBillboard(3.0, 3.0)

iMaterialFlagNode(*bill, #EMF_LIGHTING, #False)
iMaterialTypeNode(*bill, #EMT_TRANSPARENT_ALPHA_CHANNEL)
iLoadTextureNode(*bill, "grass.bmp")

For i=0 To 200
  *bill= iCloneNode(*bill)
  iPositionNode(*bill, -100+Random(200),0.8, -100+Random(200))
Next 

*cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,100,-80)
iRotateNode(*cam, 45,0,0)

swc=0.5
n=0
nn=-4

For zs=1 To 20
  schiene_gerade()
Next
For zs=1 To 18
  schiene_kurve_re()
Next
For zs=1 To 20  
  schiene_gerade()
Next
For zs=1 To 18
  schiene_kurve_li()
Next


n=n-12

InitKeyboard()

Repeat
  Event = WaitWindowEvent(1)
  
  If EventGadget() = #Button_0
    End
  EndIf
     
  If GetAsyncKeyState_(#VK_K)
    imoveNode(*cam, 0,0,swc)
  EndIf
  If GetAsyncKeyState_(#VK_I)
    iMoveNode(*cam, 0,0,-swc)
  EndIf
  If GetAsyncKeyState_(#VK_U)	
    iMoveNode(*cam, swc, 0,0)
  EndIf
  If GetAsyncKeyState_(#VK_O)
    iMoveNode(*cam, -swc, 0,0)
  EndIf
  If GetAsyncKeyState_(#VK_J) 	
    iMoveNode(*cam, 0, swc,0)
  EndIf
  If GetAsyncKeyState_(#VK_M)	
    iMoveNode(*cam, 0, -swc,0)
  EndIf
  
  If GetAsyncKeyState_(#VK_Q)
    Delay(50)
    xzv=xzv+12
    If xzv > 120
      xzv=120
    EndIf  
    gehe=1
  EndIf
  If GetAsyncKeyState_(#VK_A)
    Delay(50)
    xzv=xzv-12
    If xzv < 0
      xzv=0
      gehe=0
    EndIf  
  EndIf
  
  If GetAsyncKeyState_(#VK_W)
    Delay(50)
    xzr=xzr+12
    If xzr > 120
      xzr=120
    EndIf  
    gehe=2
  EndIf
  If GetAsyncKeyState_(#VK_S)
    Delay(50)
    xzr=xzr-12
    If xzr < 0
      xzr=0
      gehe=0
    EndIf  
  EndIf
  
  If gehe=1
    fahre_vor() 
  EndIf 
  
  If gehe=2
    fahre_zur()    
  EndIf 
  
  irotatenode(*cam,0,sdw,0)
  ipositionnode(*cam, sdx,0,sdz)  
  
  iBeginScene(200,200,200)
    iDrawScene() 
  iEndScene()
 
  Until Quit=1
  iFreeEngine()
  End
  
  Procedure schiene_gerade()
   For zz=1 To 1000
     x1 = Sin(wi * #PI/180) * 0.001
     z1 = Cos(wi * #PI/180) * 0.001
     dx=dx+x1
     dz=dz+z1
     
     PokeF(*speicher+n,wi)
     n=n+4
     PokeF(*speicher+n,dx)
     n=n+4
     PokeF(*speicher+n,dz)
     n=n+4
   Next 
EndProcedure  
 
Procedure schiene_kurve_li()
   For zz=1 To 1000
     wi=wi-0.01
     If wi <= -360.0
       wi= 0
     EndIf
     
     x1 = Sin(wi * #PI/180) * 0.002
     z1 = Cos(wi * #PI/180) * 0.002
     dx=dx+x1
     dz=dz+z1
     
     PokeF(*speicher+n,wi)
     n=n+4
     PokeF(*speicher+n,dx)
     n=n+4
     PokeF(*speicher+n,dz)
     n=n+4
   Next 
 EndProcedure  
 
 Procedure schiene_kurve_re()
   For zz=1 To 1000
     wi=wi+0.01
     If wi => 360.0
       wi= 0
     EndIf
     
     x1 = Sin(wi * #PI/180) * 0.002
     z1 = Cos(wi * #PI/180) * 0.002
     dx=dx+x1
     dz=dz+z1
     
     PokeF(*speicher+n,wi)
     n=n+4
     PokeF(*speicher+n,dx)
     n=n+4
     PokeF(*speicher+n,dz)
     n=n+4
   Next 
EndProcedure  
  
Procedure fahre_vor()
  nn=nn+xzv
  nn=nn+4
  
  If nn> n
    nn=-4
    gehe=0
    xzv=0
    Goto weiter1
  EndIf  
  
  sdw=PeekF(*speicher+nn)
  nn=nn+4
  sdx=PeekF(*speicher+nn)
  nn=nn+4
  sdz=PeekF(*speicher+nn)
  
  weiter1:
EndProcedure

Procedure fahre_zur()
  nnn=nnn+xzr
  nnn=nnn+4
  
  If nnn > n
    nnn=0
    nn=-4
    gehe=0
    xzr=0
    Goto weiter
  EndIf  
  
  sdz=PeekF(*speicher+n-nnn)
  nnn=nnn+4
  sdx=PeekF(*speicher+n-nnn)
  nnn=nnn+4
  sdw=PeekF(*speicher+n-nnn)
  
  weiter:
EndProcedure
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Schienen verlegen mit Editor für n3xtd-Bahn-Sim

Beitrag von super_castle »

So jetzt hat geklappt, das Schienenverlegen.

Mit Q/A kann man 5 Gänge Vorwärts schalten und der Würfel fährt den Schienen nach bis zum Ende.
Mit W/S fährt der Würfel zurück vom Anfangspunkt.
Wenn man für den Würfel eine Camera setzt, hat man ein Zugfenster.

Der Anfang ist schon gut.

Gruss

Code: Alles auswählen

IncludePath "includes"   
IncludeFile "n3xtD_PB.pbi"

Global *speicher.l,zz.l,n.l,nn.l,nnn.l,sdx.f,sdz.f,sdw.f,swc.f,weiter.l,xzv.l,xzr.l,gehe.l,zs.l,zeige.l
Global x1.f,z1.f,dx.f,dz.f,wi.f,kastenz.l

Global *auto.IMesh,*cam.ICamera,*cube.IMesh
Global Dim kasten.f(200,2)

Declare schiene_gerade()
Declare schiene_kurve_li()
Declare schiene_kurve_re()
Declare fahre_vor()
Declare fahre_zur()

Global linie.iVECTOR3

Enumeration
  #Window_0 
  #Container_0
  #Button_0
EndEnumeration

*speicher = AllocateMemory(5000000)

 OpenWindow(0, 0, 0, 800,600, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

 ButtonGadget(#Button_0, 20, 40, 110, 40, "ende")
 
 ContainerGadget(#Container_0, 160, 10, 500,500)
 iGraphics3DGadget(500,500, GadgetID(#Container_0))

 SetCurrentDirectory("media/") 
 
 iTextureCreation( #ETCF_CREATE_MIP_MAPS, #False )

 *terrain.IMesh = iCreateCube(1.0)
 iPositionNode(*terrain, 0,-0.6,0) 
 iLoadTextureNode(*terrain, "grille1.bmp") 
 iScaleMeshBuffer( iMeshGeometry(*terrain), 200,0.1,200)
 
 *auto.IMesh = iCreateCube(2.0)
 iPositionNode(*auto, 0,0,-80)

*cam.ICamera = iCreateCamera( )
iPositionNode(*cam, 0,100,-80)
iRotateNode(*cam, 45,0,0)

swc=0.5
n=0
nn=-4

For zs=1 To 20
  schiene_gerade()
Next
For zs=1 To 18
  schiene_kurve_re()
Next
For zs=1 To 20  
  schiene_gerade()
Next
For zs=1 To 9
  schiene_kurve_li()
Next
For zs=1 To 20  
  schiene_gerade()
Next
For zs=1 To 9
  schiene_kurve_li()
Next
For zs=1 To 20  
  schiene_gerade()
Next

For i = 0 To 130
  *cube.IMesh = iCreateCube(1.0)
  iScaleMeshBuffer(iMeshGeometry(*cube), 0.4,0.2,2.0)
  iRotateNode(*cube,0,kasten(i,0),0)
  ipositionnode(*cube, kasten(i,1),0,kasten(i,2)) 
Next

n=n-12
kastenz=0

InitKeyboard()

Repeat
  Event = WaitWindowEvent(0)
  
  If EventGadget() = #Button_0
    End
  EndIf
     
  If GetAsyncKeyState_(#VK_K)
    imoveNode(*cam, 0,0,swc)
  EndIf
  If GetAsyncKeyState_(#VK_I)
    iMoveNode(*cam, 0,0,-swc)
  EndIf
  If GetAsyncKeyState_(#VK_U)	
    iMoveNode(*cam, swc, 0,0)
  EndIf
  If GetAsyncKeyState_(#VK_O)
    iMoveNode(*cam, -swc, 0,0)
  EndIf
  If GetAsyncKeyState_(#VK_J) 	
    iMoveNode(*cam, 0, swc,0)
  EndIf
  If GetAsyncKeyState_(#VK_M)	
    iMoveNode(*cam, 0, -swc,0)
  EndIf
  
  If GetAsyncKeyState_(#VK_Q)
    Delay(50)
    xzv=xzv+12
    If xzv > 60
      xzv=60
    EndIf  
    gehe=1
  EndIf
  If GetAsyncKeyState_(#VK_A)
    Delay(50)
    xzv=xzv-12
    If xzv < 0
      xzv=0
      gehe=0
    EndIf  
  EndIf
  
  If GetAsyncKeyState_(#VK_W)
    Delay(50)
    xzr=xzr+12
    If xzr > 60
      xzr=60
    EndIf  
    gehe=2
  EndIf
  If GetAsyncKeyState_(#VK_S)
    Delay(50)
    xzr=xzr-12
    If xzr < 0
      xzr=0
      gehe=0
    EndIf  
  EndIf
  
  If gehe=1
    fahre_vor() 
  EndIf 
  
  If gehe=2
    fahre_zur()    
  EndIf 
  
  irotatenode(*auto,0,sdw,0)
  ipositionnode(*auto, sdx,0,sdz)  
  
  iBeginScene(200,200,200)
    iDrawScene() 
  iEndScene()
 
Until Quit=1
FreeMemory(*speicher) 

iFreeEngine()
End
  
Procedure schiene_gerade()
   For zz=1 To 1000
     x1 = Sin(wi * #PI/180) * 0.002
     z1 = Cos(wi * #PI/180) * 0.002
     dx=dx+x1
     dz=dz+z1
     
     PokeF(*speicher+n,wi)
     n=n+4
     PokeF(*speicher+n,dx)
     n=n+4
     PokeF(*speicher+n,dz)
     n=n+4
   Next 
   kasten(kastenz,0)=wi
   kasten(kastenz,1)=dx
   kasten(kastenz,2)=dz
   kastenz=kastenz+1
EndProcedure  
 
Procedure schiene_kurve_li()
   For zz=1 To 1000
     wi=wi-0.01
     If wi <= -360.0
       wi= 0
     EndIf
     
     x1 = Sin(wi * #PI/180) * 0.002
     z1 = Cos(wi * #PI/180) * 0.002
     dx=dx+x1
     dz=dz+z1
     
     PokeF(*speicher+n,wi)
     n=n+4
     PokeF(*speicher+n,dx)
     n=n+4
     PokeF(*speicher+n,dz)
     n=n+4   
   Next 
   kasten(kastenz,0)=wi
   kasten(kastenz,1)=dx
   kasten(kastenz,2)=dz
   kastenz=kastenz+1  
 EndProcedure  
 
 Procedure schiene_kurve_re()
   For zz=1 To 1000
     wi=wi+0.01
     If wi => 360.0
       wi= 0
     EndIf
     
     x1 = Sin(wi * #PI/180) * 0.002
     z1 = Cos(wi * #PI/180) * 0.002
     dx=dx+x1
     dz=dz+z1
     
     PokeF(*speicher+n,wi)
     n=n+4
     PokeF(*speicher+n,dx)
     n=n+4
     PokeF(*speicher+n,dz)
     n=n+4   
   Next 
   kasten(kastenz,0)=wi
   kasten(kastenz,1)=dx
   kasten(kastenz,2)=dz
   kastenz=kastenz+1
EndProcedure  
  
Procedure fahre_vor()
  nn=nn+xzv
  nn=nn+4
  
  If nn> n
    nn=-4
    gehe=0
    xzv=0
    Goto weiter1
  EndIf  
  
  sdw=PeekF(*speicher+nn)
  nn=nn+4
  sdx=PeekF(*speicher+nn)
  nn=nn+4
  sdz=PeekF(*speicher+nn)
  
  weiter1:
EndProcedure

Procedure fahre_zur()
  nnn=nnn+xzr
  nnn=nnn+4
  
  If nnn > n
    nnn=0
    nn=-4
    gehe=0
    xzr=0
    Goto weiter
  EndIf  
  
  sdz=PeekF(*speicher+n-nnn)
  nnn=nnn+4
  sdx=PeekF(*speicher+n-nnn)
  nnn=nnn+4
  sdw=PeekF(*speicher+n-nnn)
  
  weiter:
EndProcedure
Antworten