[C#] Hoe alleen redraw doen van bewogen graphics

Pagina: 1
Acties:

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 05-05 10:44
Beetje vage topictitel ben ik bang, maar hier is het probleem:

Ik ben bezig met een spelletje te maken waarin een slang door een doolhof beweegt, even simpel gesteld. De slang bestaat uit een array van rectangles, zodat ik elk deel van de slang afzonderlijk op het scherm kan tekenen. Dit is makkelijk als de slang de bocht om gaat.

Verder heb ik een timer. Bij elke tik van de timer beweegt de slang een bepaalde richting op.
Bij elke tik van de timer doe ik momenteel het hele doolhof + achtergrond + slang opnieuw tekenen. Alhoewel dit allemaal prima werkt is het steeds opnieuw tekenen van het doolhof + achtergrond plaatje bij elke tik niet gewenst. Ik wil alleen de slang opnieuw tekenen door alle onderdelen van de slang bv 1 hokje verder naar links te tekenen, waarbij ook het puntje van de staart 1 hokje naar links gaat en de oude positie van de staart gewist moet worden. (zie plaatje)

Afbeeldingslocatie: http://img262.echo.cx/img262/6231/snake1os.gif

Probleem is dat ik geen flauw benul heb hoe ik dit aan moet pakken. Als ik het gele hokje wil wissen, wil ik hier weer de achtergrond zien. Uiteraard heb ik google gebruikt, maar niks bruikbaars kunnen vinden.

Hier de relevante code:

code:
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
public class Board : System.Windows.Forms.Form
{
    private PictureBox screen;
    private Bitmap img;
    private Graphics g;

    public Board()
    {
        InitializeComponent();
        screen = new PictureBox();
        screen.Size = new System.Drawing.Size(620, 545);
        Controls.AddRange(new Control[] {screen});
        img = new Bitmap(620, 545);
        g = Graphics.FromImage(img);
        Render();
    }

    private void Render() 
    {
        g.DrawImage(level.Draw(620, 520), 0, 0); // Draw background image + level

        g.DrawImage(snake.GetHeadImage(), snake.body[0].X,snake.body[0].Y); // draw head
        for (int i = 1; i < snake.getLength() - 1; i++)  // draw bodyparts
            g.DrawImage(snake.GetBodyImage(i), snake.body[i].X,
                snake.body[i].Y);
        g.DrawImage(snake.GetTailImage(),snake.body[snake.getLength()-1].X,
            snake.body[snake.getLength() - 1].Y); // draw tail

        screen.Image = img;
    }

    private void OnTimer(object sender, EventArgs e) 
    {
        snake.MoveBody();
        Render();
    }
}


Iemand een idee hoe ik dit kan aanpakken? Ik zat zelf te denken om de slang op een transparente 'layer' te tekenen, maar ik heb geen manier kunnen vinden om dit mogelijk te maken in C#.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Sla je achtergrond als los graphics object op. Kopier de achtergrond eenmalig volledig naar het speelveld. Zet hier de slang op en als de slang beweegt kopieer dan het stuk waar de slang stond vanuit je achtergrond terug naar het speelveld
Dit is in het 2d gebeuren een redelijk bekende techniek. Ik kan me dan ook niet echt voorstellen dat je helemaal niks hebt kunnen vinden?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 05-05 10:44
Bedankt voor de bruikbare tip. Hier kan ik wel mee uit de voeten.

Heeft die techniek die je noemt ook een naam? Dan kan ik me daar wat in verdiepen. Ik heb verder weinig verstand van de 2d teken technieken.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
offtopic:

waarom doe je eigenlijk
code:
1
Controls.AddRange(new Control[] {screen});

je kan ook gewoon
code:
1
Controls.Add( screen );

doen. De methedoe die jij gebruikt is vooral handig als je al een Collection van Controls hebt die je ergens aan toe wilt voegen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 05-05 10:44
Je hebt gelijk. In een vorige opzet van het spelletje werkte ik met 2 screens; 1 voor het speelveld en 1 voor het 'scorepanel'. Het tweede screen had ik uit de array verwijderd omdat ik van het scorepanel af wou, maar ik ben blijkbaar vergeten om de methode te wijzigen in Add ipv AddRange. Slordigheidje. :)

Verwijderd

Een website waar je wel aardige ideeen kan opdoen voor gamedevelopment:

http://www.allegro.cc

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Jabbah schreef op woensdag 08 juni 2005 @ 09:00:
Heeft die techniek die je noemt ook een naam? Dan kan ik me daar wat in verdiepen. Ik heb verder weinig verstand van de 2d teken technieken.
Dat wordt 'blitten' genoemd. Het plaatje wat je op de 'achtergrond; tekent is eigenlijk je 'backbuffer'.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1