Sprites in 2d
Übersicht

![]() |
IguanBetreff: Sprites in 2d |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
stimmt! an das habe ich nicht gedacht! ![]() aber beleuchten könnte ich sie! ![]() 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.) ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
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...
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 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. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Hectic: Genial!!! so wollte ich das! ![]() ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, ich habe deinen Code ausprobiert! Er funktioniert schon! ![]() Aber das Skalieren der Sprites(ScaleSprite) auf 1:1 habe ich noch immer nicht hinbekommen. ![]() 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? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach so! ![]() ![]() Danke vielmals für deine Bemühungen!!!!! ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group