Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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
Petr Kubíček:15.3.2018 21:31

Ahoj, chtěl bych se zeptat,
vytvářím si remake pacmana, přecházím od winforms k wpfku a setkáváš se s některými problémy, tedy...

Mám okno 800x600, v něm StackPanel, který obsahuje další StackPanel s vertikální orientací a vedle něj canvas, ten by měl mít rozměry 600x600.
V kódu jsem si vytvořil pole 12x12, protože chci rozdělit herní plochu na dílky po 50px. Ovšem když zkusím toto pole naplnit Rectangly o velikosti 50x50, do canvasu se nevejdou. Otázka tedy zní, proč?

Díky za rady, popřípadně informace, jak udělat něco líp, s wpf technologií nemám zkušenosti.

XAML

<StackPanel Orientation="Horizontal">
        <StackPanel Orientation="Vertical" Width="200">
            <TextBlock Margin="10" Text="PacMan" Foreground="#f4f4f4" FontSize="30" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        </StackPanel>
        <Canvas x:Name="mainCanvas" Background="#f4f4f4">
            <local:HracPacMan x:Name="PacManHrac" Canvas.Left="0" Canvas.Top="0" Panel.ZIndex="10" Width="50" Height="50"></local:HracPacMan>
        </Canvas>
    </StackPanel>
public partial class MainWindow : Window
    {
        public double BlockSize;
        public MainWindow()
        {
            InitializeComponent();

            mainCanvas.Width = 600;
            mainCanvas.Height = 600;
            BlockSize = mainCanvas.Width / 12;

            CreateMap();

            DispatcherTimer timer = new DispatcherTimer();
            timer.Tick += Update;
            timer.Interval = TimeSpan.FromMilliseconds(1);
            timer.Start();
        }


        public void Update(object sender, EventArgs e)
        {
            SetLeft(PacManHrac, GetLeft(PacManHrac) + 3 );
        }

        public double X { get; set; }
        public double Y { get; set; }


        public void CreateMap()
        {
            X = 0;
            Y = 0;
            for (int i = 0; i < Map.mapa.GetLength(0); i++)
            {
                for (int j = 0; j < Map.mapa.GetLength(1); j++)
                {
                    //pokud je nějaké z čísel obsazené na mapě, vykreslí se objekt
                    switch (Map.mapa[i, j])
                    {
                        case 0: createBorderBlock(); SetTop(borderBlock, Y); SetLeft(borderBlock, X); break;
                    }
                    //posouvám se po souřadnicích s každým novým blokem
                    X += BlockSize;
                }
                //nový řádek
                X = 0;
                Y += BlockSize;
            }
        }

        private Rectangle borderBlock;
        public void createBorderBlock()
        {
            borderBlock = new Rectangle();
            borderBlock.Width = BlockSize; borderBlock.Height = BlockSize;
            Panel.SetZIndex(borderBlock, 1);
            borderBlock.Stroke = Brushes.DarkBlue;
            mainCanvas.Children.Add(borderBlock);
        }
    }
 
Odpovědět
15.3.2018 21:31
Avatar
nickname01
Člen
Avatar
Odpovídá na Petr Kubíček
nickname01:16.3.2018 14:05

Velikost okna se nastavuje včetně rámu. Pro nastavení velikosti vnitřku musíš k výšce okna přičíst 30 a k šířce 10.

Tedy pokud chceš mít velikost vnitřku například 500(výška)*500(šíř­ka), musíš oknu nastavit velikost 530*510.

Není chyba v tom?

Taky bych styly nedefinoval v C# kódu, je to méně přehledné.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
16.3.2018 14:05
Avatar
Odpovídá na nickname01
Petr Kubíček:16.3.2018 15:26

Díky, bylo to tím:)

 
Nahoru Odpovědět
16.3.2018 15:26
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 3 zpráv z 3.