sprite3d in einem windowsfenster
-
super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
sprite3d in einem windowsfenster
wie kann ich 3dsprites in einem windowsfenster darstellen.
die demo läuft auf vollbildschirm. mir fehlen die ersten schritte.
mfg castle
die demo läuft auf vollbildschirm. mir fehlen die ersten schritte.
mfg castle
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
Endzur 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)
EndIfich bin nicht wirklich gut, bei solchen erklärungen, hoffe aber dass du trotzdem noch einigermassen durchblickst. ansonsten studieren geht über probieren.
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.
..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
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
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
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.
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.
Der Weise weiß, dass er ein Narr ist.
@castle
wenn du erfahrung hast, umso besser.
du könntest als hintergrundbild einfach ein weiteres sprite anzeigen:
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
wenn du erfahrung hast, umso besser.
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
Endc ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
..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
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
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
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
-
super_castle
- Beiträge: 557
- Registriert: 29.11.2005 15:05
Falls Du mit "Ablage" das Clipboard meinst, das ist für densuper_castle hat geschrieben:ich werde dann zwei getrennte windowsfenster öffnen und
dann erstmal mit den beiden fenstern über die ablage mit text
communizieren ...
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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck