Autor Beitrag
avoid
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: So 08.06.14 11:33 
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

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4392
Erhaltene Danke: 944

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: Mo 09.06.14 12:23 
unter Sprite-Grafik verstehe ich eine Datei wie z. b. diese
i-am-bryan.com/webs/...ite-Sheet-300x59.png
die ich gerade auf i-am-bryan.com/webs/...hooter-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.

ausblenden 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?

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4392
Erhaltene Danke: 944

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: Mo 09.06.14 12:45 
Hallo,

HGE ist ja eine spezielle Grafik-Library für C++, d.h. dort wurde explizit eine Animationsklasse implementiert (die eben so ein Multi-Sprite Image lesen und verarbeiten kann).

Für WinForms wüsste ich jetzt keine explizite Library (aber du willst es ja auch explizit nur mit den .NET Standard-Libraries lösen).
Und dann müsstest du es halt mit den Standardmitteln lösen, d.h. für eine Animation selber einen Timer einsetzen.

Ich hatte schon mal ein paar ähnliche Beiträge zum Thema "Zeichnen in WinForms" hier verfasst:
Bewegung eines Panels
Hintergrundbild in Spiel? (lies dir auch mal die verlinkten Artikel durch)
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: 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?
stackoverflow.com/qu...prite-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.

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4392
Erhaltene Danke: 944

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: Di 10.06.14 10:26 
Hallo avoid,

die OnPaint-Methode ist schon der genau richtige Weg (für abgeleitete Controls bzw. Forms). Bei einem Panel aber z.B. hat man ja von außen keinen Zugriff auf die protected-Methoden, daher benutzt man dann stattdessen das Paint-Ereignis.

Und bei DrawImage kannst du einfach das Quell- (als auch Ziel-) Rechteck angeben, z.B. mit Graphics.DrawImage-Methode (Image, Rectangle, Rectangle, GraphicsUnit)

Sind doch nur 30 Überladungen ;-)

Für diesen Beitrag haben gedankt: avoid
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: Do 12.06.14 23:38 
perfekt, danke mit dem link hab ich es jetzt auch nachvollziehen können.

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: 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 ... :)

ausblenden volle Höhe 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)
            {
                // Pos Change
                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;

                // Pic Change
                case Keys.PageUp:
                    if (sRy < 704)
                    {
                        sRy = sRy + sRh;
                    }
                    break;

                case Keys.PageDown:
                    if (sRy > 63)
                    {
                        sRy = sRy - sRh;
                    }
                    break;

                // Zoom
                case Keys.Add:
                    dRw = dRw + 1;
                    dRh = dRh + 1;
                    break;

                case Keys.Subtract:
                    dRw = dRw - 1;
                    dRh = dRh - 1;
                    break;
            }
            this.Invalidate();  // request a delayed Repaint by the normal MessageLoop system    
            this.Update();      // forces Repaint of invalidated area 
        }


        private void DrawImageRectRect(object sender, PaintEventArgs e)
        {
            // Lade Grafik
            //// Image newImage = Image.FromFile("dateiname.jpg");
            Image newImage = global::test2.Properties.Resources.explosion;

            // Erstelle Rechteckkontainer zur Grafikanzeige.
            //// Die Position (x,y) bestimmt die Position des Bildes auf der Form.
            //// (width,height) bestimmen die Größe der Darstellung.
            Rectangle destRect = new Rectangle(dRx, dRy, dRw, dRh); 

            // Anzuzeigender Teil der Grafik
            //// Die Position (x,y und w,h) bestimmt den tatsächlich gezeigten Ausschnitt der original Grafik.
            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.

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke