Diskuze: Pohyb obrázku
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 50 zpráv z 56.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Místo 60ti metod ButtonClick udělej jednu a podle mapy přičti podle senderu.
private Dictionary<string, int[]> map = new Dictionary<string, int[]>()
{
{"name1", new int[] { 0, 1 }},
{"name2", new int[] { 0, -1 }},
{"name3", new int[] { 1, 0 }},
{"name4", new int[] { -1, 0 }}
}
private void button1_Click(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
x += map[name][0];
y += map[name][1];
tady musíš mít vykreslení, jinak se ti nic neposune...
}
Nebo použij slovník akcí - což asi nemá smysl - když nevíš o co go.
V using ti stačí asi 3 řádky.
private Dictionary<string, int[]> map = new Dictionary<string, int[]>()
{
{ "name1", new int[] { 0, 1 }},
{ "name2", new int[] { 0, -1 }},
{ "name3", new int[] { 1, 0 }},
{ "name4", new int[] { -1, 0 }}
}
private int x = 200, y = 150;
Bitmap obrazek;
private void MoveClick(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
x += map[name][0];
y += map[name][1];
e.Graphics.DrawImage(obrazek, x , y, 36, 50);
}
Proč nepoužiješ PictureBox?
EDIT:
4 tlačítka ano - ale ať volají metodu MoveClick v eventu Click... Jednotlivé hodnoty přičtení se dozvíš dosazením jména Controlu do slovníku. V slovníku tedy přepiš nameX za skutečné názvy tlačítek... (Místo konverze do Control můžeš dát rovnou Name...)
nejjednodussi reseni je udelat si panel a v nem se bude ten panacek pohybovat
a panel budes po kazdem stisknuti tlacitka obnovovat. 
ukazka:
private void tlacitko_Click(object sender, EventArgs e)
{
y--;
panel.Refresh();
}
Ale on nechce měnit jen y... Ať vše směřuje do jedné metody - v ní bude znovu vykreslení - před tím se v mapě najdou příslušné hodnoty operandů...
udelal jsem ukazku pro jedno tlacitko. Pokud jsem spravne cetl tak chce proste udelat nejaky obrazek pohybujici se pomoci 4 sipek(4 ruznych tlacitek).
aha, takže jestli to chápu dobře, udělám jen jednu metodu MoveClick a k tomu tu metodu private Dictionary<string, int[]> map = new Dictionary<string, int[]>(). Místo name1 až name4 nahradím názvy tlačítek..a vykreslovat mám do toho pictureboxu nebo přímo na formulář? S pictureboxem jsem ještě nedělal a ani v tomhle případě nemůžu, v zadání mám kreslení na formulář
Ano - ale ty jsi dal y do solo metody... Jak jsem psal - ať volá jednu celistvou - a ať se dělí podle odesílatele. Také bych udělal pohyb v KeyDown eventu - pomocí kurzorových kláves...
Ne tak úplně. map není metoda, ale proměnná. A musíš jít do návrhové části, tam dej všem tlačítkům do Click eventu metodu MoveClick.
A pak jak už jsem poslal:
private Dictionary<string, int[]> map = new Dictionary<string, int[]>()
{
{ "name1", new int[] { 0, 1 }},
{ "name2", new int[] { 0, -1 }},
{ "name3", new int[] { 1, 0 }},
{ "name4", new int[] { -1, 0 }}
}
private int x = 200, y = 150;
Bitmap obrazek;
private void MoveClick(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
x += map[name][0];
y += map[name][1];
//zde vykresli
}
Nedavno jsem takto delal jeden uplne stejny program a behal skvele 
No co, ale stejne ta tvoje metoda je lepsi. Ta moje je o chlup jednodussi na
pochopeni. Ale s tou tvou zase dostane treba lepsi znamku 
Tak z logiky je lepší volat jednu metodu, když se to týká jedné věci.
(A o přehlednosti nemluvě.) Jak jsem psal ať použije PictureBox a mění
padding - pak smaže x a y proměnné - a bude to pěkně objektové... 
(Mapu bych také strčil pryč do objektu, kterého se to týká.)
PictureBox.Padding = new Padding(10, 10, 10, 10);
PictureBox. Zbav se tedy Bitmapy - vem nový PictureBox a zavolej Load - či tak nějak. Smaž X a Y. Pak jen nastavuj Padding - jak jsem ti poslal:
pb.Padding = new Padding(dd, dd, 0, 0);
Ke starým hodnotám přičítej hodnoty získané z mapy...
Časem PictureBox zděď a dej mu tam tu mapu - tím to bude dokonale
objektové... 
private Dictionary<string, int[]> map = new Dictionary<string, int[]>()
{
{ "name1", new int[] { 0, 1 }},
{ "name2", new int[] { 0, -1 }},
{ "name3", new int[] { 1, 0 }},
{ "name4", new int[] { -1, 0 }}
}
private void MoveClick(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
imageContent.Padding = new Padding(imageContent.Padding.Left + map[name][0], imageContent.Padding.Top + map[name][1], 0, 0);
}
PictureBox, který si přidáš v návrhové části - jméno je na tobě -
já jen tak... 
Být tebou, dal bych to spíše do KeyDown - jak jsem psal - podle šipek - než podle tlačítek - tlačítka jedině jako sekundární ovládání...
Jak vidíš, nepotřebuji x, y ani Bitmapu. Obrázek nastav rovnou v návrhové části...
A promaž ty usingy.
Dobře..Předělal sem to tak jak sem to pochopil
ale nějak to pořád
nefunguje.
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 WindowsFormsApplication18
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Dictionary<string, int[]> map = new Dictionary<string, int[]>()
{
{ "button1", new int[] { 0, 1 }},
{ "button2", new int[] { 0, -1 }},
{ "button3", new int[] { 1, 0 }},
{ "button4", new int[] { -1, 0 }}
};
private void MoveClick(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
imageContent.Padding = new Padding(imageContent.Padding.Left + map[name][0], imageContent.Padding.Top + map[name][1], 0, 0);
}
}
}
using System;
using System.Windows.Forms;
using System.Collections.Generic;
namespace WorkWithImage //smysluplný název namespace - nastav jako primární pro tvou aplikaci
{
public partial class Form1 : Form
{
private Dictionary<string, int[]> map = new Dictionary<string, int[]>()
{
{ "button1", new int[] { 0, 1 }},
{ "button2", new int[] { 0, -1 }},
{ "button3", new int[] { 1, 0 }},
{ "button4", new int[] { -1, 0 }}
}; //fuj - zvol lepší názvy - jako třeba "buttonUp"
public Form1()
{
InitializeComponent();
}
private void MoveClick(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
imageContent.Padding = new Padding(imageContent.Padding.Left + map[name][0], imageContent.Padding.Top + map[name][1], 0, 0);
}
}
}
Popiš problém - nejsem pes... 
V eventu nastav tu metodu... (V návrhové části v sekci Properties klikni na blesk a do pole vedle Click zadej: MoveClick)
Všem tlačítkům...
Jak máš velikosti, dockování a tak? Dej do té metody MessageBox a tak otestuj, zda je volána...
private void MoveClick(object sender, EventArgs e)
{
string name = ((Control)sender).Name;
imageContent.Padding = new Padding(imageContent.Padding.Left + map[name][0], imageContent.Padding.Top + map[name][1], 0, 0);
imageContent.Refresh();
}
Předělání MoveClick:
private void MoveClick(object sender, EventArgs e)
{
MoveWithImage(((Control)sender).Name);
}
private void MoveWithImage(string name)
{
imageContent.Padding = new Padding(imageContent.Padding.Left + map[name][0], imageContent.Padding.Top + map[name][1], 0, 0);
imageContent.Refresh();
}
A mapu rozšiř o Key.Up/Left/Down/Right...
Proc to dělat jednoduše, dyž to jde složitě... Zase ho tu učíš něco čemu pořádně ani nerozumí... On to měl vlastně zezačátku dobře. Stačilo přidat refresh a bylo by to. Je pravda, že s jednou akcí je to jednodušší, ale stejně . Když tomu nerozumí, tak proč mu jen nepředělat tu jeho verzi.
Myslím, že jemu může být úplně jedno jestli je to objektové nebo ne. Promiň jestli se pletu, ale myslím, že ani neví co to znamená.
On tam měl OnPaint - žádný PictureBox - takže opravdu jsem to udělal strašně složitě - a on to vůbec nechápe...
To je v pohodě, ale zacházet tady až ke slovníkům, vlastním metodám a senderům ... to myslím, že už tam být nemuselo. Ale je to na něm.
stím sem počítal, ale mám problém, že mi událost formuláře KeyDown
při stisku klávesy vůbec nic nedělá
zdroják stisku klávesy mám takový
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.A) || (e.KeyCode == Keys.Left))
{
x = x - 4;
Refresh();
}
if ((e.KeyCode == Keys.D) || (e.KeyCode == Keys.Right))
{
x = x + 4;
Refresh();
}
if ((e.KeyCode == Keys.W) || (e.KeyCode == Keys.Up))
{
y = y - 4;
Refresh();
}
if ((e.KeyCode == Keys.S) || (e.KeyCode == Keys.Down))
{
y = y + 4;
Refresh();
}
}
co je to x a y?
Neměl bys na ten pohyb používat tu funkci, co tam máš?
Problém je, že KeyEvent sežere Form - nastav mu vlastnost KeyPreview:
KeyPreview = true;
Takže použij PictureBox.KeyDown...
Jo a jak jsem psal - používej mapu...
až se ho někdo ve škole zeptá co je tady to dictionary a tady ty špičaté závorky že to se ani o hodinách nedělalo tak kolegovi mechovákovi dotyčný znovu ještě poděkuje
Já sem to právě dělal uplně jinak než přes ten picturebox. Zkoušel sem to jak nám to ukazoval v hodině přes vykreslování přímo na formulář a ted mi nereagují ty tlačítka na klávesnici. Vím že to není žádný extra kód a že to není uplně všechno správně.
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 WindowsFormsApplication18
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int x = 200;
int y = 150;
Image obrazek = Properties.Resources.ob01;
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (x > 440)
x = -30;
if (x < -30)
x = 440;
if (y > 300)
y = -50;
if (y < -50)
y = 300;
e.Graphics.DrawImage(obrazek, x, y, 36, 50);
}
private void button1_Click(object sender, EventArgs e)
{
x = x - 4;
Refresh();
}
private void button3_Click(object sender, EventArgs e)
{
x = x + 4;
Refresh();
}
private void button4_Click(object sender, EventArgs e)
{
y = y - 4;
Refresh();
}
private void button2_Click(object sender, EventArgs e)
{
y = y + 4;
Refresh();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.A) || (e.KeyCode == Keys.Left))
{
x = x - 4;
Refresh();
}
if ((e.KeyCode == Keys.D) || (e.KeyCode == Keys.Right))
{
x = x + 4;
Refresh();
}
if ((e.KeyCode == Keys.W) || (e.KeyCode == Keys.Up))
{
y = y - 4;
Refresh();
}
if ((e.KeyCode == Keys.S) || (e.KeyCode == Keys.Down))
{
y = y + 4;
Refresh();
}
}
Kód máš dobře. Nenašel jsem žádné chyby. Musí být chyba v oknu. Možná kdyby si sem nahodil i ten kód designera(form1.Designer.cs)
Tvl. - psal jsem KeyPreview. Koukám, že jsi i můj kód zahodil - fajn - končím... Nezapomeň - já ničemu nerozumím!
Pro ty co to nechápou - nejsem vůbec uražený, ale k čemu ztrácet čas,
když mě pak akorát ponížíte? 
Nebuď na něj tak zlej. Dnes hájil čisté objektové programování a používání výjimek. Bohužel narazil na céčkaře, kteří tohle asi nikdy nepochopí.
Zobrazeno 50 zpráv z 56.