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í.
Avatar
Neaktivní uživatel:15.6.2018 21:57

Dělám si takovou jednodušší hru a z neznámého důvodu mi

private double GetPL() {
        return Canvas.GetLeft(Pajdulak);
}
private double GetPT() {
        return Canvas.GetTop(Pajdulak);
}
private void SetPL(int plus) {
        Canvas.SetLeft(Pajdulak, GetPL() + plus);
}
private void SetPT(int plus) {
        Canvas.SetTop(Pajdulak, GetPT() + plus);
}
private void Window_KeyDown(object sender, KeyEventArgs e) {
        if ((e.Key == Key.Left || e.Key == Key.A) && GetPL() > 0) {
                for (int i = 0; i < 5; i++) {
                        SetPL(-1);
                        System.Threading.Thread.Sleep(10);
                }
        }
        if ((e.Key == Key.Right || e.Key == Key.D) && (GetPL() < Pozadi.ActualWidth - Pajdulak.ActualWidth)) {
                for (int i = 0; i < 5; i++) {
                        SetPL(1);
                        System.Threading.Thread.Sleep(10);
                }
        }
        if ((e.Key == Key.Up || e.Key == Key.W) && GetPT() > 0) {
                for (int i =0; i < 5; i++) {
                        SetPT(-1);
                        System.Threading.Thread.Sleep(10);
                }
        }
        if ((e.Key == Key.Down || e.Key == Key.S) && (GetPT() < Pozadi.ActualHeight - Pajdulak.ActualHeight)) {
                for (int i =0; i < 5; i++) {
                        SetPT(1);
                        System.Threading.Thread.Sleep(10);
                }

        }
        if (e.Key == Key.Escape) this.Close();
}

kde <code>Pozadi</code> je Canvas a <code>Pajdulak</co­de> Image, <strong>odmítá</stron­g> jakkoli <strong>reagovat na šipku nahoru/dolů a W/S.</strong> Nevíte někdo, jestli je to má chyba nebo chyba C#/VS?

Odpovědět
15.6.2018 21:57
Neaktivní uživatelský účet
Avatar
Filip Němeček
Tvůrce
Avatar
Filip Němeček:16.6.2018 14:12

Přidej ještě tvoje metody SetTop a SetLeft.

 
Nahoru Odpovědět
16.6.2018 14:12
Avatar
Odpovídá na Filip Němeček
Neaktivní uživatel:16.6.2018 14:20

Vidíš první 4 metody v kódu? Ono by to mohlo být ještě trochu rozepsanější, ale tohle budu řešit později. Nefungovalo ani

Canvas.SetTop(Pajdulak, Canvas.GetTop(Pajdulak) - 1);

a opačná varianta.

Editováno 16.6.2018 14:22
Nahoru Odpovědět
16.6.2018 14:20
Neaktivní uživatelský účet
Avatar
Filip Němeček
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Filip Němeček:16.6.2018 14:29

No vidím, už si WPF nepamatuji přesně a myslel jsem, že jsou to tvoje extension metody.

Pozice v Canvas nastavuj přímo na tvém obrázku Pajdulak.

Něco ve smyslu:

Pajdulak.SetValue(Canvas.TopProperty, 20d);

To číslo musí být typu double, jinak to nebude fungovat. Analogicky nastavíš Left.

 
Nahoru Odpovědět
16.6.2018 14:29
Avatar
Odpovídá na Filip Němeček
Neaktivní uživatel:16.6.2018 14:52

Pořád nefunguje :-(. Doleva a doprava to šlo i předtím, takže tímhle to asi nebude. No aspoň vím zas něco víc o nastavování pozice.

Nahoru Odpovědět
16.6.2018 14:52
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
termostat:18.6.2018 12:02

Tipnul bych, že máš špatně nastavený VerticalAlignment u toho Canvasu.
Zkus tomu prvku Canvas nastavit Background na Red, ať vidíš jestli je opravdu tak vysoký jak si myslíš.

 
Nahoru Odpovědět
18.6.2018 12:02
Avatar
Odpovídá na termostat
Neaktivní uživatel:18.6.2018 18:02

Tohle je v pohodě, sice jsem měl pozadí nastaveno u <code>Window</co­de>, ale po přesunutí na <code>Canvas</code> to vypadalo stejně.

Nahoru Odpovědět
18.6.2018 18:02
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
termostat:18.6.2018 20:28

Nevidím tvůj xaml, ale máš něco špatně nastaveného právě tam. Protože když vemu ten tvůj kód a přidám k němu následují xaml, tak mi funguje pohyb do všech stran.

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                                KeyDown="Window_KeyDown">
        <Canvas x:Name="Pozadi">
                <Label Content="X" x:Name="Pajdulak" Canvas.Left="100" Canvas.Top="100"/>
        </Canvas>
</Window>
 
Nahoru Odpovědět
18.6.2018 20:28
Avatar
Odpovídá na termostat
Neaktivní uživatel:18.6.2018 20:34
//XAML
<Window x:Class="minihra.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:minihra"
        mc:Ignorable="d"
        Title="Skakaci hra(d)" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Height="350" Width="525" Background="Black" KeyDown="Window_KeyDown">
        <Canvas Name="Pozadi" Background="#ff00aaaf">
                //Toto ted neni dulezite
                <Image Source="finishIcon.ico" Canvas.Left="450" Canvas.Top="10" Height="35" Name="Finish"/>
        </Canvas>
</Window>


//Dulezita cast C# (pridavani Pajdulak)
Pajdulak = new Image();
Pajdulak.Source = new BitmapImage(new Uri("pajdulak.png", UriKind.Relative));
Pajdulak.Height = 50;
Canvas.SetBottom(Pajdulak, 0);
Canvas.SetLeft(Pajdulak, 0);
Pozadi.Children.Add(Pajdulak);
Nahoru Odpovědět
18.6.2018 20:34
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
termostat:18.6.2018 21:01

Tento řádek to kazí:

Canvas.SetBottom(Pajdulak, 0);

Nejdřív místo toho zkus toto a ověř že to funguje:

Canvas.SetTop(Pajdulak, 0);

Pokud ano, tak zřejmě budeš chtít nastavit úvodní pozici uplně dolu. Tam zase záleží v jakém momentě ten kód voláš, tedy jestli už v tu chvíli je vykresleno Pozadi. Potom bys mohl použít něco jako toto:

Canvas.SetTop(Pajdulak, Pozadi.Height - Pajdulak.Height);

Ale to už si doladíš.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.6.2018 21:01
Avatar
Odpovídá na termostat
Neaktivní uživatel:18.6.2018 21:23

Zajímavé, první část funguje skvěle, druhá mi hodí panáčka taky nahoru (a ještě k tomu blokovala vertikální posouvání, teď už to záhadně nedělá). Hlavní problém vyřešen, klidně mi můžeš pomoct doladit i zbytek :-)

Nahoru Odpovědět
18.6.2018 21:23
Neaktivní uživatelský účet
Avatar
termostat
Člen
Avatar
termostat:18.6.2018 21:40

Můžeš místo toho zkusit ActualHeight, tedy takto:

Canvas.SetTop(Pajdulak, Pozadi.ActualHeight - Pajdulak.Height);

Ale jak píšu, nevidím odkud to voláš. V konstruktoru okna je to moc brzo, protože Pozadi ještě není v tu chvíli vykresleno.
Místo toho to zavolej radši třeba v události Window_Loaded, nebo na jiném vhodném místě, zkrátka aby to bylo až po prvním vykreslení.

 
Nahoru Odpovědět
18.6.2018 21:40
Avatar
Odpovídá na termostat
Neaktivní uživatel:18.6.2018 21:49

Tak díky, o události <code>Loaded</code> jsem nevěděl. Teď už funguje vše.

Nahoru Odpovědět
18.6.2018 21:49
Neaktivní uživatelský účet
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 13 zpráv z 13.