Avatar
Andy Scheuchzer:15. června 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 Pozadi je Canvas a Pajdulak Image, odmítá jakkoli reagovat na šipku nahoru/dolů a W/S. Nevíte někdo, jestli je to má chyba nebo chyba C#/VS?

Odpovědět 15. června 21:57
Od ASM úroveň jazyků pouze klesá…
Avatar
Filip Němeček
Redaktor
Avatar
Filip Němeček:16. června 14:12

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

 
Nahoru Odpovědět 16. června 14:12
Avatar
Odpovídá na Filip Němeček
Andy Scheuchzer:16. června 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. června 14:22
Nahoru Odpovědět 16. června 14:20
Od ASM úroveň jazyků pouze klesá…
Avatar
Filip Němeček
Redaktor
Avatar
Odpovídá na Andy Scheuchzer
Filip Němeček:16. června 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. června 14:29
Avatar
Odpovídá na Filip Němeček
Andy Scheuchzer:16. června 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. června 14:52
Od ASM úroveň jazyků pouze klesá…
Avatar
termostat
Člen
Avatar
termostat:18. června 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  +1 18. června 12:02
Avatar
Odpovídá na termostat
Andy Scheuchzer:18. června 18:02

Tohle je v pohodě, sice jsem měl pozadí nastaveno u Window, ale po přesunutí na Canvas to vypadalo stejně.

Nahoru Odpovědět 18. června 18:02
Od ASM úroveň jazyků pouze klesá…
Avatar
termostat
Člen
Avatar
termostat:18. června 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. června 20:28
Avatar
Odpovídá na termostat
Andy Scheuchzer:18. června 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. června 20:34
Od ASM úroveň jazyků pouze klesá…
Avatar
termostat
Člen
Avatar
termostat:18. června 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 18. června 21:01
Avatar
Odpovídá na termostat
Andy Scheuchzer:18. června 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. června 21:23
Od ASM úroveň jazyků pouze klesá…
Avatar
termostat
Člen
Avatar
termostat:18. června 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. června 21:40
Avatar
Odpovídá na termostat
Andy Scheuchzer:18. června 21:49

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

Nahoru Odpovědět 18. června 21:49
Od ASM úroveň jazyků pouze klesá…
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.