sprite3d in einem windowsfenster

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

sprite3d in einem windowsfenster

Beitrag von super_castle »

wie kann ich 3dsprites in einem windowsfenster darstellen.
die demo läuft auf vollbildschirm. mir fehlen die ersten schritte.

mfg castle
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
Zuletzt geändert von nco2k am 29.11.2005 20:40, insgesamt 1-mal geändert.
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag 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
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag 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
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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.
I´a dllfreak2001
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Beitrag 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?
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten