Sprites in 2d

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Iguan

Betreff: Sprites in 2d

BeitragSa, Jan 28, 2006 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

ich habe jetzt den ganzen tag schon rumprobiert, aber habe noch nichts zufriedenstellendes hingekriegt.

müsste eigentlich ganz eifach sein (oder nicht?)

Ich möchte mit Sprites ein Space Shooter proggen, damit ich alles
blitzschnell drehen, zerren, beleuchten und transparent machen kann.

Aber wenn ich ein Sprite lade, wird es automatisch auf Bildschirmgösse skaliert(Gestaucht).

Die Sprites sollten in Originalgrösse und an der richtigen Position dargestellt werden.
(Also so, dass es eigentlich kein sichtbarer Unterschied zwischen Sprites und einem Bild, welches mit DrawImage gezeichnet wurde, gibt.)

Ich weiss, dass dann das Bild quadratisch sein muss und die Seitenlängen in 2er Potenzen sein müssen. Dennoch habe ich es nicht hingekriegt


Wenn das klappen würde, könnte ich die pixelgenaue Kollisionsabfrage mit
ImagesCollide überprüfen. (obwohl ich dabei nie den Befehl DrawImage verwenden würde!)

Könnt ihr mir da vielleicht weiterhelfen? Ich habe im Forum schon viele ähnliche Beiträge gesehen, aber nie wirklich das, was ich brauche!


Danke vielmals!!


Iguan
 

Dreamora

BeitragSa, Jan 28, 2006 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein ImageCollide würde wegfallen, da du ja skalieren und drehen willst.

Für solche Dinge würde ich dir sehr zu BlitzMax raten, da das auf genau diese Art von 2D ausgelegt ist und das Kollisionssystem das auch unterstützt.

Was meinst du genau mit gestaucht? Hast du vorher den Camera Projection Mode (kenn den genauen Befehl grad nimmer) auf Orthogonal umgestellt? Weil sonst entstehen perspektivische Verzerrungen, die du gewiss nicht haben möchtest bei einem 2D in 3D "Fake" ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Iguan

BeitragSa, Jan 28, 2006 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt! an das habe ich nicht gedacht! Embarassed
aber beleuchten könnte ich sie! Wink

nein, ich möchte bei BB3D bleiben.. iss mir irgenwie sympatischer..


also, nochmals die frage:


Wie kann ich die Sprites in Originalgrösse und an der richtigen Position dargestellt werden.
(Also so, dass es eigentlich kein sichtbarer Unterschied zwischen Sprites und einem Bild, welches mit DrawImage gezeichnet wurde, gibt.) Question

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jan 28, 2006 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Iguan, hier mal ein kleiner Tip... Setze die Kamera in den halben Abstand nach hinten (Z-Achse) wie deine Bildschirmauflösung breit ist, und schon hast du ein Pixel in der 2D-Welt eine Einheit in der 3D-Welt... Vergesse aber nicht das die Koordinate X=0,Y=0 in der 3D-Welt links/unten ist (links/oben in 2D). Wenn die aber das ganze rumgerechne +Y und dann mal wieder -Y usw. nicht passt, kannst du auch die Kamera nicht nach hinten, sondern nach vorne schieben und in der X-Achse um 180° drehen, und fertig ist die Laube. Allerdings drehen sich dann die Objekte wieder alle 'falsch' herum, und Sprites sind nach dem erstellen und enstprecheder SpriteViewMode auch noch nicht mal zu sehen...

Also wenn Graphics3D 800,600,0,1
dann PositionEntity camera,0,0,-400

Wenn du jetzt noch den Nullpunkt der 3D-Welt auch noch aus der Mitte haben willst, dann verschiebe die Kamera wie folgt... PositionEntity camera,400,-300,-400

Falls du mir nicht glaubst, hier mal ein kleiner Beispielcode...Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
sprite=CreateSprite()
PositionEntity camera,400,-300,-400
ScaleSprite sprite,1.5,1.5
HidePointer



While Not KeyHit(1)
 mx=MouseX()
 my=MouseY()

 PositionEntity sprite,mx,-my,0
 RenderWorld

 Rect mx-3,my-3,7,7,0
 Text 0,0,mx+" "+my
 Flip
Wend
End
Mit der Maus kannst du da was bewegen. Der Rahmen ist in 2D -Modus gezeichnet worden. Der kleine weiße Punkt in der Mitte des Rahmens ist ein Sprite...

Um die Sprites auf 1:1 zu bekommen, gibt es glaube ich mal hier gelesen zu haben, auch einen ganz einfachen Trick, wie der der Kamera.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Jan 28, 2006 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ScaleSprite

EDIT: @Dreamora. Perspektivische Verzehrungen tretten nur auf wenn die Sprites in unterschiedlicher Höhe (Abstand zu Kamera) bewegt werden. Ansonsten ist die Entfernung für eine Grafikkarte am Bildschirmrand die selbe wie die an der Bildschirmmitte. Und somit keine Verzehrung. Das ist auch der Grund warum in EgoShootern etc. die Wände, Bäume etc, näher ran gezeichnet werden als in der Bildschirmmitte, und das obwohl ich mich nicht bewege sondern nur rumdrehe.

Wenn aber Sprites auf einer 'platten' 2D-Welt gezeichnet werden, können so komische Überlappungen/durchscheinen einzelner Fragmente anderer Sprites auftretten, wenn sie sich kreuzen. Geschieht bei mir zumindest aber nicht, wenn der Abstand der Kamera konstant (kein Float!!) und der Winkel genau auf 90° (auch hier kein Float) gehalten wird.

Iguan

BeitragSa, Jan 28, 2006 23:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hectic: Genial!!! so wollte ich das! Razz woher hast du den das mit der halben Bildschirmbreite gewusst..? bist wohl einfach ein genie Wink

ein Problemchen gibt es allerdings noch..
ich habs jetzt so gemacht:


Code: [AUSKLAPPEN]


Graphics3D 640,480,0,1
SetBuffer BackBuffer()



camera=CreateCamera()
sprite=LoadSprite("Bild.bmp",4)
PositionEntity camera,320,-240,-320
ScaleSprite sprite,500,500
EntityFX sprite,16
HidePointer


AmbientLight 140,40,255


While Not KeyHit(1)
mx=MouseX()
my=MouseY()

PositionEntity sprite,mx,-my,0
RenderWorld

Rect mx-3,my-3,7,7,0
Text 0,0,mx+" "+my
Flip
Wend
End



Je nach Grösse des geladenen Bildes muss ich den Wert bei ScaleSprite
anpassen, damit es in Originalgrösse angezeigt wird.. gibt es dafür nicht auch ne einfache Lösung?

Iguan

BeitragSo, Jan 29, 2006 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
ach ja, und noch etwas: der Bezugspunkt ist jetzt immer in der Mitte des Bildes(sprites)... wie kriege ich den oben links hin? habs mal mit TextureWidth(sprite) versucht... geht aber nicht...

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 29, 2006 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe ich erklärt und ist sogar im Beispielcode so... Kamera dann halt noch zur Seite und in der Höhre verschieben und alles bleibt Pixelgenau!!! Kannst es ja mal versuchen den Beispielcode zu kopieren um ihn mal auszutesten... Man bewegt mit der Maus ein Rect (2D) und ein Sprite (3D) Parallel und ohne Rundungsfehler etc...

Iguan

BeitragSo, Jan 29, 2006 0:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich habe deinen Code ausprobiert! Er funktioniert schon! Wink Das mit dem verschieben habe ich auch fast so gemacht, wie du erklärt hast; anstelle der Kamera verschiebe ich einfach das Sprite um die Hälfte der Breite und Höhe.. Wenn ich die Kamera verschiebe, dann hatt das Einfluss auf alle Sprites auf dem Bild.
Aber das Skalieren der Sprites(ScaleSprite) auf 1:1 habe ich noch immer nicht hinbekommen. Embarassed

Du hast geschrieben:
Um die Sprites auf 1:1 zu bekommen, gibt es glaube ich mal hier gelesen zu haben, auch einen ganz einfachen Trick, wie der der Kamera.

was ist das für ein Trick?

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Jan 29, 2006 1:12
Antworten mit Zitat
Benutzer-Profile anzeigen
So habe mich hingesetzt und es mal ausprobiert... Hat ganze 4min gedauert. Also man mache ScaleSprite name,xx,yy wobei xx/yy jeweils die hälfte der Pixelbreite/Pixelhöhe haben sollten... Also ein Sprite das 128x128 groß ist, muß ScaleSprite name,64,64 (ImageHeight/2,ImageWidth/2) bekommen damit die größe genauso wie auf 2D dargestellt ist. Wichtig! Dabei muß aber der Abstand der Kamera richtig eingestellt sein. Wenn Bildschirmauflösung geändert wird, sollte auch der Abstand angepasst werden...

Iguan

BeitragSo, Jan 29, 2006 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so! Idea Idea Jetzt habs auch ich kapiert!!
Danke vielmals für deine Bemühungen!!!!! Smile

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group