Entwickler-Ecke
Multimedia / Grafik - Wie, Teil einer Sprite-Grafik anzeigen?
avoid - So 08.06.14 11:33
Titel: Wie, Teil einer Sprite-Grafik anzeigen?
Ich hab mich schon länger gefragt wozu Sprite-Grafiken da sind.
Nun hab ich mich etwas eingelesen und wollte selbst mal eine verwenden.
Also hab ich mir eine Rausgeladen und einige Beispielprojekte angesehen,
doch auf einen grünen Zweig komme ich bisher nicht.
Wenn ich eine PictureBox oder ein Panel auf einer Form erstellt habe,
wie lade ich dort einen bestimmten teil-ausschnitt einer Sprite-Grafik?
Ein Freund meinte ich solle mit zwei PictureBoxen arbeiten die übereinander gelegt sind.
Die eine im Hintergrund auf Autosize, mit der Kompletten Grafik darin.
Die andere liegt darüber und hat nur die Größe eines Ausschnitt um nur diesen durchscheinen zu lassen.
Muss ich diese beiden PictureBoxen einander zuordnen damit das klappt?
Auch die eingestellte Transparenz der oberen Box scheint nicht zu Funktionieren.
Oder gibt es gar eine Möglichkeit die anzuzeigende Sprite-Grafik so zu laden,
dass mit pixel-Koordinaten angegeben werden kann welcher Bereich gezeigt werden soll?
könnte doch sein, denn zentrieren einer Grafik geht ja auch.
p. s. ich will keine dll oder irgend eine Eigenbauklasse verwenden.
Ich suche eine einfach Möglichkeit mit Bordmitteln des VCS-2010.
Gruß,
avoid
Th69 - So 08.06.14 12:10
Hallo,
was genau verstehst du unter einer Sprite-Grafik, d.h. welches Grafikformat?
Und da du von WinForms (PictureBox, Panel) schreibst, benutzt man dort üblicherweise direkt die Graphics-Klasse (z.B. dessen DrawImage-Methode(n)), um bewegte Grafiken zu zeichnen.
avoid - Mo 09.06.14 12:23
unter Sprite-Grafik verstehe ich eine Datei wie z. b. diese
http://i-am-bryan.com/webs/wp-content/uploads/2012/12/Explosion-Sprite-Sheet-300x59.png
die ich gerade auf
http://i-am-bryan.com/webs/tutorials/tutorial-spaceshooter-in-hge-part3/ gefunden habe.
die Seite hätte ich mal eher finden sollen.
ich glaub das was der da in C++ geschrieben hat ist genau das was ich in C# machen möchte.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| void CreateExplosion(hgeVector Position) { explosion exp; exp.Animation = new hgeAnimation(g_tExplosion,5,10,0,0,118,118); exp.Animation->SetHotSpot(59,59); exp.Animation->Play(); exp.Position = Position; Explosions.push_back(exp); hge->Effect_PlayEx(g_eExplosion,100,0,hge->Random_Float(1,3)); } |
leider verstehe ich hier nur Bahnhof.
und zusätzlich gibt's da ja noch den unterschied zwischen Animation
also dem automatischen abspielen aller Einzelbilder und der Selektion
also dem gezielten aussuchen eines Einzelbild.
ich möchte ja beides nach bedarf machen können.
wie würde man das denn mit DrawImage umsetzen?
gibt mir VisualStudio dabei evtl. etwas Hilfe an die Hand,
damit ich nicht alles von Hand proggen muss?
----nachtrag----
wenn ich z. b. mit den Pfeiltasten eine Spielfigur wie in Zelda auf dem Gameboy über meine form bewegen will,
dann muss sie sich ja auch je nach Pfeilrichtung in diese drehen.
ich könnte dafür natürlich vier Einzelgrafiken verwenden aber die müssten dann bei jedem druck neu geladen werden.
eine Sprite-Grafik ist ja schon komplett geladen und wird eben nur teilweise angezeigt.
also wird beim Tastendruck nur ein anderer Ausschnitt gezeigt aber die Grafik an sich ist ja schon da.
so wie z. b. beim Visible schalten eines Button.
oder nicht?
avoid - Di 10.06.14 00:00
wie ich Objekte zur Laufzeit verändere ist klar.
und das laden einer Grafik mit DrawImage auch.
die double buffer Geschichte ist mir auch bekannt.
unklar bleibt weiterhin wie ich nur einen gewissen ausschnitt darstelle
weil es für DrawImage eine unüberschaubare Anzahl an möglichen Überladungen gibt.
---nachtrag---
das hier scheint in die richtige Richtung zu gehen oder?
http://stackoverflow.com/questions/13710261/drawimage-sprite-not-showing-up
auch wenn der Tipp
"override the forms OnPaintMethod to get access to the forms Graphics object"
danach klingt als müsste man erst was verbiegen.
ich kuck es mir morgen mal genauer an, jetzt ist es schon zu spät auf der uhr.
avoid - Do 12.06.14 23:38
perfekt, danke mit dem link hab ich es jetzt auch nachvollziehen können.
avoid - Fr 13.06.14 01:24
Hier mein Code mit dem ich eben etwas rumgespielt habe.
ich habe eine Grafik von der Größe 64 x 768 Pixel als Resource verwendet,
bei der jedes Einzelbild 64 x 64 Pixel groß ist.
da die Grafik nicht von mir war hab ich sie hier jetzt nicht mit hochgeladen
aber ich glaube am Code kann man schon sehen was ich gebaut hab.
Einfach ein neues WinForms Projekt starten,
bei der Form1 die Eigenschaft "DoubleBuffered" auf True stellen damit nix flackert
und den Rest von meinem Code abkucken.
Wie man sehen kann hab ich den Pfeiltasten, Bild-up, Bild-down, + und - Funktionen Zugewiesen.
Spielt einfach mal etwas damit rum ... :)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace test2 { public partial class Form1 : Form { int dRx = 10, dRy = 10, dRw = 64, dRh = 64; int sRx = 0, sRy = 0, sRw = 64, sRh = 64;
public Form1() { InitializeComponent(); }
private void Form1_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Left: dRx = dRx - 2; break;
case Keys.Right: dRx = dRx + 2; break;
case Keys.Up: dRy = dRy - 2; break;
case Keys.Down: dRy = dRy + 2; break;
case Keys.PageUp: if (sRy < 704) { sRy = sRy + sRh; } break;
case Keys.PageDown: if (sRy > 63) { sRy = sRy - sRh; } break;
case Keys.Add: dRw = dRw + 1; dRh = dRh + 1; break;
case Keys.Subtract: dRw = dRw - 1; dRh = dRh - 1; break; } this.Invalidate(); this.Update(); }
private void DrawImageRectRect(object sender, PaintEventArgs e) { Image newImage = global::test2.Properties.Resources.explosion;
Rectangle destRect = new Rectangle(dRx, dRy, dRw, dRh);
Rectangle srcRect = new Rectangle(sRx, sRy, sRw, sRh); GraphicsUnit units = GraphicsUnit.Pixel;
e.Graphics.DrawImage(newImage, destRect, srcRect, units); }
} } |
ich hab mich auch etwas im kommentieren versucht.
sorry falls etwas nicht so verständlich sein sollte. ;)
---nachtrag---
"destRect" funktioniert quasi wie eine Schablone die über der Grafik liegt
"srcRect" hingegen funktioniert wie eine PictureBox in der nur ein bestimmter ausschnitt der Grafik zusehen ist.
zusammen genommen hat man dann alle Funktionen die man braucht weil beide jeweils nur einen teil können.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!