#29 Nonameboy
ok, tak tahle... důvod proč ti to bliká je, že kreslíš na jedno "plátno", který se musí jak aktualizovat tak kreslit ve stejnej čas, tohle se řeší backBufferem - DoubleBuffer, kde se kreslí na jedno a aktualizuje druhý a potom se prohoděj, takže nevzniká blikání (bufferů může být samozřejmě víc)
co se týče toho co jsem psal, tak je dobrý si udělat objekt, kterej bude řešit vše (jak vlastní vykreslení, tak pohyb), takže něco takovýho třeba
public class Block
{
private Form parent;
private Rectangle rect = new Rectangle(0, 0, 50, 50);
public Block(Form parent)
{
this.parent = parent;
this.parent.KeyDown += UpdateKeys;
Speed = 4;
}
public Block(Form parent, int x, int y, int width, int height)
: this(parent)
{
rect = new Rectangle(x, y, width, height);
}
public int Speed { get; set; }
public Rectangle Rectangle
{
get { return rect; }
set { rect = value; }
}
public void Draw(Graphics g)
{
g.FillRectangle(Brushes.Black, rect);
}
private void UpdateKeys(object sender, KeyEventArgs e)
{
bool validKey = true;
switch (e.KeyCode)
{
case Keys.Left:
rect.X -= Speed;
break;
case Keys.Right:
rect.X += Speed;
break;
case Keys.Up:
rect.Y -= Speed;
break;
case Keys.Down:
rect.Y += Speed;
break;
default:
validKey = false;
break;
}
if (validKey)
parent.Invalidate();
}
}
a potom v samotným formu nebude nic jinýho, než toto
public partial class MainForm : Form
{
private Block block;
public MainForm()
{
InitializeComponent();
DoubleBuffered = true; // zapne DoubleBuffer (aby to neblikalo)
block = new Block(this, 100, 100, 50, 50);
}
protected override void OnPaint(PaintEventArgs e)
{
block.Draw(e.Graphics);
}
}
Pokud máš nějaký dotazy ohledně kódu, tak sem napiš