Я работаю над программой, в которой я хочу переместить персонаж, состоящий из нескольких фигур (прямоугольник, круг, точка), но когда символ перемещается, он мерцает.C# Мерцание при перемещении объекта с несколькими формами
Я пробовал несколько решений, таких как изменение DoubleBuffered, SetStyle, но они не работают, и я не знаю, как это сделать.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Carrosse
{
public partial class EcranAccueil : Form
{
private Capitaine cptHaddock;
private BufferedGraphics bufferG = null;
private Graphics g;
public EcranAccueil()
{
InitializeComponent();
// Modification contre le scintillement - Creation d'une mémoire tampon graphique
bufferG = BufferedGraphicsManager.Current.Allocate(TV.CreateGraphics(), TV.DisplayRectangle);
g = bufferG.Graphics;
}
private void btnCreercptHaddock_Click(object sender, EventArgs e)
{
this.cptHaddock = new Capitaine(this.TV, 50, 80, 60, 20);
this.cptHaddock.Pot = Color.Blue;
this.cptHaddock.Afficher(this.TV.Handle);
this.btnMarcherSimple.Enabled = true;
this.btnChangerRapidite.Enabled = true;
this.btnMarcherContinu.Enabled = true;
}
private void btnMarcherSimple_Click(object sender, EventArgs e)
{
this.cptHaddock.AvancerDroit(this.TV.Handle, this.timerImage, 16, 0);
this.cptHaddock.AvancerGauche(this.TV.Handle, this.timerImage, 16, 0);
}
private void btnChangerRapidite_Click(object sender, EventArgs e)
{
try
{
this.timerImage.Interval = Int32.Parse(tbRapidite.Text);
}
catch (Exception)
{
tbRapidite.Text = "Valeur non valide !";
}
}
private void btnMarcherContinu_Click(object sender, EventArgs e)
{
for (int i = 0; i < 4; i++)
{
this.cptHaddock.AvancerDroit(this.TV.Handle, this.timerImage, 16, 0);
this.cptHaddock.AvancerGauche(this.TV.Handle, this.timerImage, 16, 0);
}
}
}
}
Кнопка btnCreercptHaddock создает символ. Кнопки btnMarcherSimple и btnMarcherContinu перемещают символ. Кнопка изменяет скорость символа с помощью таймера с помощью ввода.
Я могу предоставить другие части моей программы, но у меня есть что-то вроде 10 классов.
PS: Я студент, и я изучаю C#, поэтому мой код, возможно, не оптимизирован, поэтому, если у вас есть комментарии или советы, я был бы рад их услышать.
EDIT: GIF анимации: https://i.gyazo.com/68ded3fba8fddbf281a424bbb523f2d2.gif (Все мерцает не отображаются в формате GIF, но они появляются в течение всего анимации)
Согласно [этому сообщению] (http://blogs.msdn.com/b/jeremykuhne/archive/2005/09/08/462344.aspx) с помощью 'BufferedGraphicsManager 'на самом деле не очень хорошая идея, если вы можете включить doublebuffered самостоятельно или использовать элемент управления, который по умолчанию является двойным буфером. 'PictureBox' __is__ и использовать его, вероятно, в любом случае. – TaW
Я использую PictureBox. Телевизор - это изображение. Об управлении, я никогда не использую это раньше, и я действительно не понимаю его цели. – DoctorHouse
Итак, двойной буферизатор, который встроен и один из BufferedGraphicsManager, оба являются dong одинаковыми ..? Я считаю, что нужно использовать только один; если это так, переписывание без BufferedGraphicsManager, используя только событие Paint, и его объект e.Graphics может помочь, но я никогда не использовал BufferedGraphicsManager сам. – TaW