Seite 4 von 18

Verfasst: 20.02.2008 21:06
von ZeHa
Xaby hat geschrieben:Haben wir uns schon auf eine HintergrundMusik für unser Projekt geeinigt? :?
Ich glaube kaum, daß das jetzt entschieden werden muß ;) es sei denn, die Musik beeinflußt das Spiel maßgeblich

Verfasst: 20.02.2008 21:11
von dllfreak2001
Na, Xaby warum entwickeln wir hier nicht im Forum ein paar einheitliche Formate die dann mit dafür ausgelegten Userlibs genutzt werden können.

Ich meine so ne Art freien Standard für Mapformate und so ein Zeugs.....

So kann der Kollege direkt am Programm rumwerkeln und muss nicht erstmal einen Mapeditor oder so bauen.

Genauso vielleicht eine in PB programmierte 3D-Engine auf Basis von OpenGL/DX für die wir ein einfaches und frei einsehbares Model und Mapformat aufbauen könnten.

Dann könnten sich gleich mehrere Leute an die Entwicklung von Editoren
und Toolkits machen und wenn es mehrere gibt ist auch nicht schlimm.

Verfasst: 20.02.2008 22:48
von Xaby
Klingt gut. Meine Rede.

Aber das Wort UserLIB, ich weiß nicht :D

Mit denen stehe ich auf Kriegsfuß. Zu oft einen Po-Link-Error.
Klingt wie Hinternverknüpfungsfehler. /:->

Folgender Vorschlag:

- wir basteln an Inklude-Dateien, die interpretieren können
- wenn die optimiert sind, schlagen wir Fred vor, dass es zu PureBasic-Festbefehlen wird.

Editoren können wir basteln und die Formate sollten wenn möglich von Menschen lesbar sein. Zu mindest in der Entwicklungsphase.

Ich bin immer noch der Überzeugung, dass Strings eine gute Sache sind.

Zum Beispiel:

CreateTextureAusString(0,"BLAundBLUBXYcosinusZ3D-Uyz3GB,43534")
CreateMeshAusString(0,"SchnickSchnackSchnuck")
TexturiereMeshMitTextur(0,0)


Hier mal meine Gedanken, was wir machen könnten, ist nicht unbedingt vollständig, kann fehlerhaft sein. Waren erstmal nur Überlegungen und die sind auch schon ein paar Tage alt.

Code: Alles auswählen

;/ Folker Linstedt
;/ 2008-02-12
;/ Einfache 3D-Engine für PureBasic.

;/ Vor und Nachteile: Einfache Einbindung, kleine ausführbare-Datei, Engine in ausführbarer-Dater
;/ Wofür geeignet: Für Spiele, DEMOs, Tests, Physikberechnungen, vor allem kleine ausführbare Programme

;/ Nutzen : Es wird keine externe Ogre-Engine oder Irrlicht-Engine benötigt
;/ Grenzen: keine komplexe 3D-Engine, KEINE LICHTEFFEKTE, einfache Meshverwaltung, einfache Texturierung, einfache Animationen
;/ Partikeleffekte werden extra verwaltet

;/ KEINE VERWENDUNG ANDERER LIBS NOTWENDIG, PLATTFORM UNABHÄNGIG (keine PBBT Userlib-Packet oder PBOSL, RAD neu erfunden, kann Nachteile haben)

;{ Soll Beinhaltet:
;   Meshverwaltung, Kollisionstest, einfache Physik
; ((Fenster und Iconverwaltung, Meshes ohne Z-Wert, Mausverwaltung 2D/3D, Meshes auch ohne Sprites verwendbar, Line-Befehle, 2D-Drawing ))
;   Einfache Belegung von MeshParts für Animationen, Parent und Childs
;   MeshGenerator, aus Texturen (Landschaften), einfaches erstellen von Primitives wie Quader (und Würfel), Pyramiden

;   Texturgenerator für Sprites und Images, erweitertes Vektorzeichenprogramm, als BONUS: Raytracer, Mandala-Zeichner
;   Effektgenerator
;   Sound-FX-generator (+TextToSpech)
;   Musik-Melodie-(MOD)-Abspieler, Soundsystem mit 3D-Sound-Emulation, kein FMOD notwendig
;
;   mögliche Erweiterungen Hilfe-Textgenerator, Verzeichnisbaumegenerator, Packer
;} 


;/ Aufgabenliste, nach Priorität geordnet
; 3D Wires, Meshes, MeshVerwaltung
; Sprite 3D, Texturierung
; Zeichenprogramm/skript für Images/Sprites
; Sound-Integration
Ich hatte vor einiger Zeit mal in einem Thread behauptet, dass man mit der Mathematik der 12. Klasse, etwas Geometrieverständnis, sich ganz leicht selbst eine 3D-Engine basteln kann.

Um diese Behauptung zu festigen, hab ich mich mal rangemacht und ein bisschen probiert. Und ja, es ist möglich, leider finde ich das Thema nicht mehr.

Habt ihr mal in der Suche: Engine 3D
eingegeben. Da wird man überhäuft mit Themen, die alle zu keinem Schluss führen.

DreamMotion, Ogre, Irrlicht und eigene Engines aus Sprite3D zusammengewürfelt. Oft wird jedes mal neu diskutiert, was wie funktioniert, welche Engine benutzt werden sollte etc.
Und wie man ein 3D-Spiel überhaupt beginnt.

Viele von den Themen haben keine aktuellen Verweise mehr, auch bekannt unter: Broken Links
StreenShots und Download-ZIPs oder DLLs fehlen.

QuellCode ist unvollständig, fehlerhaft oder einfach aus anderen Gründen nicht ausführbar.

Ich stelle nicht das Forum in Frage, die Frage ist nur, ob man bei PureBasic 4.x nicht einen Strich ziehen sollte und sagt, wir lassen das Forum als Archiv bestehen. Schreiben nun aber in einem neuen Forum geordneter Code und nur noch PureBasic 4.x Code. Wer 3.3 oder 3.94 hat, geht halt ins andere Forum.

Auch sollten Anfängerfragen und 3D-Fragen getrennt werden.
Sonst tauchen im Anfängerforum immer wieder Fragen auf wie:
Wie mache ich ein 3D-Spiel.

Also selbst wenn eine Antwort im Forum steht, man wird sie nicht finden oder schneller sein, wenn man es selbst ausprobiert.
Eine wirklich gute Seite ist:
http://www.purearea.net/pb/CodeArchiv/German.html#13

Hat noch einige Schwächen, aber grob kann man sagen, dass es ein Meilenstein in PureBasic ist :allright:

Worauf legen wir bei unserem Projekt Wert?

Ich bin für

[quote]
- einfacher Code, wenig Zeilen für Erfolg nötig
- EXE läuft ohne DLLs (Engines müssen integrierbar sein)
- Gut wäre, Code funktioniert ohne Mediendaten ohne Fehler
(nicht vorhandene Grafiken werden automatisch erzeugt oder durch Fehlbilder mit gleichen Eigenschaften ersetzt)
[quote]

Ich denke, es ist möglich, zum Beispiel ein Spiel wie PureBlock auf 100 kByte zu bringen, ohne merklichen Unterschied statt ~ 1.2 MB ohne dass es ausführbar ist und + weitere 1.5 MB mit 3D Engine und stlport_vc646.dll, damit das Spiel läuft. Also knapp 3 MB groß.

Gut, ob nun 100 kByte oder 3 MB spielt heute kaum noch eine Rolle.
Und wir müssen ja nicht den Preis der kleinsten 3D-Prgramme gewinnen.

Aber möglich ist es, auch mit reinem PB-Code.

Hier mal ein Versuch von mir

Code: Alles auswählen

EnableExplicit

Structure p3D
  x.l
  y.l
  z.l
  x2D.l
  y2D.l
EndStructure

Global NewList E3D.p3D()

Procedure AddE3DPoint(x,y,z)
  AddElement(E3D())
  E3D()\x=x
  E3D()\y=y
  E3D()\z=z 
EndProcedure


;/ Wurfel vorn
AddE3DPoint(100, 100,100); oben rechts 0
AddE3DPoint(100,-100,100); unten rechts 1
AddE3DPoint(-100,-100,100); unten links 2
AddE3DPoint(-100,100,100); oben links 3

;/ genau gegenüber 
AddE3DPoint(100,100,-100) ; 4
AddE3DPoint(100,-100,-100) ; 5
AddE3DPoint(-100,-100,-100) ; 6
AddE3DPoint(-100,100,-100) ; 7

AddE3DPoint(-150,0,0)

;/ Ground
#Breite=64

AddE3DPoint(-#Breite,-100,-#Breite)
AddE3DPoint( #Breite,-100,-#Breite)
AddE3DPoint( #Breite,-100, #Breite)
AddE3DPoint(-#Breite,-100, #Breite)

;/ Damit Verzerrungen minimiert werden, müssen Flächen
;/ in kleinere Flächen geteilt werden!



Global cos.f, sin.f, temp.f, angle.f=0, ZeitMessung=0, scaleFactor.f=1, PI.f=3.1415926999999; gerundet

Procedure UpDateVerts()
  Protected rx, ry, rz
  
  rx=((E3D()\x*cos)-(E3D()\z*sin))
  ry=E3D()\y
  rz=((E3D()\z*cos)+(E3D()\x*sin))
  E3D()\x2D=240-(rx/(1+((rz*scaleFactor)/500)))
  E3D()\y2D=160-(ry/(1+((rz*scaleFactor)/500)))
  
EndProcedure

Procedure Calc()
  ;/If (angle>PI) ;/ Schlüssel
  If (angle<PI)
    If angle<(0.5*PI)
      temp=((angle*(2/PI))-0.5)
      sin=(0.75-((temp*temp)-temp))
      cos=(0.75-((temp*temp)+temp))
    Else  
      temp=((((PI-angle)*(2/PI)))-0.5)
      sin=(0.75-((temp*temp)-temp))
      cos=(-0.75+((temp*temp)+temp)) 
    EndIf
  Else  ;/ ohne Sonst sieht es ganz schön schlimm aus
    If angle<(1.5*PI)
      temp=(((angle-PI)*(2/PI))-0.5)
      sin=(-0.75+((temp*temp)-temp))
      cos=(-0.75+((temp*temp)+temp))
    Else  
      temp=((((2*PI)-angle)*(2/PI))-0.5)
      sin=(-0.75+((temp*temp)-temp))
      cos=(0.75-((temp*temp)+temp)) 
    EndIf 
  EndIf
  
EndProcedure


Procedure V2DLine(E1,E2)
  Protected x, y
  If E1 < CountList(E3D()) and  E2 < CountList(E3D())
  SelectElement(E3D(),E1)
  x=E3D()\x2D
  y=E3D()\y2D
  SelectElement(E3D(),E2)
  LineXY(x,y,E3D()\x2D,E3D()\y2D,RGB(0,255,0)) ;/ grüne Linie
  EndIf 
EndProcedure



Procedure Draw2D()
  StartDrawing(ImageOutput(0))
  Box(0,0,480,360,0)
  Plot(240,180,RGB(255,255,255))
  
  ForEach E3D()
    Calc()
    UpDateVerts()
    Circle(E3D()\x2D,E3D()\y2D,4,RGB(255,0,0))
  Next
  
  
  V2DLine(0,1)
  V2DLine(1,2)
  V2DLine(2,3)
  V2DLine(3,0)
  
  V2DLine(0,4)
  V2DLine(1,5)
  V2DLine(2,6)
  V2DLine(3,7)
  
  V2DLine(4,5)
  V2DLine(5,6)
  V2DLine(6,7)
  V2DLine(7,4)
  
  V2DLine(8,2)
  V2DLine(8,3)
  V2DLine(8,6)
  V2DLine(8,7)
  
  StopDrawing()
  SetGadgetState(0,ImageID(0))
EndProcedure




Procedure createGadgets()
  CreateImage(0,480,360)
  
  ImageGadget(0,10,5,480,360,ImageID(0),#PB_Image_Border)
  
EndProcedure

Procedure fortlaufend()
  If (ElapsedMilliseconds()-ZeitMessung)>(1000/50)
  angle+0.05
  If (angle<0)
    angle+(2*PI)
  EndIf
  If (angle>(2*PI))
    angle-(2*PI)
  EndIf
  Draw2D()
  ZeitMessung=ElapsedMilliseconds()
  EndIf
EndProcedure


Procedure CreateSprites()
  protected x,y
  CreateSprite(0,128,128,#PB_Sprite_Texture)
  CreateSprite(1,128,128,#PB_Sprite_Texture)
  
  StartDrawing(SpriteOutput(0))
    Box(0,0,SpriteWidth(0),SpriteHeight(0),RGB(255,64,0))
    Box(5,5,40,15,RGB(0,64,100))
    LineXY(0,0,SpriteWidth(0),SpriteHeight(0),RGB(0,0,255))
    LineXY(0,SpriteHeight(0),SpriteWidth(0),0,RGB(0,0,255))
  StopDrawing()
    
  
  StartDrawing(SpriteOutput(1))
  Box(0,0,SpriteWidth(0),SpriteHeight(0),RGB(0,64,0))
  For y=0 to 10
    For x=0 to 10
      Box(12*x,12*y,8,8,RGB(0,64+Random(40),100))
    Next  
  Next  
  
  StopDrawing()
    
    
  CreateSprite3D(0,0)  
  CreateSprite3D(1,1)  
EndProcedure

Procedure X2D(E)
  SelectElement(E3D(),E)
  ProcedureReturn E3D()\x2D
EndProcedure
Procedure Y2D(E)
  SelectElement(E3D(),E)
  ProcedureReturn E3D()\y2D
EndProcedure

Procedure DrawSprites()
  Start3D()
  
  TransformSprite3D(1,X2D(9),Y2D(9),X2D(10),Y2D(10),X2D(11),Y2D(11),X2D(12),Y2D(12))
  DisplaySprite3D(1,0,0)
  
  TransformSprite3D(0,X2D(0),Y2D(0),X2D(1),Y2D(1),X2D(5),Y2D(5),X2D(4),Y2D(4))
  DisplaySprite3D(0,0,0)
  
  TransformSprite3D(0,X2D(0),Y2D(0),X2D(4),Y2D(4),X2D(7),Y2D(7),X2D(3),Y2D(3))
  DisplaySprite3D(0,0,0)
  
   
  TransformSprite3D(0,X2D(4),Y2D(4),X2D(5),Y2D(5),X2D(6),Y2D(6),X2D(7),Y2D(7))
  DisplaySprite3D(0,0,0)
  
  TransformSprite3D(0,X2D(0),Y2D(0),X2D(1),Y2D(1),X2D(2),Y2D(2),X2D(3),Y2D(3))
  DisplaySprite3D(0,0,0) 
  
  TransformSprite3D(0,X2D(0),Y2D(0),X2D(4),Y2D(4),X2D(5),Y2D(5),X2D(1),Y2D(1))
  DisplaySprite3D(0,0,0) 
  
  Stop3D()
EndProcedure

If OpenWindow(0,0,0,600,750,"FL 3D - ACHTUNG! Bei Window-Events wird 3D mit Texturen unterbrochen!",#PB_Window_ScreenCentered | #PB_Window_SystemMenu) and CreateGadgetList(WindowID(0))
  
  InitSprite()
  OpenWindowedScreen(WindowID(0),10,380,480,360,0,0,0)
  InitSprite3D()
  CreateSpriteS()
  Sprite3DQuality(1)
  
  
  createGadgets() 
  Draw2D()
  
  define Event.l, Quit, GadgetNr
  
  Repeat
  
  Repeat
    
    Event=WaitWindowEvent(20)
    
     If Event=16
      Quit=1
      
    ElseIf Event=#PB_Event_Gadget
      GadgetNr=EventGadget() 
      
      
    EndIf
    
    ;/ fortlaufend
    fortlaufend()
    
  Until Event=0
  
  FlipBuffers()
  ClearScreen(0)
  
  DrawSprites()
    
    
  Until Quit   
  
EndIf
>>>> Make or Buy?

Nutzen wir eine vorhandene Engine oder machen wir eine simple Engine, die wenigstens texturierte Quader mit gleichmäßigem Licht versehen kann. Transparenz sollte kein Problem mehr sein und wie man mit QuellCode schicke Texturen erzeugt, haben wir ja auch schon geübt.

Hier mal ein weiteres Beispiel einer 3D-Engine, allerdings hab ich mich verrant. Denn um meine Meshes nun Texturieren zu können, fällt mir keine einfache Lösung ein, wie ich nicht alles doppelt und dreifach im Speicher habe bzw. mir einen Wolf schreibe.

Z-Buffering gibt es natürlich nicht. Wie gesagt, war nur ein Test.

Code: Alles auswählen

;/ Folker Linstedt
;/ 2008-02-01
;/ 3D-Engine

EnableExplicit

Structure p3D ;/ 3D-Punkt mit zugehörigem 2D-Projektionspunkt
  ;/ 3D-Koordinaten
  x.l
  y.l
  z.l
  ;/ 2D-Projektion
  x2D.l
  y2D.l
  color.l
  ;/ PunktID
  ID.l ;/ wird nicht verwendet
EndStructure

Structure lID; Line
  ID1.l ;/ IDs aus der Liste E3D
  ID2.l 
  color.l ;
EndStructure

Structure MID; Mesh
  ID1.l ;/ IDs aus der Liste E3D
  ID2.l 
  color.l ;
  MID.l ; ID des Meshes
EndStructure


Structure rID; Rectangle(i) / Texture
  ID1.l  ; oder auch nur zwei IDs, LinienIDs
  ID2.l
  ID3.l 
  ID4.l
  color.l
EndStructure


Global NewList E3D.p3D()
Global NewList LID.lID()
Global Dim LIX.lID(0)
Global Dim EDim.p3D(0)

Global NewList Mesh.MID(); Erste PunktID aus E3D bis letzte PunktID von dem Mesh/LinienGruppe

Procedure.l AddMesh()
Protected ID
  ID=CountList(E3D())  
  AddElement(Mesh())
  Mesh()\MID=CountList(Mesh())
  Mesh()\ID1=ID 
  Mesh()\ID2=ID 
  Mesh()\color=E3D()\color 
  
  ProcedureReturn Mesh()\MID
EndProcedure  

Procedure EndMesh()
  Mesh()\ID2=CountList(E3D())-1
EndProcedure


Procedure MoveMesh(MID,x,y,z);/ MoveMesh erst nach FromListToArry()
  Protected i
  SelectElement(Mesh(),MID)
  For i=Mesh()\ID1 To Mesh()\ID2
    EDim(i)\x+x  
    EDim(i)\y+y
    EDim(i)\z+z
  Next  
  
EndProcedure



Procedure SetMeshColor(MID,color) ; Alle Linien des Mesh müssen eine neue Farbe bekommen

EndProcedure

  

Procedure AddE3DPoint(x,y,z,f)
  AddElement(E3D())
  E3D()\x=x
  E3D()\y=y
  E3D()\z=z
  E3D()\color=f
  E3D()\ID=CountList(E3D())-1
EndProcedure

Procedure.l Test3DPoints(x,y,z,f,d=0)
  Protected Dings.l=0, ID.l
  
  If d
  
  ForEach E3D()
    If (E3D()\x=x) And (E3D()\y=y) And (E3D()\z=z)
      ID=E3D()\ID
      Dings=0
      Break
    Else  
      Dings=1
    EndIf
  Next
  
  EndIf
  
  If Dings Or CountList(E3D())=0 Or Not(d)
    AddE3DPoint(x,y,z,f) 
  EndIf  
  ID=E3D()\ID
  
  ProcedureReturn ID
EndProcedure


Procedure AddLineIDs(ID1, ID2, f)
  AddElement(LID())
    LID()\ID1=ID1
    LID()\ID2=ID2
    LID()\color=f
EndProcedure


Procedure AddQuader(x,y,z,f,XB=20,YB=20,ZB=20,d=0) ; float / double
Protected ID, IDE, wx, wy, wz,i,c=0
    
  wx=XB/2
  wy=YB/2
  wz=ZB/2
 
 If wx=0
   c+1
 EndIf
 If wy=0
   c+1
 EndIf
 If wz=0
   c+1
 EndIf
 
 If c=2
   Test3DPoints(x-wx,y-wy,z-wz,f)
   ID=E3D()\ID
   Test3DPoints(x+wx,y+wy,z+wz,f)
   AddLineIDs(ID,ID+1,f)
 ElseIf c<2
 
 If wy<>0 
   Test3DPoints(x-wx,y+wy,z-wz,f)
   ID=E3D()\ID
 EndIf
 
 Test3DPoints(x-wx,y-wy,z-wz,f)
 If wy=0   
   ID=E3D()\ID
 EndIf
  
 If wx<>0 
  Test3DPoints(x+wx,y-wy,z-wz,f)
   If wy<>0 
    Test3DPoints(x+wx,y+wy,z-wz,f)
   EndIf 
 EndIf 
  
 If wz<>0     
   If wy<>0
     Test3DPoints(x-wx,y+wy,z+wz,f)
   EndIf  
   Test3DPoints(x-wx,y-wy,z+wz,f)

   If wx<>0  
     Test3DPoints(x+wx,y-wy,z+wz,f)
     If wy<>0
       Test3DPoints(x+wx,y+wy,z+wz,f)
     EndIf  
   EndIf 
  
 EndIf 
 
 IDE=E3D()\ID
 
 
  
  AddLineIDs(ID,ID+1,f)
  AddLineIDs(ID+2,ID+3,f)
 
 If wz=0 Or  IDE-ID>3    
  AddLineIDs(ID+1,ID+2,f)
  AddLineIDs(ID+3,ID,f)  
 Else
  AddLineIDs(ID+1,ID+3,f)
  AddLineIDs(ID+2,ID  ,f)    
 EndIf 
 If IDE-ID>3
 
  AddLineIDs(ID+4,ID+5,f)
  AddLineIDs(ID+5,ID+6,f)
  AddLineIDs(ID+6,ID+7,f)
  AddLineIDs(ID+7,ID+4,f)
  
  AddLineIDs(ID,ID+4,f)
  AddLineIDs(ID+1,ID+5,f)
  AddLineIDs(ID+2,ID+6,f)
  AddLineIDs(ID+3,ID+7,f)  
  
 EndIf
 
 Else
 
 ;/ Nur Punkt
 
 EndIf

EndProcedure

Procedure AddCube(x,y,z,G,F,d=0); x,y,z
  AddQuader(x,y,z,f,g,g,g,d)
EndProcedure



Global ZeitMessung=0, PI.f=3.1415926999999; gerundet

Global Dim cosV.f(2)
Global Dim sinV.f(2)
Global Dim angle.f(2)

  cosV(0)=1
  sinV(0)=0
  
  cosV(1)=-1;-1
  sinV(1)=0;0
  
  cosV(2)=1;1
  sinV(2)=0;0
 
 angle(1)=PI


Procedure UpDateVertsDim(i);/ Umrechnung der Projektion
  Protected Yrx, Yry, Yrz, Xrx, Xry, Xrz, Zrx, Zry, Zrz, rx, ry, rz, x, y, z, scaleFactor.f=1
  
  ;/ Drehung um Y-Achse    
 

  x=EDim(i)\x
  z=EDim(i)\z
  y=EDim(i)\y
  
    
  ;/ Kamera bewegen
  
  ;x-100
  ;y+100
  z+0;
  
  
  ;/ Drehung um Y-Achse
  
  Yrx=(x*cosV(0))+(z*sinV(0)) ;/ Minus Z
  Yry=y
  Yrz=(-z*cosV(0))+(x*sinV(0)) ;/ Minus Z
  
  
  ;/ Drehung um X-Achse
    
  Xrx=Yrx  
  Xry=(Yry*cosV(1))+(Yrz*sinV(1)) 
  Xrz=(-Yrz*cosV(1))+(Yry*sinV(1))
  
  
  ;/ Drehung um Z-Achse
  Zrx=(Xrx*cosV(2))+(Xry*sinV(2))
  Zry=(-Xry*cosV(2))+(Xrx*sinV(2))
  Zrz=Xrz
   
  
   ;/ Zoom out
  
  
  rx=(Zrx/(1+((Zrz*scaleFactor)/500)));+(Zrx/(1+((Zrz*scaleFactor)/500)))
  ry=(Zry/(1+((Zrz*scaleFactor)/500)));+(Zry/(1+((Zrz*scaleFactor)/500)))
  
  
  EDim(i)\x2D=240-rx ;/ -x
  EDim(i)\y2D=160-ry
  
EndProcedure


Procedure Drehung(i)
 Protected temp.f
  
 ; If i<1
  
  If (angle(i)<PI)
    If angle(i)<(0.5*PI)
      temp=((angle(i)*(2/PI))-0.5)
      sinV(i)=(0.75-((temp*temp)-temp))
      cosV(i)=(0.75-((temp*temp)+temp))
    Else  
      temp=((((PI-angle(i))*(2/PI)))-0.5)
      sinV(i)=(0.75-((temp*temp)-temp))
      cosV(i)=(-0.75+((temp*temp)+temp)) 
    EndIf
  Else  ;/ ohne Sonst sieht es ganz schön schlimm aus
    If angle(i)<(1.5*PI)
      temp=(((angle(i)-PI)*(2/PI))-0.5)
      sinV(i)=(-0.75+((temp*temp)-temp))
      cosV(i)=(-0.75+((temp*temp)+temp))
    Else  
      temp=((((2*PI)-angle(i))*(2/PI))-0.5)
      sinV(i)=(-0.75+((temp*temp)-temp))
      cosV(i)=(0.75-((temp*temp)+temp)) 
    EndIf 
  EndIf
  
 ; EndIf
  
EndProcedure  


Procedure Calc() ;/ Kamera
Protected i
  ;/If (angle(i)>PI) ;/ Schlüssel  
  
  For i=0 To 2
    Drehung(i)
  Next
  
  ;/ Berechnung der Drehwinkel, eventuell kürzer und einfacher möglich???

EndProcedure



Procedure Draw2D(OutPut)
  Protected i,a
  StartDrawing(OutPut)
  Box(0,0,480,360,0) ;/ eine Art ClearScreen
  Plot(240,160,RGB(255,255,255)) ; MittelPunkt im Universum
  
  For i=0 To CountList(E3D())-1
    Calc()
    UpDateVertsDim(i)
   ; Circle(EDim(i)\x2D,EDim(i)\y2D,1,RGB(255,0,0))
   If EDim(i)\x2D>10 And  EDim(i)\x2D<470 And EDim(i)\y2D>10 And EDim(i)\y2D<350
    Plot(EDim(i)\x2D,EDim(i)\y2D,RGB(255,0,0)) 
   EndIf 
    ;/ Plot darf nicht außerhalb eines Images gezeichnet werden!!!
  Next
   
  
  For i=0 To CountList(LID())-1
    LineXY(EDim(  LIX(i)\ID1  )\x2D,EDim(LIX(i)\ID1)\y2D,EDim(LIX(i)\ID2)\x2D,EDim(LIX(i)\ID2)\y2D,LIX(i)\color)
  Next
  
  
  DrawText(0,0,StrF(CountList(LID()),2),RGB(255,255,255),0)
  
  StopDrawing()
 
   
 
EndProcedure


;/ Sortiert nach Wichtigkeit
Global Dim RotateUmAchse(2)



Procedure WinkelRechnung(i,R)
    If R>0
      angle(i)+0.05
      If (angle(i)>(2*PI))
        angle(i)-(2*PI)
      EndIf
    Else
      angle(i)-0.05
      If (angle(i)<0)
        angle(i)+(2*PI)
      EndIf
    EndIf    
    
    
EndProcedure    

Procedure fortlaufend()
Protected i
  If (ElapsedMilliseconds()-ZeitMessung)>(1000/50)
  
  
   For i=0 To 2
   If RotateUmAchse(i)
       WinkelRechnung(i,RotateUmAchse(i))
   
   EndIf 
   Next
   
   
   
    Draw2D(ImageOutput(0))
    SetGadgetState(0,ImageID(0))
    ZeitMessung=ElapsedMilliseconds()
    
  EndIf
EndProcedure


Procedure CreateSprites() ;- NEUE 2D-Befehle für Texturen
  Protected x,y
  CreateSprite(0,128,128,#PB_Sprite_Texture)
  CreateSprite(1,128,128,#PB_Sprite_Texture)
  
  StartDrawing(SpriteOutput(0))
  Box(0,0,SpriteWidth(0),SpriteHeight(0),RGB(255,64,0))
  Box(5,5,40,15,RGB(0,64,100))
  LineXY(0,0,SpriteWidth(0),SpriteHeight(0),RGB(0,0,255))
  LineXY(0,SpriteHeight(0),SpriteWidth(0),0,RGB(0,0,255))
  StopDrawing()
  
  
  StartDrawing(SpriteOutput(1))
  Box(0,0,SpriteWidth(0),SpriteHeight(0),RGB(0,64,0))
  For y=0 To 10
    For x=0 To 10
      Box(12*x,12*y,8,8,RGB(0,64+Random(40),100))
    Next  
  Next  
  
  StopDrawing()
  
  
  CreateSprite3D(0,0)  
  CreateSprite3D(1,1)  
EndProcedure

Procedure DrawSprites()
  ;/ aus verbunden Linien müssen Flächen werden. Bzw. es müssen Dreiecke erstellt werden.
  Start3D()
    
  
  
  Stop3D()
EndProcedure


Procedure FromListToArray()
ReDim LIX.LID(CountList(LID()));/ einer mehr, wenn keine Linien hinzugefügt wurden
Protected i=0
ForEach LID()
  LIX(i)\ID1=LID()\ID1
  LIX(i)\ID2=LID()\ID2
  LIX(i)\color=LID()\color
  i+1
Next

ReDim EDim.p3D(CountList(E3D()));/ einer mehr, wenn keine Punkte hinzugefügt wurden
i=0
ForEach E3D()
  EDim(i)\x=E3D()\x
  EDim(i)\y=E3D()\y
  EDim(i)\z=E3D()\z
  EDim(i)\x2D=E3D()\x2D
  EDim(i)\y2D=E3D()\y2D
  EDim(i)\Color=E3D()\Color
  EDim(i)\ID=E3D()\ID
  i+1
Next

EndProcedure

Procedure Add3DElements()
;/ Damit Verzerrungen minimiert werden, müssen Flächen
;/ in kleinere Flächen geteilt werden!

;Define i,i2,i3,c=4, l=48,f

Protected i,i2,i3,c=8, l=30,f

For i3=0 To c
 For i2=0 To c
  For i=0 To c
    f=30*(i+1)
    ;AddCube(-l+c*i,-l+c*i, l-c*i,2*l-c*2*i,RGB(f,f,f))
    ;AddCube(120-l*i2,90-l*i, 120-l*i3,l-10,RGB(0,255,0)) ;/ doppelte Punkte bei großen Anzahlen nicht tresten!!!
    ;/ Doppelte Linien werden gezeichnet, doppelte 3D-Punkte sind im Array und werden auch berechnet
    ;AddCube() macht statt 12 notwendigen Linien, 6 * 4 Linien! 6 Mal so viele 3D-Punkte wie benötigt werden!!!
    ;AddQuader(120-l*i2,90-l*i, 120-l*i3,l-10,RGB(0,255,0)) ;/ doppelte Punkte bei großen Anzahlen nicht tresten!!!
  Next  
 Next  
Next 


;/ Achsen
;AddQuader(0,0,0,RGB(128,255,0),0,0,200) 
;AddQuader(0,0,0,RGB(128,255,0),0,400,0) 
;AddQuader(0,0,0,RGB(128,255,0),400,0,0) ;/ unsichtbar


AddQuader(0,0,100,RGB(128,128,255),300,220,10)

AddQuader(0,-120,0,RGB(128,128,255),300,10,200) 

AddMesh()
For i=0 To 10
  AddQuader(-130+20*i,-115,15,RGB(128,255,0),15,0,15) 
  
Next
EndMesh()


AddCube(0,0,0,8,RGB(255,128,0))
AddCube(-50,0,0,8,RGB(255,128,0))

EndProcedure

angle(0)=PI
angle(1)=PI+0.4

;/ bei rund 3.000 3D-Punkten wird das System langsam


Procedure createGadgets()
 Protected i
  CreateImage(0,480,360)
  
  ImageGadget(0,10,5,480,360,ImageID(0),#PB_Image_Border)
  
  For i=0 To 2
    ButtonGadget(1+2*i,500,5+30*i,30,25,"<<",  #PB_Button_Toggle )
    ButtonGadget(2+2*i,530,5+30*i,30,25,">>",  #PB_Button_Toggle )
    ButtonGadget(7+i,560,5+30*i,30,25,"0")
  Next  
 ;ButtonGadget(3,530,5,20,25,"||",  #PB_Button_Toggle )
  
EndProcedure


Define i
If OpenWindow(0,0,0,600,750,"FL 3D - ACHTUNG! Bei Window-Events wird 3D mit Texturen unterbrochen!",#PB_Window_ScreenCentered | #PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
  
  InitSprite()
  OpenWindowedScreen(WindowID(0),10,380,480,360,0,0,0)
  InitSprite3D()
 ; CreateSpriteS()
  Sprite3DQuality(1)
  
  
  createGadgets() 
  
  Add3DElements()
  FromListToArray()
  
  ;/ MoveMesh erst nach FromListToArry()
  MoveMesh(0,0,0,0)
  
  
  Draw2D(ImageOutput(0))
  
  Define Event.l, Quit, GadgetNr
  
  
  
  Repeat
  
  Repeat
    
    Event=WaitWindowEvent(20)
    
     If Event=16
      Quit=1
      
    ElseIf Event=#PB_Event_Gadget
      GadgetNr=EventGadget() 
      
      
      For i=0 To 2
      
      If GadgetNr=1+2*i             
        SetGadgetState(2+2*i,0)
      ElseIf GadgetNr=2+2*i        
        SetGadgetState(1+2*i,0)
      EndIf
      
      If GetGadgetState(1+2*i)
        RotateUmAchse(i)=1       
      ElseIf GetGadgetState(2+2*i)        
        RotateUmAchse(i)=-1  
      Else
        RotateUmAchse(i)=0                          
      EndIf     
         
         If GadgetNr=7+i
           angle(i)=PI
           sinV(i)=0
           cosV(i)=1 
           
           RotateUmAchse(i)=0  
           SetGadgetState(1+2*i,0)                        
           SetGadgetState(2+2*i,0)
         EndIf
         
      Next
      
      If GadgetNr=8 
        cosV(1)=-1;-1         
        angle(1)=PI+0.4
      EndIf
      
      If GadgetNr=9 
        angle(2)=0
      EndIf
      
      
    EndIf
    
    ;/ fortlaufend
    fortlaufend()
    
  Until Event=0
  
  FlipBuffers()
  ClearScreen(0)
  
 ; Draw2D(ScreenOutput())
  
  DrawSprites()
    
    
  Until Quit   
  
EndIf
; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 519
; FirstLine = 499
; Folding = ----
; Executable = F3DXWCX.exe
Zurzeit bastel ich an einem Sound-Editor.

Und für die Erzeugung möchte ich noch einmal auf meinen Code hinweisen:

http://www.purebasic.fr/german/viewtopi ... r&start=20

Da eine Stimme als Musik etwas langweilig ist, überlege ich an einer Methode, wie man sagen wir 16 Spuren gleichzeitig ansteuern kann.

Ich denke, der Syntax wird ähnlich sein:

CreateMusic(MusikID, VoiceNumber,MusicString$)

Die Frage ist nur, wie kann ich das Ganze ohne globale Variablen, Arrays machen und immer Zeitscheiben zuweisen, damit die Töne abgespielt werden.

Müsste irgendwas sein wie FlipBuffer()

Nur halt für die Musik.
Hier eine kleine Präsentation
http://www.folker-linstedt.de/software/FL_mj.zip

Vor der Frage nach dem Format stehe ich noch :?
MIDI würde sich ja anbieten. Aber MIDI lässt sich schwer einfach als STRING einbinden. /:->

Verfasst: 20.02.2008 22:51
von Kaeru Gaman
bring dein viel zu langes posting mal in ordnung, die code-tags funzen nicht überall...
[edit] ok, hast du..

btw, besser wäre es, so riesen codes extern zu posten, und in nem diskussions-posting nur zu verlinken.

Verfasst: 20.02.2008 23:11
von dllfreak2001
Also eine 3D-Engine würde ich schon mal nicht per Sprite3d oder Softwarerendering basteln. Weil dann kann man eigentlich gleich Ogre verwenden.

Aber erstmal ein Format entwickeln, dass so einen Standard darstellt wäre für den Anfang gut....
Jedoch wenn man so eine Map lesen wollte, das kriegt man praktich garnicht hin wenn sie entsprechend groß wird und Strings verbrauchen auch deutlich mehr Platz. Und Bytes,Words,Longs & Co. sollte jeder der ernsthaft so ein Projekt angeht schon aus ner datei per PB auslesen können. Teilweise kann man den Kramm per Memorybefehle noch schneller raushollen. Vernünftige Tutorials und Beipielcodes wären dazu echt gut.

Verfasst: 20.02.2008 23:12
von Xaby
Tja, und dann ist der Link irgendwann wieder broken :mrgreen:

Haste 3D und Musik auf deinem Rechner? :D

Wie gesagt, die Teilstückchen sind quasi schon fertig.

Noch ein bisschen Logik und das Spiel ist fertig.
Naja, aber meine Codes sind nicht optimiert. Vielleicht optimieren wir zusammen :roll:

@dllfreak2001

Ja, für ein Komplexes Spiel, gebe ich dir schon Recht.
Das könnte ja der Editor erledigen, entweder Strings oder ByteCode generieren.

Die Strings sind für kleine Projekte zum Posten gedacht.
Damit es nicht immer wieder diese Conten-Probleme gibt, wo irgendwas fehlt.

Und Ogre kann sollte man halt nicht nehmen, weil das wieder eine DLL braucht, die gern vergessen wird mit zugeben. Bläht das Spiel auch unnötig auf.

Sprite3D hat auch einen Fehler möchte ich behaupten.
Die Berechnung der Verzerrung in meiner "nennen wir es mal" Engine, ist korrekt berechnet, aber TransformSprite3D macht da murks draus.
Die diagonalen Linien sind nicht richtig. Die verden verzerrt.

Sprite3D hatte ich genutzt, um halt keine externen Befehle nutzen zu müssen. Damit es reines PB bleibt. Und eine 30 kByte große Datei mit 3D-Meshes ist doch schon nicht schlecht :shock:

>>>> Geschwindigkeit stand jetzt mal an zweiter Stelle, war halt Test

Verfasst: 20.02.2008 23:28
von dllfreak2001
Sprite3ds können auch korrekt verzehrt werden, nur brauchst du dann schon etwas mehr Aufwand, such mal nach Winterlandschaft 3D hier im Forum, außerdem musst du den Kram auch sortieren.
Das kann OpenGL in Hardware und voll automatisch (Ogre sowieso)...
Außerdem wer sich ernsthaft an 3D ranwagt wird wohl noch eine dll in seinen Projektordner reinkopieren können.

Zu den Maps.
Vielleicht dann ein Miniformat "Mini" und "Advanced".
Nur wenn die Map zu groß wird wirst du das sowieso nicht posten können.

Verfasst: 20.02.2008 23:33
von Xaby
Wie auch immer, wie geht es weiter?

/:->

Wie stellste dir das vor? FormatVorschläge und dann Abstimmen?
Oder jeder macht sein Ding und dann wird konvertiert?
Nehmen wir etablierte Formate oder erschaffen wir neue?
Rad neu erfinden oder auf unsere Bedürfnisse optimieren?

Oder wollen wir erstmal über Geschichte und das Spiel an sich sprechen?

Hab gerade die Vorschau für UT3 gesehen. Gibt es da eine Handlung oder ist es nur geballer mit fetter Grafik?

:?

Verfasst: 21.02.2008 02:36
von Xaby
Wir können ja parallel über ein Format und die Story debatieren.
Entweder gewürfelt oder wir machen zu den einzelnen Bereichen, die für ein Spiel von Wichtigkeit sind, einzelne Threads auf.

Vielleicht im Überthema: Projekte, Resourcen, Tools

Da können wir dann auch unsere Tools zum Level-Basteln, Musik-Erstellen etc. vorstellen.

Hier mal Links, worüber wir sprechen könnten, was Thema bzw. Haupthandlung unserer Geschichte sein kann.

Roboter, Androiden, Cyborgs (Blade Runner, Robocop, StarCraft ...)
http://de.wikipedia.org/wiki/Android

Ritter, Mittelalter (Prince of Persia, Thief, Assassin's Creed ...)
http://de.wikipedia.org/wiki/Ritter

Ninjas und Samurai (Batman, Spiderman, Turtles, Shadow Dancer ...)
http://de.wikipedia.org/wiki/Katana

....

>>>>
zu spät fern zu sehen ist nicht gut:
Eva heimlich gefilmt als sie sich selbst beglückt ...

Also wenn da eine 5 Köpfige Crew herum steht. Die Frau perfekt geschminkt ist, das Licht alles ausleichtet und die Kameraposition nicht fest ist ... kann man dann noch von heimlich sprechen?
<<<<

Piraten (Monkey Island, Fluch der Karibik, ...)

Kauhboi unt Injahna (Old Shatterhand, Winetow, Desperados ...)

Raumschiffzeugs (Stargate :), Startrek, Starwars, Battlestar Galactica, Andromeda ...)

Bild

Traumwelten (Schlafmütz und Co, Cyril Cyberpunk, Keen, Caption Comic ..)

Eigene Creationen 2,5 D (Hunter Hunted, Lomax Lemming, Abe's Odysee, Agent Armstrong ...)

...

Was haltet ihr von, wenn wir uns einige Spiele genauer anschauen.
Demos spielen, Empfehlungen geben. Damit alle wissen, worum es geht.

Wir können auch eine spielevorstellungen machen, was wir so für Spiele mögen, aber ob wir da fertig werden?

Ich habe einige Batman-Titel auf Consolen/Emulatoren gespielt.
Mag das Genre des mystischen Nijas.
Bin stlzer Besitzer aller Prince of Persia Teile für den PC.
1,2, 3D, Trilogie Sands of Time (Sands of Time, Warrior Within, The Two Thrones) Da fällt mir ein, Prince of Persia - Sands of Time habe ich insegsamt 3 Mal. Einmal auf einer Messe gekauft als Treiberbeilage für eine Grafikkarte, 2 CDs, und dann einmal allein in einer CD-Box und in einer Special Edition war es noch mal. Wer also eins braucht. Ich würd's verschicken. Mortal Kombat mag ich auch. Bin aber kein Freak, der alle Combos auswendig kennt. Mag den Realismus. (bis auf beim Blut, aber da ist der falsche Realismus auch in Ordnung)

Ich mag Legacy of Kain, naja. Soul Reaver 1 hab ich, läuft nicht mehr auf PC. 2 hab ich wohl auch irgendwo, läuft aber auch nicht unter XP mit nVIDEA Grafikkarte und Legacy of Kain - Defiance hab ich noch nicht angespielt, steht aber noch im Schrank.

Ich kaufe Spiele, wenn sie 20 Cent kosten, in einer Zeitschrift beiliegen oder für unter 5,- Euro in einer Krambox zu finden sind.
Es gibt auch Ausnahmen. Aber hab mir noch nie was für 50,- Euro gekauft.

Hab ja auch nicht immer den neusten Rechner, bringt also wenig die neusten Spiele zu kaufen :freak:

Ich hab einige Spielesammlungen wie GoldGames 3, GamePack 2.
Das schickste und innovativste Autorennen, was ich kenne, ist MegaRace.
MegaRace 2 ebenfalls geil.

Achso, einige Tombraider-Title besitze ich auch.
Aber da auch eher druch Zufall. Trödelmarkt/Flohmarkt, 1,- Euro pro Spiel :D

Ich komm einfach nicht zu, zu spielen, muss aber meine Kauflust öfter befriedigen :oops:

Ich mag die Völker 2. Kenne die Siedler. Bin Besitzer von Knights and Merchants. Earth 2040 und Age of Empires.

Kennt jemand "Baphomets Fluch", das muss ein geiles Spiel sein.
Hatte damals auf fast jeder Demo CD eine Vorschau von gesehen.

Bin im Besitz von Runaway.

Hab auch schon mal Physicus gespielt und stolzer Besitzer aller Crazy Machines Tile. Obwohl Crazy Machins 2 etwas bescheiden ist, obwohl Original geht's ohne NoCD-Crack nicht an. Und der läuft nicht zusammen mit dem Patch und ohne Patch ist es langsam und stürzt oft ab ...

Ein Teufelskreis.

Ich bin für ein mystisches Spiel mit Humor, wo man etwas bei lernt.
Vieleicht Physikkenntnisse anwenden muss, oder andere Kenntnisse aus der Schule benötigt.

Achso, Fallout, Restricted Area, Outcast sind auch mein eigen :)

Hatte kurz auch mal ein X-Men-Rollenspiel. War aber echt nicht mein Fall, obwohl ich X-Men mag, aber das Spiel hat mich einfach nicht gefesselt, trotz gelungener Grafik.

:roll:

>>>> Wenn wir Stoff für einen Film haben, haben wir auch Stoff für ein gutes Spiel.

Ansonsten guter Link von Kaeru German, Spiel macht süchtig:
http://www.candystand.com/uk/play.do?id=18047

Verfasst: 21.02.2008 03:56
von Emily
Die Tileengine ist nicht das Problem, aber überleg mal was für Unmengen teils animierter Grafiken du für so ein Spiel brauchst.