Laden...

Gefülltes Rectangle wieder "löschen"

Erstellt von animet vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.182 Views
Thema geschlossen
A
animet Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren
Gefülltes Rectangle wieder "löschen"

Hey Leutz, ich hab vor kurzem mit der Programmierung in C# .Net angefangen. Im Moment arbeite
ich an einer Art kleinem 2D Spiel. Ich hab da nur ein kleines Problem und zwar hab ich mir folgendes
Modell überlegt: Ich hab den Hintergrund in der PictureBox und mein "Raumschiff" bewegt sich da
mittels WASD Steuerung über den Hintergrund indem ich immer wieder ein neues Rectangle erstelle.
Meine Frage ist nun, wie kann ich das alte löschen ^^ Ich habs schon mit nem transparenten Bild
versucht, aber das malt nur drüber...


        Rectangle Rec1;
        Pen Stift = new Pen(Color.Red, 0.1f);
        Graphics g;
        TextureBrush tBrush = new TextureBrush(Image.FromFile("rocket.PNG"));
        TextureBrush tBEmpty = new TextureBrush(Image.FromFile("empty.PNG"));
        private void button1_Click(object sender, EventArgs e)
        {
            g = pictureBox1.CreateGraphics();
            /*
            Bitmap Raumschiff = new Bitmap("rocket.PNG");
            Raumschiff.MakeTransparent();
            Image iRaum = Image.FromHbitmap(Raumschiff.GetHbitmap());
            g.DrawImage(iRaum, 60, 0);
            */

            
            Rec1 = new Rectangle(0, 0, 60, 61);
            g.FillRectangle(tBrush, Rec1);
            g.DrawRectangle(Stift, Rec1);
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.W)
            {
                Rec1.Y -= 61;
                g.FillRectangle(tBrush, Rec1);
                MessageBox.Show("Oben wurde gedrückt!");

            }
            else if (e.KeyData == Keys.S)
            {
                //g.FillRectangle(tBEmpty, Rec1);
                Rec1.Y += 61;
                g.FillRectangle(tBrush, Rec1);
                MessageBox.Show("Unten wurde gedrückt!");
            }
            else if (e.KeyData == Keys.D)
            {
                g.FillRectangle(tBEmpty, Rec1);
                Rec1.X += 60;
                g.FillRectangle(tBrush, Rec1);

                MessageBox.Show("Rechts wurde gedrückt!");
            }
            else if (e.KeyData == Keys.A)
            {
                Rec1.X -= 60;
                g.FillRectangle(tBrush, Rec1);
                MessageBox.Show("Links wurde gedrückt!");
            }
        }

Ich hoffe ihr könnt mir da weiterhelfen 😃

C
1.214 Beiträge seit 2006
vor 11 Jahren

Du musst das Bild komplett überschreiben, also den Hintergrund wieder drüberzeichnen und dann deine Objekte an der neuen Position.

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo und willkommen im Forum,

selber ein Graphics-Objekt zu erstellen ist keine gute Idee.

Wenn Du PictureBoxen verwenden willst, benutze lieber Graphics.FromImage mit dem Image der PictureBox.

Du kannst aber auch ohne PictureBox direkt ins Fenster zeichnen. Dann rufst Du zum neuzeichnen Invalidate() auf und zeichnest dann im OnPaint - da bekommst Du ein Graphics-Objekt in den EventArgs übergeben. Der Aufruf von Invalidate löst das Paint-Ereignis aus und erklärt den Zeichenbereich für ungültig, dann zeichnest Du das gesamte aktuelle Bild neu.
Ein Beispiel dafür findest Du in diesem Beitrag: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch

Lies zu dieser Thematik bitte unbedingt auch [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo animet,

Du kannst aber auch ohne PictureBox direkt ins Fenster zeichnen.

... und solltest das auch tun, die Variante mit Graphics.FromImage eignet sich nicht für ständig wechselnde Bildinhalte. Mal abgesehen davon, dass man auch dort Invalidate aufrufen muss, damit die Änderungen sichtbar werden. Anderseits braucht man eine PictureBox nur, wenn man auch tatsächlich PictureBox.Image verwendet. Wenn man das nicht tut, nimmt man besser ein Panel oder zeichnet direkt in das Form.

Lies zu dieser Thematik bitte unbedingt auch
>

Wobei wir hier voraussetzen, dass man sich von sich von aus solche Tutorial sucht und durcharbeitet, bevor man fragt, siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1.

herbivore

Thema geschlossen