Sprite-Problem (Düseneffekt)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

MegaTefyt

Betreff: Sprite-Problem (Düseneffekt)

BeitragMi, Aug 03, 2005 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe derzeit ein etwas blödes Problem. Folgende Situation: ich versuche einen Düseneffekt für ein fliegendes Raumschiff zu machen. (also das Zeug, was aus dem Raumschiff"auspuff" hinten rauskommt)

Ich poste dazu mal ein Bild aus einem Testprogramm, welches mein Problem recht gut zeigt:

user posted image

Beschreibung: das ganze stellt eine Kamerafahrt dar. Die Kamera bewegt sich jedes Frame mit 0.5 Einheiten nach vorne und jedesmal wird um 2 in Richtung Z verschoben ein "Düsensprite" gemacht, das durch die Kamerabewegung ja automatisch nach hinten geht. Die Bewegungsschritte der Kamera sind zu groß für die Sprites und sind dadurch zu sehr versetzt (siehe linker "Streifen"). Daher schiebe ich mit jeder Kamerabewegung um 0.5 jedes Sprite um 0.45 mit der Kamera, dann sieht das aus wie der rechte Streifen.

Der graue Balken in der Mitte ist die Z-Startposition von den Sprites (auf der Höhe wäre dann der Raumschiff"auspuff"), der Balken liegt genau auf der Höhe der Startposition der Sprites. Und genau dort liegt das Problem! Wie man sieht erstellt er JEDESMAL ein Sprite, welches hinter der eigentlichen Startposition liegt. Ich hab schon alles mögliche probiert und keine Ahnung wo dieses zusätzliche Sprite jedesmal herkommt. Am besten sieht man das am rechten Strahl, der fängt so richtig auf der Höhe des Balkens an, aber dahinter liegt ein einzelnes Sprite extra... Wenn das nicht wäre sähe das am Raumschiff perfekt aus (mit einem bläulichen Sprite). Ich poste mal den Quellcode dieses Testdingens zum Selbertesten:

BlitzBasic: [AUSKLAPPEN]

Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

Camera = CreateCamera()
CameraViewport Camera, 0, 0, GraphicsWidth(), GraphicsHeight()

;Sprite-Type 1, wird nicht extra verschoben
Type Sprite
Field Spr
Field Spawntime#
End Type

;Sprite-Type 2, wird mit jeder Kamerabewegung etwas mit verschoben
Type Sprite2
Field Spr
Field Spawntime#
End Type

;Sprite vorbereiten
TestSprite = LoadSprite(\"bullet.bmp\")
HideEntity TestSprite

;Balken zur Demonstration der Sprite-Startposition
Zeige = CreateCube()
ScaleEntity Zeige, 0.25, 0.02, 0.02
PositionEntity Zeige, 0, -1, 2
EntityParent Zeige, Camera

Const IntFPS% = 60
FPS_Period = 1000 / IntFPS
FPS_Time = MilliSecs() - FPS_Period

While Not KeyHit(1)

Repeat
FPS_Elapsed = MilliSecs() - FPS_Time
Until FPS_Elapsed

FPS_Ticks = FPS_Elapsed / FPS_Period

FPS_Tween# = Float(FPS_Elapsed Mod FPS_Period) / Float(FPS_Period)

For FPS_Cnt = 1 To FPS_Ticks

FPS_Time = FPS_Time + FPS_Period
If FPS_Cnt = FPS_Ticks Then CaptureWorld

UpdateWorld

;Kamerabewegung um 0.5 auf Z-Achse
MoveEntity Camera, 0, 0, 0.5

;Sprites auf der rechten Seite um 0.45 auf Z-Achse verschieben
For yy.Sprite2 = Each Sprite2
MoveEntity yy\Spr, 0, 0, 0.45
Next

;Sprite auf der linken Seite erstellen
xx.Sprite = New Sprite
xx\Spr = CopyEntity(TestSprite)
ScaleSprite xx\Spr, 0.1, 0.1
PositionEntity xx\Spr, -0.5, -1, EntityZ(Camera) + 2

;Sprite auf der rechten Seite erstellen
yy.Sprite2 = New Sprite2
yy\Spr = CopyEntity(TestSprite)
ScaleSprite yy\Spr, 0.1, 0.1
PositionEntity yy\Spr, 0.5, -1, EntityZ(Camera) + 2

Next

RenderWorld FPS_Tween

Flip

Wend


Die bullet.bmp war bei einem Beispiel dabei, ich hab sie mal hochgeladen: http://www.rushed.de/download_demo.php?lockID=7736.

Achja, in dem Test werden die Sprites nicht gelöscht. Wink Vielleicht kann mir ja jemand sagen, wie dieses Zusatzsprite jedesmal entsteht... Evil or Very Mad

tobiasm767

BeitragMi, Aug 03, 2005 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin David

also das Problem ist hier bei das CaptureWorld
(hab ja gesagt ist nicht ganz einfach Wink )

wenn du ein neues Objekt erstellst am besten immer vor dem CaptureWorld-Befehl.

und am besten das 'EntityZ(Camera) + 2' durch 'EntityZ(Zeige,True)' ersetzten macht hier glaube mehr Sinn...

BlitzBasic: [AUSKLAPPEN]

Graphics3D 800, 600, 0, 2
SetBuffer BackBuffer()

Camera = CreateCamera()
CameraViewport Camera, 0, 0, GraphicsWidth(), GraphicsHeight()

;Sprite-Type 1, wird nicht extra verschoben
Type Sprite
Field Spr
Field Spawntime#
End Type

;Sprite-Type 2, wird mit jeder Kamerabewegung etwas mit verschoben
Type Sprite2
Field Spr
Field Spawntime#
End Type

;Sprite vorbereiten
TestSprite = LoadSprite(\"G:\blitz3d\Engine_v04\Engine_v04\texture\bullet2.jpg\")
HideEntity TestSprite

;Balken zur Demonstration der Sprite-Startposition
Zeige = CreateCube()
ScaleEntity Zeige, 0.25, 0.02, 0.02
PositionEntity Zeige, 0, -1, 2
EntityParent Zeige, Camera

Const IntFPS% = 60
FPS_Period = 1000 / IntFPS
FPS_Time = MilliSecs() - FPS_Period

While Not KeyHit(1)

Repeat
FPS_Elapsed = MilliSecs() - FPS_Time
Until FPS_Elapsed

FPS_Ticks = FPS_Elapsed / FPS_Period

FPS_Tween# = Float(FPS_Elapsed Mod FPS_Period) / Float(FPS_Period)

For FPS_Cnt = 1 To FPS_Ticks


;Sprite auf der linken Seite erstellen
xx.Sprite = New Sprite
xx\Spr = CopyEntity(TestSprite)
ScaleSprite xx\Spr, 0.1, 0.1
PositionEntity xx\Spr, -0.5, -1, EntityZ(camera) + 2

;Sprite auf der rechten Seite erstellen
yy.Sprite2 = New Sprite2
yy\Spr = CopyEntity(TestSprite)
ScaleSprite yy\Spr, 0.1, 0.1
PositionEntity yy\Spr, 0.5, -1, EntityZ(camera) + 2

FPS_Time = FPS_Time + FPS_Period
If FPS_Cnt = FPS_Ticks Then CaptureWorld

; UpdateWorld

;Kamerabewegung um 0.5 auf Z-Achse

MoveEntity Camera, 0, 0, 0.5
;Sprites auf der rechten Seite um 0.45 auf Z-Achse verschieben
For yy.Sprite2 = Each Sprite2
MoveEntity yy\Spr, 0, 0, 0.45

Next


UpdateWorld()



Next

RenderWorld FPS_Tween

Flip

Wend

Lord_Vader

BeitragMi, Aug 03, 2005 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte auch darauf hinweisen das 0.5er schritte recht viel is. Als ich mach bei meinen spielen immer 0.01...schritte.

Das könnte es dann auch sein was? Very Happy
 

MegaTefyt

BeitragMi, Aug 03, 2005 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Nope, es war schon das CaptureWorld-Problem und die Reihenfolge (Objekte VOR CaptureWorld erstellen). Also es funktioniert jetzt, danke an meinen Arbeitskollegen. Laughing

Naja, und bei dem "Projekt" steh ich noch ganz am Anfang, die 0.5 sind noch von meinem allerersten Test drin. ^^

x-pressive

BeitragDo, Aug 04, 2005 0:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur ein Tipp, falls du ein "richtiges" Spiel draus machen willst und dir viel vergebliche Arbeit sparen möchtest:

Wenn du solche Effekte (mit hoher Objekt-Anzahl) benötigst, solltest du auf KEINEN Fall Sprites verwenden, das frisst Geschwindigkeit wie Hölle. Die beste Lösung ist hier auf jeden Fall, wenn du alle Partikel in einem einzigen Mesh unterbringst (Single-Surface).

Man sollte solche Dinge von Anfang an immer mal auf langsameren Rechnern testen -wenn man damit wartet, bis ein Spiel fertig ist, beisst man sich unter Umständen höllisch in den Hintern -dann war viel Arbeit umsonst.

Nur mal ein Beispiel: einen langsamen PC kannst du mit zweihundert Sprites u.U. schon in die Knie zwingen -wenn du alle Objekte geschickt in einem Mesh renderst, kannst du zweitausend "Sprites" nutzen. Für mich sind die eingebauten Blitz-Sprites nur eine Notlösung, die man hier und da vielleicht mal für einzelne Dinge verwenden kann, aber mehr nicht. Confused

Wenn's dir aber nur um's rumprobieren geht, ist das ja kein Problem. Wollte es nur gesagt haben, bevor die Mühe umsonst war... Confused
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

MegaTefyt

BeitragFr, Aug 05, 2005 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, für den Düseneffekt sind bei mir gerade mal maximal 7 Sprites auf einmal zu sehen. ^^

x-pressive

BeitragFr, Aug 05, 2005 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber es kommt ja sicherlich noch mehr dazu -die Düsen anderer Schiffe, Schüsse, Explosionen, Feuer, Rauch und so weiter. Das summiert sich.

Es schadet wirklich nicht, sich von Anfang an eine professionelle Technik anzugewöhnen. Denn irgendwann werden deine Projekte größer -und dann kommst du nicht mehr dran vorbei.

Es ist immer gut, sich für solche Effekte eine Library zu coden, die man immer wieder verwenden kann. Und weil man sich die Arbeit dann ja nur einmal macht, kann man da ruhig mal mehr Zeit drauf verwenden. Ist nur ein Tipp.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group