Diskuze: Pohyb obrázku

Člen

Zobrazeno 56 zpráv z 56.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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í.
Já bych řekl, že to na formu nepůjde, klávesy přijímají prvky co mají focus a ten form mít nebude. Nechce se mi to teď zkoušet, můžeš zkusit něco jako form1.SetFocus nebo jak to tam je nebo dát tu událost s klávesami do jiné kontrolky, třeba na picturebox.
zdravím, chtěl bych se zeptat, jak jste dostali do kódu using.Drawing? mě to vždy vyhodí chybu i když si to tam sám připíšu
Jakou chybu? A mas tam urcite "using System.Drawing;" namisto "using.Drawing"?
Ano mám to tam, ale v základu to není, musím si ty vždy připsat a píše mi to že to neexistuje, ani Windows.Forms
Nejspíš ti tam chybí reference
References->AddReferences->Framework -> (zatrhnout System.Drawing)
(v české verzi se to jmenuje Odkazy)
Zobrazeno 56 zpráv z 56.