Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#] hertekenen van picturebox

Pagina: 1
Acties:

  • WernerL
  • Registratie: December 2006
  • Laatst online: 07:29
Hallo mensen,

Ik ben weer overnieuw begonnen met een game. DItmaal breakout voor school. :-)
Ik heb nu het advies uit mijn vorige topic gebruikt en heb nu 1 picturebox waar alles op getekend wordt.

Mijn classes: (ze zijn niet groot atm)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public partial class Form1 : Form
    {
        public pad test = new pad(10, 10);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pb_game.Paint += new PaintEventHandler(pb_game_Paint);
        }

        void pb_game_Paint(object sender, PaintEventArgs e)
        {
            test.moveRight();
            test.Draw(pb_game.CreateGraphics());
            
            
            pb_game.Invalidate();
        }
    }


En de class pad:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public class pad : gameObject
    {
        private int xPos, yPos;

        public pad(int x, int y)
        {
            xPos = x;
            yPos = y;
            Position = new Point(x, y);
        }

        public override void Draw(Graphics g)
        {
            g.FillEllipse(Brushes.Red, new Rectangle(Position.X, Position.Y, 20, 20));
        }

        public void moveRight()
        {
            xPos++;
            Position = new Point(xPos, yPos);
        }
    }


Dit werkt, de rode stil beweegt naar rechts... maar NIET vloeiend. :( Hij verdwijnt en komt weer terug.. op die manier. Hij blijft dus niet in beeld. Dit komt waarschijnlijk door het vele malen hertekenen van mijn picturebox.
Ik krijg dit op geen enkele wijze opgelost. Heb al double buffering op het formulier aangezet (picturebox zelf kent deze optie niet). Maar weet iemand hier toevallig waar dat door komt ?

Alvast bedankt.

[ Voor 5% gewijzigd door WernerL op 03-10-2008 12:31 ]

Roses are red, violets are blue, unexpected '{' on line 32.


  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

tekenen op een bitmap
en pas als alles getekend is voor een frame, deze naar de picturebox sturen
en dan opnieuw beginnen met al je wijzigingen te tekenen?
code:
1
2
3
4
Bitmap b = new Bitmap(100, 100);
Graphics g = Graphics.fromBitmap(b);
g.Draw...
picturebox.image = b;

(niet dat ik spelletjes teken, maar zo zou het niet teveel mogen flikkeren)
zoek ook eens met doublebuffered

[ Voor 43% gewijzigd door ? ? op 03-10-2008 15:24 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
WernerL schreef op vrijdag 03 oktober 2008 @ 12:30:
C#:
18
            test.Draw(pb_game.CreateGraphics());
Wat zou dat doen? Waarvoor heb je variabele e gekregen?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • WernerL
  • Registratie: December 2006
  • Laatst online: 07:29
Ja inderdaad pedorus.. :D
Vanmiddag vergeten een update te geven hier. e.graphics was stukken logischer en guess what ? het werkte ook nog..
era.zer schreef op vrijdag 03 oktober 2008 @ 15:21:
tekenen op een bitmap
en pas als alles getekend is voor een frame, deze naar de picturebox sturen
en dan opnieuw beginnen met al je wijzigingen te tekenen?
code:
1
2
3
4
Bitmap b = new Bitmap(100, 100);
Graphics g = Graphics.fromBitmap(b);
g.Draw...
picturebox.image = b;

(niet dat ik spelletjes teken, maar zo zou het niet teveel mogen flikkeren)
zoek ook eens met doublebuffered
In zekere zin gebeurd dit atm zo. Pas bij de regel pb_game.Invalidate() wordt heel de picturebox geupdate. :-)

[ Voor 69% gewijzigd door WernerL op 03-10-2008 22:10 ]

Roses are red, violets are blue, unexpected '{' on line 32.


  • HawVer
  • Registratie: Februari 2002
  • Laatst online: 15-11 12:06
era.zer schreef op vrijdag 03 oktober 2008 @ 15:21:
tekenen op een bitmap
en pas als alles getekend is voor een frame, deze naar de picturebox sturen
en dan opnieuw beginnen met al je wijzigingen te tekenen?
code:
1
2
3
4
Bitmap b = new Bitmap(100, 100);
Graphics g = Graphics.fromBitmap(b);
g.Draw...
picturebox.image = b;

(niet dat ik spelletjes teken, maar zo zou het niet teveel mogen flikkeren)
zoek ook eens met doublebuffered
Wat je hier vertelt is double buffering. Dat zou je ook door windows zelf kunnen laten doen.

@WernerL

Wat pedorus zeg is helemaal waar. Je krijg niet voor niks een graphics object aangereikt. Het object vervolgens zelf nog een keer creeren is een performance probleem.

Daarnaast een invalidate methode aanroepen zorgt voor een paint event. Maw je creeert daar een oneindige loop. Ook dat is niet echt een geweldig schone oplossing. Als je voor een gemakkelijke oplossing wil gaan gebruik dan het timer component.

Waar je ook nog op moet letten is dat de achtergrond kleur van je picturebox op transparant staat. Bij transparant gaat hij op zoek naar de parent van het huidige component en gaat dan de overlappende delen nog een keer voor je tekenen. Dit 'dubbele tekenen' heeft ook een negatieve invloed op de performance.

http://hawvie.deviantart.com/