[c#] Pohyb objektu pomoci klaves – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

[c#] Pohyb objektu pomoci klaves – .NET – Fórum – Programujte.com[c#] Pohyb objektu pomoci klaves – .NET – Fórum – Programujte.com

 

xerwin
~ Anonymní uživatel
2 příspěvky
25. 9. 2010   #1
-
0
-

Zdravim, sem v c# zacatecnik ale mam nejake zkusenosti z Delphi.

Snazim se udelat program, ktery po stisknuti napriklad leve klavesy zacne pohybovat doleva.

Zde je zdrojovy kod:

        

private int klavesa;
private Boolean leva;
private void button1_KeyDown(object sender, KeyEventArgs e)
{
klavesa = e.KeyValue;
if (klavesa == 37)
{
button1.Left += 10;
}
}


Po stisknuti leve klavesy se tlacitko neposune. To cislo klavesy jsem si zjistil pomoci jineho programu ktery to vypisoval na obrazovku. Zkousel sem i delat pres Point, ale asi sem to delal spatne.

Hledal sem i ruzne na internetu, ale kazdy priklad byl jiny a nefungoval.

Diky za kazdou pomoc.

Nahlásit jako SPAM
IP: 78.45.21.–
CZechBoY+4
Věrný člen
26. 9. 2010   #2
-
0
-

        private void button1_KeyUp(object sender, KeyEventArgs e)

{
switch (e.KeyCode)
{
case Keys.Left:
this.button1.Left -= 10;
break;
case Keys.Right:
this.button1.Left += 10;
break;
case Keys.Up:
this.button1.Top -= 10;
break;
case Keys.Down:
this.button1.Top += 10;
break;
}
}

Nahlásit jako SPAM
IP: 213.192.10.–
xerwin
~ Anonymní uživatel
2 příspěvky
26. 9. 2010   #3
-
0
-

To CZechBoY : Diky moc, funguje ;)

Nahlásit jako SPAM
IP: 78.45.21.–
CZechBoY+4
Věrný člen
26. 9. 2010   #4
-
0
-

no taky jsem to dělal ve Visual Studiu tak bych se hodně divil kdyby to nešlo :D
eště jsem to testoval, KeyPress nevim proč nešel

Nahlásit jako SPAM
IP: 213.192.10.–
SkyHawk
~ Anonymní uživatel
1 příspěvek
29. 10. 2010   #5
-
0
-

Zdravim. Nedá se něco obdobného aplikovat i na konsolovou aplikaci? :-)..

Nahlásit jako SPAM
IP: 77.48.101.–
CZechBoY+4
Věrný člen
1. 11. 2010   #6
-
0
-

chceš aby se ti pohyboval kurzor v konzoli? :smile6:

Nahlásit jako SPAM
IP: 213.192.10.–
Johnn195
~ Anonymní uživatel
15 příspěvků
20. 4. 2012   #7
-
0
-

Dobrý den, potřeboval bych pomoci s úkolem na programování. Potřebuji, aby když budu mačkat klávesy(nahoru,dolu,doprava,doleva), aby se mi pohyboval čtverec, který jsem si vytvořil v panelu v události paint. Zkoušel jsem kód co je tady na stránce i nějak modifikovat, ale nějak mi to ty proměnné nechce brát a hlásí to chybu.

Nahlásit jako SPAM
IP: 86.61.149.–
Yimo0
Newbie
21. 4. 2012   #8
-
+1
-
Zajímavé

Ahoj, 
zkus to takhle, funguje mi to na 100% x).
 

 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 37)// levo
            {
                x -= 5;
                this.Refresh();
            }
            else if (e.KeyValue == 38) // hore
            {
                y -= 5;
                this.Refresh();
            }
            else if (e.KeyValue == 39) // pravo
            {
                x += 5;
                this.Refresh();
            }
            else if (e.KeyValue == 40) // dolu
            {
                y += 5;
                this.Refresh();
            }
        }
 private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.FillRectangle(Brushes.Bisque, new Rectangle(x,y,50, 50));
        }


Nahlásit jako SPAM
IP: 93.99.204.–
Programator3000GT
~ Anonymní uživatel
2 příspěvky
26. 3. 2013   #9
-
0
-

Hello world, 

Programuju už asi 10 let a jsem profík.. Vaše stránka je zajímavá a chtěl bych vám pomoci v přidávání příspěvků.

Děkuji Programátor3000GT

Nahlásit jako SPAM
IP: 82.209.19.–
Evzen+2
Návštěvník
26. 3. 2013   #10
-
0
-

#9 Programator3000GT
Tak pokud chceš přispívat do fóra, tak není nic jednoduššího než se registrovat a přispívat. 

Pokud máš na mysli příspěvky = články, tak stačilo trochu prolézt tento web.

http://programujte.com/pridej-se/

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
Programator3000GT
~ Anonymní uživatel
2 příspěvky
2. 4. 2013   #11
-
-4
-
Otravné

#10 Evzen
Ano Evžene 

uvědomil jsem si že jste pro mne spodina která programuje uplně jednoduché věci.. 

:D

Nahlásit jako SPAM
IP: 82.209.19.–
Evzen+2
Návštěvník
2. 4. 2013   #12
-
+2
-
Zajímavé

#11 Programator3000GT
Díky za info, aspoň víme na čem jsme.

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
2. 4. 2013   #13
-
-1
-
Mimo téma

#10 Evzen
Ano Evžene 

uvědomil jsem si že jste pro mne spodina která programuje uplně jednoduché věci.. 

:D

Nahlásit jako SPAM
IP: 82.209.19.–
2. 4. 2013   #14
-
-1
-
Mimo téma

Ahoj 

Chtěl jsem se tě zeptat jestli nahodou nevíš jak naprogramovat v c aby se třeba * hybala pomoci klaves 6 doprava 4 doleva 8 nahoru a 2 dolu.

Diky 

Nahlásit jako SPAM
IP: 82.209.19.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
26. 5. 2013   #15
-
0
-

mohu se zeptat jak omezím pohyb O:) ... mám na mysli že když se do stane například do xové souřanice 1000 tak se zastaví a nepude to dál

Nahlásit jako SPAM
IP: 89.176.75.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
26. 5. 2013   #16
-
0
-

ale zas se bude moct vrátit

Nahlásit jako SPAM
IP: 89.176.75.–
Evzen+2
Návštěvník
26. 5. 2013   #17
-
+1
-
Zajímavé

#15 Nonameboy
Použiješ if a budeš kontrolovat zdali nejsi na hranici třeba té tvé tisícovky. Pokus ses mimo, tak to neposunes :-) 

Naprogramovat to určitě zvládneš sám :-) 

Evžen

Nahlásit jako SPAM
IP: 88.101.117.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
27. 5. 2013   #18
-
0
-

no nakonec sem to zvládl to opravdu nebyl takový problém :P ... horší je že už se nemohu vrátit zpět :/

vytvořil sem podmínku která mi přiřadí souřadnici X pokud je >= 1000 právě tuto souřadnici ... ale jak provedu to abych se mohl vrátit :(

Nahlásit jako SPAM
IP: 212.71.185.–
CZechBoY+4
Věrný člen
27. 5. 2013   #19
-
0
-

#18 Nonameboy
jak vrátil?
prostě šipkou doleva ne? :D

Nahlásit jako SPAM
IP: 213.192.10.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
27. 5. 2013   #20
-
0
-

no když tomu  x přiřadim 1000 tak to tak už zůstane :/ a zpátky se to nedostane -_-

Nahlásit jako SPAM
IP: 89.176.75.–
CZechBoY+4
Věrný člen
27. 5. 2013   #21
-
0
-

#20 Nonameboy
tak tam bude asi někde problém :D

pošli kod

Nahlásit jako SPAM
IP: 213.192.10.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
27. 5. 2013   #22
-
0
-

nejspíš jo :3

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication27
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int x, y;

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 37)// levo
            {
                x -= 5;
                this.Refresh();
            }
            else if (e.KeyValue == 38) // hore
            {
                y -= 5;
                this.Refresh();
            }
            else if (e.KeyValue == 39) // pravo
            {
                x += 5;
                this.Refresh();
            }
            else if (e.KeyValue == 40) // dolu
            {
                y += 5;
                this.Refresh();
            }
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.FillEllipse(Brushes.Red, x + 25, y + 25, 50, 50);
            if ((x >= 425) && (y >= 425))
            {
                g.FillEllipse(Brushes.Red, 450, 450, 50, 50);
            }
            else if (x >= 425)
            {

                g.FillEllipse(Brushes.Red, 450, y + 25, 50, 50);
                x += 450;
                if (e.KeyValue == 37)
                {
                    x -= 5;
                    this.Refresh();
                }
            }
            else if (y >= 425)
            {
                g.FillEllipse(Brushes.Red, x + 25, 450, 50, 50);
                y += 450;
            }
        }
    }
}

Nahlásit jako SPAM
IP: 89.176.75.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
27. 5. 2013   #23
-
0
-

v tom Form1_Paint nějak nefunguje :

if (e.KeyValue == 37)
                {
                    x -= 5;
                    this.Refresh();
                }

... rakže to tam být nemá :3

Nahlásit jako SPAM
IP: 89.176.75.–
CZechBoY+4
Věrný člen
28. 5. 2013   #24
-
0
-

#23 Nonameboy
používáš moc magických konstant, vůbec se v tom nevyznám

proč v události paint děláš nějaké divné ověřování kláves? to dělej při události klávesnice ne?

Nahlásit jako SPAM
IP: 213.192.10.–
Evzen+2
Návštěvník
28. 5. 2013   #25
-
0
-

#22 Nonameboy
Ahoj,

jak již bylo zmíněno, používáš moc magických konstant..

Vytvoř si konstanty např UpKey, DownKey, EllipseWidth, EllipseHeight a další..

Budeš to mít přehledně na jednom místě a snadno to pak upravíš.

Dále v reakci na událost OnKeyDown musíš mít ty podmínky, jestli si nepřešel přes tvůj určený okraj, tím pádem budeš mít x nebo y vždy minimálně na 0 a vždy max na 1000 (třeba). Také bych tady nevolal Refresh(), to stačí jednou v Paint metodě (ale nejsem expert přes WinFormy).

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = this.CreateGraphics();
            g.FillEllipse(Brushes.Red, x, y, EllipseWidth, EllipseHeight);
            Refresh(); // tedy jestli je vůbec třeba
        }

Ještě v tom Paintu koukám, že na začátku přičítáš na počátku + 25 k oběma souřadnicím. Tak to nedělej zde, ale udělej to při inicializaci x a y nebo v konstruktoru třídy.

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
28. 5. 2013   #26
-
0
-

teprve začínám O:) ... díky moc  

Nahlásit jako SPAM
IP: 212.71.185.–
ingiraxo+15
Grafoman
28. 5. 2013   #27
-
0
-

Tvůj hlavní problém je, že ti chybí samotná struktůra.. měl by sis udělat speciální objekt, kterým chceš pohybovat, ten by měl třeba rozhraní pro vykreslení a aktualizaci (pohyb)

tohle potom naimplementovat do formu... a proboha, v žádný případě nevolej překreslení ve funkci na vykreslení

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Nonameboy
~ Anonymní uživatel
10 příspěvků
28. 5. 2013   #28
-
0
-

už funguje děkuji moc ;) ... chtěl bych se ještě zeptat jak se dá zabránit tomu blikání když to načítá obrázek :/ nějak mi to furt problikává a nevím jak tomu zabránit

Nahlásit jako SPAM
IP: 212.71.185.–
Nonameboy
~ Anonymní uživatel
10 příspěvků
28. 5. 2013   #29
-
0
-

#27 ingiraxo
aha    ... děkuju   ale nějak nevím jak na to ... mohl bys mi prosím ukázat jak by to mělo vypadat    já si tak trochu už nevím rady   ...prosim prosim  

Nahlásit jako SPAM
IP: 212.71.185.–
ingiraxo+15
Grafoman
28. 5. 2013   #30
-
0
-

#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š

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Nonameboy
~ Anonymní uživatel
10 příspěvků
28. 5. 2013   #31
-
0
-

díky moc    už to šlape jak má :)

Nahlásit jako SPAM
IP: 212.71.185.–
návštěvník
~ Anonymní uživatel
66 příspěvků
2. 6. 2013   #32
-
0
-

Ahoj, jsem tu prvně, takže omluvte, jestli už tu můj problém byl někdy někde řešen. Potřeboval bych návod, jak snímat a ošetřit stisk dvou kláves najednou, kdy každá provádí jinou operaci. A druhá otázka je, jak zamezit prodlevě po stisknutí a přidržení klávesy mezi prvním a druhým opakováním? Dík za případnou pomoc :).

Nahlásit jako SPAM
IP: 93.91.150.–
CZechBoY+4
Věrný člen
2. 6. 2013   #33
-
0
-

#32 návštěvník
založ si svoje téma a nepleť se do jinýho

Nahlásit jako SPAM
IP: 213.192.10.–
návštěvník
~ Anonymní uživatel
66 příspěvků
9. 6. 2013   #34
-
0
-

#33 CZechBoY
...že mě to samotného nenapadlo. Dík :)

Nahlásit jako SPAM
IP: 93.91.150.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 25 hostů

Podobná vlákna

Ovládáni Form pomocí kláves — založil tipetka

Pohyb objektu v Bitmapě — založil Mutagen

Animace - pohyb objektu — založil Pavel

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý