Diskuze: Sekání pohybu u obrázku

C# .NET .NET (C# a Visual Basic) Sekání pohybu u obrázku American English version English version

Aktivity (1)
Avatar
D0ll0k
Člen
Avatar
D0ll0k:1.2.2015 18:03

Ahojte :D. Chtěl bych se zeptat někoho, jestli neví, proč, když chci hýbat s obrázkem, tak se mi na začátku sekne (asi půl vteřiny) a pak běží zase normálně.
Kód:

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            int x = pictureBox1.Location.X;
            int y = pictureBox1.Location.Y;

            if (e.KeyCode == Keys.Right) x += 5;
            else if (e.KeyCode == Keys.Left) x -= 5;
            else if (e.KeyCode == Keys.Up) y -= 5;
            else if (e.KeyCode == Keys.Down) y += 5;
            else if (e.KeyCode == Keys.Space)
            {
                for (int i = 0; i <= 35; i++)
                {
                    Thread.Sleep(50);
                    y -= 1;
                    pictureBox1.Location = new Point(x, y);
                }
                for (int i = 0; i <= 50; i++)
                {
                    Thread.Sleep(50);
                    y += 1;
                    pictureBox1.Location = new Point(x, y);
                }
            }

            pictureBox1.Location = new Point(x, y);
        }
Odpovědět 1.2.2015 18:03
Ten, co se snaží "programovat"
Avatar
Odpovídá na D0ll0k
sadlomaslox25:1.2.2015 18:15

popis presneji. pri stisku jake klavesy se sekne ? co znamena nazacatku sekne a pak bezi normalne ?

tohle nikdy nedelej
private void Form1_KeyDown(ob­ject sender, KeyEventArgs e)
{ ...
for (int i = 0; i <= 35; i++)
{
Thread.Sleep(50);

nikdy nevolej na hlavnim GUI vlakne metodu sleep. spust to v jinem vlakne ktere bude komunikovat s GUI pomoci Dispatcheru.
neco jako tady tohle (ten priklad je docela naho.. ale vystihuje tu pointu xD) http://www.beingdeveloper.com/…pplications/

 
Nahoru Odpovědět  +1 1.2.2015 18:15
Avatar
D0ll0k
Člen
Avatar
Odpovídá na sadlomaslox25
D0ll0k:1.2.2015 19:53

Když držím třeba šipku doprava, tak se obrázek pohne, pak se na chvíli zastaví a pak se normálně plynule pohybuje.

Nahoru Odpovědět 1.2.2015 19:53
Ten, co se snaží "programovat"
Avatar
Odpovídá na D0ll0k
Michael Škrášek:1.2.2015 20:24

Udělal bych to na vykreslování a ne přes posouvání. Udělal jsem to přes timer. ;)

private bool up, left, right, down;
private int x = 0, y = 0;
private int sirka = 20, vyska = 20;
private Image image = Image.FromFile("cesta");

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    Keys key = e.KeyCode;
    if (key == Keys.Right) right = true;
    else if (key == Keys.Left) left = true;
    else if (key == Keys.Up) up = true;
    else if (key == Keys.Down) down = true;
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    Keys key = e.KeyCode;
    if (key == Keys.Right) right = false;
    else if (key == Keys.Left) left = false;
    else if (key == Keys.Up) up = false;
    else if (key == Keys.Down) down = false;
}

private void timer1_Tick(object sender, EventArgs e)
{
    clear();
    if (right) x += 1;
    else if (left) x -= 1;
    else if (up) y -= 1;
    else if (down) y += 1;

    vykresli();
}

private void vykresli()
{
    Graphics gr = pictureBox1.CreateGraphics();
    gr.DrawImage(image, x * sirka, y * vyska, sirka, vyska);
}

private void clear()
{
    Graphics gr = pictureBox1.CreateGraphics();
    gr.FillRectangle(Brushes.White, x * sirka, y * vyska, sirka, vyska);
}

private void Form1_Load(object sender, EventArgs e)
{
    timer1.Start();
}

timer nech na 100 milisekundách, případně uprav

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 1.2.2015 20:24
Proč to dělat složitě, když to jde jednoduše.
Avatar
Odpovídá na D0ll0k
sadlomaslox25:1.2.2015 20:45

sekne se to protoze ve winformech se event KeyDown vyvolava opakovane pokud je stisknuta a drzena klavesa. kopiruje to chovani systemu napr. kdyz pises ve wordu tak kdyz zmacknes A tak ti to napise A, pak to chvili ceka a pak to zacne psat ty A rychle po sobe. reseni je implementovat si vlastni rizeni stisknuti klavesy. napr.

private HashSet<Keys> pressedKeys = new HashSet<Keys>();
public Form1()
{
    InitializeComponent();
    var timer = new Timer();
    timer.Interval = 10;
    timer.Tick += (a, b) =>
    {
        if(pressedKeys.Contains(Keys.Left))
            pictureBox1.Location = pictureBox1.Location + new Size(0, 1);
        if (pressedKeys.Contains(Keys.Right))
            pictureBox1.Location = pictureBox1.Location + new Size(0, -1);

    };
    timer.Start();

}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    pressedKeys.Add(e.KeyData);
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    pressedKeys.Remove(e.KeyData);
}
 
Nahoru Odpovědět 1.2.2015 20:45
Avatar
D0ll0k
Člen
Avatar
Odpovídá na sadlomaslox25
D0ll0k:1.2.2015 21:08

Díky :) funguje to, ale v kódu, který jsi napsal, úplně všemu nerozumím, tak se budu raději držet vykreslování, co napsal Škrášek Michal. Jinak s tím mačkáním kláves ve wordu máš pravdu. Je to úplně to samé, co se mi stalo.

Editováno 1.2.2015 21:09
Nahoru Odpovědět 1.2.2015 21:08
Ten, co se snaží "programovat"
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.