Seite 1 von 2

sprite3d in einem windowsfenster

Verfasst: 29.11.2005 17:28
von super_castle
wie kann ich 3dsprites in einem windowsfenster darstellen.
die demo läuft auf vollbildschirm. mir fehlen die ersten schritte.

mfg castle

Verfasst: 29.11.2005 20:25
von nco2k

Code: Alles auswählen

If InitSprite() And InitSprite3D() And OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "TEST") And OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
  
  If CreateSprite(0, 256, 256, #PB_Sprite_Texture) And StartDrawing(SpriteOutput(0)) And CreateSprite3D(0, 0)
    
    Box(0, 0, 256, 256, RGB(255, 0, 0))
    StopDrawing()
    
    Repeat
      
      x.l + 3
      If x => 640
        x = -256
      EndIf
      
      ClearScreen(0, 0, 0)
      If Start3D()
        DisplaySprite3D(0, x, 112)
        Stop3D()
      EndIf
      FlipBuffers()
      
      WinEvent.l = WindowEvent()
      If WinEvent = 0
        Delay(1)
      EndIf
      
    Until WinEvent = #PB_Event_CloseWindow
    
  EndIf
  
EndIf

End
hoffentlich schreckt dich das jetzt nicht ab.

zur erklärung:

mit InitSprite() und InitSprite3D() initialisiere ich die DirectDraw & Direct3D umgebung (sofern windows benützt wird). anschliessend öffne ich ein fenster mit OpenWindow() und gleich danach erstelle ich in diesem fenster ein Screen mit OpenWindowedScreen(). mit CreateSprite() erstelle ich ein leeres sprite und zeichne anschliessend mit StartDrawing() : Box() : StopDrawing() die rote Box. ansonsten hätte ich auch ein sprite von der festplatte direkt laden können mit LoadSprite(), mehr dazu findest du tonnenweise hier im forum. nachdem das sprite geladen bzw. erstellt wurde, machen wir daraus ein 3d sprite mit dem befehl CreateSprite3D().

in der repeat schleife lösche ich bei jedem schleifendurchgang den Screen mit ClearScreen(), starte die Sprite3D() "Engine" und zeichne mein 3d sprite auf dem backbuffer mit DisplaySprite3D() auf das screen und beende die ausführung mit Stop3D(), nachdem alle arbeiten mit 3d sprites erledigt wurden. anschliessend vertausche ich (filppe) die beiden buffer mit FlipBuffer() damit unser screen sichtbar wird.

das programm wird beendet, wenn man im fenster auf das X klickt. die abfrage mache ich anhand von WindowEvent(). WaitWindowEvent() würde jedesmal warten bis ein event im fenster passiert, bevor es weitergeht. WindowEvent() wartet auf kein ereigniss und ist genau das richtige für ein spiel im fenster.

um die prozessorauslastung zu senken habe ich eine abfrage gemacht:

Code: Alles auswählen

      WinEvent.l = WindowEvent()
      If WinEvent = 0
        Delay(1)
      EndIf
sofern kein ereignis im fenster passiert, gönnen wir unserer cpu eine kleine pause Delay(1). sprich, die cpu kriegt eine millisekunde extra zeit, um sich um andere anwendungen in der zwischenzeit kümmern zu können.

ich bin nicht wirklich gut, bei solchen erklärungen, hoffe aber dass du trotzdem noch einigermassen durchblickst. ansonsten studieren geht über probieren. :wink:

c ya,
nco2k

Verfasst: 29.11.2005 20:35
von super_castle
hallo, vielen dank für deine hilfe.
habe heute erste mit pure angefangen. das original kommt in einpaar tagen.
arbeite noch mit dem demo. dein programm funktioniert.
eine sache dazu noch, ich möchte ein bild als hintergrund einsetzen???wie geht das?

ps: habe bis dito mit visualbasic5 gearbeitet, 3d ist sehr sehr schwer in vb5, fast unmöglich. pure ist so hardwarenah, ganz toll.
ein bisschen verstehe ich von den begriffen sprite , init.. usw.
du brauchst es da nicht so genau erklären. kostet auch viel zeit das zu schreiben. also vielen dank.

mfg castle

Verfasst: 29.11.2005 20:54
von Kaeru Gaman
einen hintergrund kannst du mit einem sprite erzeugen, das so groß wie der screen ist.

musst du nur als erstes darstellen.
also in jedem frame, direkt nach oder eben anstelle von ClearScreen()

du kannst diesen hintergrund auch aus bildteilen zusammensetzen.

sprites sind praktisch wie brushes, als ob du z.b. in PAINT mit einfügen bildchen einfügst.
die reihenfolge der darstellung bestimmt was verdeckt wird.

noch ein hinweis:
wenn die sprites in den grafikspeicher geladen wurden, werden sie schneller dargestellt,
wenn sie in den hauptspeicher geladen wurden, kann man sie schneller manipulieren.

Verfasst: 29.11.2005 20:55
von nco2k
@castle
wenn du erfahrung hast, umso besser. :wink:

du könntest als hintergrundbild einfach ein weiteres sprite anzeigen:

Code: Alles auswählen

#Sprite1 = 0
#Sprite2 = 1

If InitSprite() And InitSprite3D() And OpenWindow(0, 0, 0, 640, 480, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "TEST") And OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
  
  If CreateSprite(#Sprite1, 640, 480) And StartDrawing(SpriteOutput(#Sprite1))
    
    Box(0, 0, 640, 480, RGB(0, 0, 255))
    Locate(320, 240)
    DrawingMode(1)
    FrontColor(0, 255, 0)
    DrawText("ich bin das hintergrund-bild (sprite)")
    StopDrawing()
    
    If CreateSprite(#Sprite2, 256, 256, #PB_Sprite_Texture) And StartDrawing(SpriteOutput(#Sprite2)) And CreateSprite3D(#Sprite2, #Sprite2)
      
      Box(0, 0, 256, 256, RGB(255, 0, 0))
      StopDrawing()
      
      Repeat
        
        x.l + 3
        If x => 640
          x = -256
        EndIf
        
        ClearScreen(0, 0, 0)
        DisplaySprite(#Sprite1, 0, 0)
        If Start3D()
          DisplaySprite3D(#Sprite2, x, 112)
          Stop3D()
        EndIf
        FlipBuffers()
        
        WinEvent.l = WindowEvent()
        If WinEvent = 0
          Delay(1)
        EndIf
        
      Until WinEvent = #PB_Event_CloseWindow
      
    EndIf
    
  EndIf
  
EndIf

End
ich weiss aber jetzt nicht genau wie das bei 2d sprites ist, ob sie auch im 2^ format (64x64, 128x128, 256x256...) vorliegen müssen. bei 3d sprites kann es zu darstellungsproblemen kommen, auf manchen (vorallem älteren) grafikkarten.

c ya,
nco2k

Verfasst: 29.11.2005 21:35
von super_castle
klappt wunderbar. vielen dank.
da ich die grafik schnell in den griff bekommen möchte für meinen roboter (ein cmoscambild soll im fenster dargestellt und ein sprite-robby soll unter purebasic im windowsfenster die gleichen bewegungen machen, wie der reale robby. daten werden über rs232 übermittelt, das nächste problem in purebasic).
als nächstes möchte ich einen meshconverter herunterladen, weil pure nur mesh-körper kennt. die körper liegen im x-format vor und im 3ds-format.
hier bitte ich um nächste hilfe, wer von euch hat sich schon mit einem umwandler auseinandergesetzt für mesh.

ist eine interessante sache mit dem robby visual und real umzugehen.
mfg castle

Verfasst: 01.12.2005 09:16
von super_castle
habe jetzt das fenster für die 3dspritedarstellung verkleinert um das übrige fenster für button zu nutzen. geht wunderbar.

mfd castle

Verfasst: 01.12.2005 10:29
von dllfreak2001
soweit ich weiß kannst du keine Sprite3D und Mesh models zusammen nutzen.
Die Models werden über die in PB integrierte Ogre-Engine dargestellt, diese läuft auf Basis von OpenGl, und Sprite3d´s laufen auf Basis von
Direct3D. Du siehst beides geht nicht gleichzeitig.

Verfasst: 01.12.2005 10:35
von super_castle
vielen dank für die antwort.
ich werde dann zwei getrennte windowsfenster öffnen und dann erstmal mit den beiden fenstern über die ablage mit text communizieren mit dem mesh3d-fenster und dem videocapture-fenster bzw commander-fenster.

mfg castle

ps: kannst du mir beim kauf von milkskape helfen?

Verfasst: 01.12.2005 19:05
von Danilo
super_castle hat geschrieben:ich werde dann zwei getrennte windowsfenster öffnen und
dann erstmal mit den beiden fenstern über die ablage mit text
communizieren ...
Falls Du mit "Ablage" das Clipboard meinst, das ist für den
User da. Daran hast Du nur etwas zu ändern wenn es der
User so wünscht, z.B. durch Cut/Copy - ansonsten lässt
man generell die Finger davon.
Daten zwischen 2 Fenster austauschen geht auch ohne Clipboard.
Beispiele dafür sollten im CodeArchiv zu finden sein.