IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: Použítí vícekrát jednoho pictureboxu

Aktivity
Avatar
Verquido
Tvůrce
Avatar
Verquido:27.10.2015 18:42

Zdravím, Potřeboval bych zjistit jak bych mohl vícekrát použít jeden vytvořený picturebox. Jakoby ho třeba naklonovat.

Jde mi o to že dělám hru a nevím jak tam třeba střílet. Tak mě napadlo že bych mohl udělat jeden picturebox jako střelu a pak to jenom klonovat a jako střílet. Potom to samý ještě s něčím co bohužel nakreslit nejde. (Mám obrázek)

Nevím jestli to z tohohle pochopíte je to docela divně vysvětlený, ale kdo něco vymyslí tak díky moc :)

 
Odpovědět
27.10.2015 18:42
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:27.10.2015 18:52

udělej si metodu createShot, která vytvoří picturebox, nastaví mu potřebné vlastnosti a přidá ho na formulář.

 
Nahoru Odpovědět
27.10.2015 18:52
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:27.10.2015 19:25

Ano děkuji a ještě trochu poradit s tou metodou prosím :)

public void CreateShoot()
{
    PictureBox pb = new PictureBox();
    pb.BackgroundImage = "shot.png"; // Nefunguje, jak nastavím pozadí?
    pb.BackColor = ....; // Jak na Trasparent?
}
 
Nahoru Odpovědět
27.10.2015 19:25
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:27.10.2015 19:35

Nefunguje, jak nastavím pozadí?

Image.FromFile("shot.png")

Jak na Trasparent?

// tuším, že
Color.Transparent
 
Nahoru Odpovědět
27.10.2015 19:35
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:27.10.2015 19:46

Tak nevím proč, ale prostě to nejde :D

public void CreateShoot()
{
    PictureBox pb = new PictureBox();
    pb.Width = 5;
    pb.Height = 10;
    //pb.BackgroundImage = Image.FromFile("shot.png");
    pb.BackColor = Color.Red;
    pb.Left = pbShip.Left + (pbShip.Width / 2);
    pb.Top = pbShip.Top++;
}

private void ShootTimer_Tick(object sender, EventArgs e)
{
    CreateShoot();
}

Podle toho kódu by se to mělo každých 0,1s vygenerovat a letět nahoru.

 
Nahoru Odpovědět
27.10.2015 19:46
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:27.10.2015 19:50

a co to dělá?

 
Nahoru Odpovědět
27.10.2015 19:50
Avatar
Verquido
Tvůrce
Avatar
Verquido:27.10.2015 19:53

No právě že nic, ani se to neoběví. Ale ještě mě napadá jestli se nějak nemusí ošetřit že to má být vykresleno na Panelu.. Jestli se to náhodou nevykresluje pod ten panel (který je na celou obrazovku) :D

 
Nahoru Odpovědět
27.10.2015 19:53
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Verquido
D0ll0k:27.10.2015 20:43

Přidáváš picturebox do Controls?

Nahoru Odpovědět
27.10.2015 20:43
Veni, vidi, programmato
Avatar
Tomáš Brůna
Tvůrce
Avatar
Tomáš Brůna:27.10.2015 20:46

Zkus ještě toto na to nastavení toho obrázku:

obrazek.Image = new Bitmap("obrazek.jpg");
Nahoru Odpovědět
27.10.2015 20:46
Vi veri universum vivus vici
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na D0ll0k
Verquido:27.10.2015 20:54

prosimtě, přesněji očem to mluvíš? :D

 
Nahoru Odpovědět
27.10.2015 20:54
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Tomáš Brůna
Verquido:27.10.2015 20:58

Když sem to skusil tak se mi pokaždé sekl debuging nevim proč.

 
Nahoru Odpovědět
27.10.2015 20:58
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Verquido
D0ll0k:27.10.2015 21:01

Já taky zrovna dělám s pictureboxem a taky jsem narazil na stejný problém. Šel jsem se tedy podívat do Form1.Designer.cs, kde jsou všechny kontrolky a úplně dole jsem narazil na:

//
//form1
//
...
this.Controls.Add(pictureBox1);

Jak vidíš, aby šel picturebox zobrazit nejdříve ho musíš přidat do form.

Nahoru Odpovědět
27.10.2015 21:01
Veni, vidi, programmato
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Verquido
Tomáš Brůna:27.10.2015 21:02

aha, a co to píše?

Nahoru Odpovědět
27.10.2015 21:02
Vi veri universum vivus vici
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Tomáš Brůna
Verquido:27.10.2015 21:12

Dělám si hru jen tak pro radost. Jak hýbeš vesmírnou lodí a ze zhora třeba něco padá a ty to sestřeluješ. Tak něco podobného :D Ale nějak sem se zasekl u toho střílení a u toho padání. :/

 
Nahoru Odpovědět
27.10.2015 21:12
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Verquido
D0ll0k:27.10.2015 21:14

Zapomněl jsem, že:

this.Controls.Add(pictureBox1);

je u panelu. U pictureboxu ho musis dat do layoutu:

layout.Controls.Add(picturebox);
Nahoru Odpovědět
27.10.2015 21:14
Veni, vidi, programmato
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na D0ll0k
Verquido:27.10.2015 21:50

A kam to mám jako napsat? :D do tý metody kde tvořím ten picturebox? Nebude jich pak přidaných desítky?

 
Nahoru Odpovědět
27.10.2015 21:50
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Verquido
D0ll0k:27.10.2015 21:55

Do tý CreateShoot().

Nahoru Odpovědět
27.10.2015 21:55
Veni, vidi, programmato
Avatar
Jan Sála
Tvůrce
Avatar
Odpovídá na Verquido
Jan Sála:27.10.2015 21:55

Když změníš pozadí komponenty nebo obecně pracuješ s grafikou, tak bys měl volat metodu Refresh()

Nahoru Odpovědět
27.10.2015 21:55
Když nevím co s tím, tak je chyba v compileru.
Avatar
Verquido
Tvůrce
Avatar
Verquido:28.10.2015 9:04

Tak už se v tom docela strácím :D
Takže chceme toto že? :D

public void CreateShoot()
{
    PictureBox pb = new PictureBox();
    layout.Controls.Add(pb);
    pb.Width = 5;
    pb.Height = 10;
    //pb.BackgroundImage = Image.FromFile("shot.png");
    pb.BackColor = Color.Red;
    pb.Left = pbShip.Left + (pbShip.Width / 2);
    pb.Top = pbShip.Top;
    pb.Top += 2;
}

private void ShootTimer_Tick(object sender, EventArgs e)
{
    CreateShoot();
    panel.Refresh();
}

Stejně to nejde :D CO je špatně prosím opravte :D¨Díky moc.

 
Nahoru Odpovědět
28.10.2015 9:04
Avatar
D0ll0k
Člen
Avatar
D0ll0k:28.10.2015 9:48

Mě to tedy funguje.
Možná je chyba ve volání ShootTimer_Tick. Jestli je to metoda, kterou voláš timerem, zkus se podívat, jestli ji opravdu voláš, jestli jsi timer spustil.
Jinak picturebox jde dát i do panelu.

Nahoru Odpovědět
28.10.2015 9:48
Veni, vidi, programmato
Avatar
D0ll0k
Člen
Avatar
D0ll0k:28.10.2015 9:58

A ještě jedna věc. Ten picturebox se nemusí dávat do panelu nebo do layoutu, můžeš ho dát i do form:

Controls.Add(pb);

Včera jsem byl uplně mimo.

Nahoru Odpovědět
28.10.2015 9:58
Veni, vidi, programmato
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na D0ll0k
Verquido:28.10.2015 10:45

Dobře vyzkouším to ;) dík moc.

 
Nahoru Odpovědět
28.10.2015 10:45
Avatar
Verquido
Tvůrce
Avatar
Verquido:28.10.2015 12:11

Ne prostě to nejde :D Jestli tobě to jde prosimtě pošli mi třeba v .rar jak to máš udělaný protože už fakt nevím :(

 
Nahoru Odpovědět
28.10.2015 12:11
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:28.10.2015 12:20

ono ti to asi funguje, ale jestli máš zakomentovaný ten řádek kde nastavuješ obrázek, tak tam máš jen průhledné pictureboxy.

 
Nahoru Odpovědět
28.10.2015 12:20
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:28.10.2015 12:23

Já tam ten obrázek vůbec nemám. Mám tam ale barvu pozadí to by mělo vykreslit tedy červený obdelníček ne? to ale taky nevidím :)

pb.BackColor = Color.Red;
 
Nahoru Odpovědět
28.10.2015 12:23
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:28.10.2015 12:24

máš zapnutý Timer?

 
Nahoru Odpovědět
28.10.2015 12:24
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:28.10.2015 12:26

Já to mám udělaný takhle: Když se zmáčkne mezerník tak se spustí timer a ten vytváří ty pictureboxy podle té metody a refreshuje panel.

 
Nahoru Odpovědět
28.10.2015 12:26
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:28.10.2015 12:29

a funguje to I tak? Si tam hoď breakpoint, jestli se to skutečně zavolá.

 
Nahoru Odpovědět
28.10.2015 12:29
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:28.10.2015 12:41

JJ, když do té metody CreateShot(); dám třeba něco jinýho. třeba aby s něco posunulo o x pixelů, posune se to takže ta metoda funguje.

 
Nahoru Odpovědět
28.10.2015 12:41
Avatar
Michal Žůrek - misaz:28.10.2015 12:47
layout.Controls.Add(pb);

posuň na konec metody (což by to sice nemělo způsobovat, ale chronologicky je to lepší) a zkus ji nahradit za

this.Controls.Add(pb);
 
Nahoru Odpovědět
28.10.2015 12:47
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:28.10.2015 12:52

jj, helejce asi jsme se posunuli trochu dál :D

panel.Visible = false;

A najednou to tam bylo vidět :D Ta střela tam byla, ale jenom jedna a nehýbala se což jsou další problémy. Ale už víme že tam je schovaná pod tím panele. Jak s ní nahoru :D

Editováno 28.10.2015 12:52
 
Nahoru Odpovědět
28.10.2015 12:52
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:28.10.2015 12:53

musíš ji posunout do toho panelu

panel.Controls.Add(...)
 
Nahoru Odpovědět
28.10.2015 12:53
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:28.10.2015 13:03

jj super, už to mám.. A teď to nějak rozhýbat :D bohužel k tomu nijak nemůžu abych to rozhýbal v timeru protože to v tom timeru vůbec nevidím :/

 
Nahoru Odpovědět
28.10.2015 13:03
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:28.10.2015 13:14

to protože si to musíš uložit někam, tak abys to viděl.

 
Nahoru Odpovědět
28.10.2015 13:14
Avatar
Verquido
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Verquido:28.10.2015 13:15

jako například? :D

 
Nahoru Odpovědět
28.10.2015 13:15
Avatar
Odpovídá na Verquido
Michal Žůrek - misaz:28.10.2015 13:28

vytvoříš proměnnou na formuláři a uložíš to do ni.

class Form {
        PictureBox shoot; // v kódu s ní budeš pracovat jako this.shoot
}
 
Nahoru Odpovědět
28.10.2015 13:28
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 36 zpráv z 36.