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
Odpovídá na
Jakub Lásko[Saarix]:17.9.2013 14:40

Teď nechápu nač potřebuješ udělat toto tak rychle, aniž by nešlo před tím projít tutoriály.

Odpovědět
17.9.2013 14:40
Časem je vše možné.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na
Jan Vargovský:17.9.2013 14:51
  1. Však vytvoříš si list Rectanglu někde v té třídě - aby jsi k němu přistupovat z různých metod
  2. Naplníš ho hodnotama - projedeš všechny controls v panelu a vložíš jejich rectangly do toho listu
  3. Vždycky když pohneš figurkou, hráčem - prostě tím labelem, tak musíš ještě zvalidovat, jestli náhodou není skrz -> to je ta metoda IsThrough, která ti vrací bool -> když je skrz vrátí true, jinak false. Takže to dáš jen do podmínky a zavoláš tam nějakou metodu reset - vrátí se na záčátek nebo jednoduše posuneš figurku o krok zpět.

Hint:
1 - proměnnou dáš mimo metodu
2 - naplníš v konstruktoru nebo OnLoad metodě formuláře

Jestli mohu doporučit: Dej na radu ostatních, kdybys přečetl minimálně ten tutoriál, dokázal bys to napsat sám. Začátky jsou těžké, ale z cizích kódů se moc nenaučíš (s porovnáním tím, že si něco vymyslíš z vlastní hlavy)

Editováno 17.9.2013 14:52
 
Nahoru Odpovědět
17.9.2013 14:51
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Jan Vargovský
noName:17.9.2013 15:16

Já to chápu, ale slíbil jsem kamarádovi, že mu s tímto problémem pomůžu, i když jsem věděl, že mé znalosti nejsou adekvátní tomuto řešení. A až to budu mít z krku, tak si rád přečtu všechny tutoriály, protože mě to začalo zajímat. A nikdo mě od toho neodradí, i přesto, že začátky jsou opravdu těžké.

Byl bych opravdu velice rád, kdyby kdokoli doplnil do kódu, který jsem poslal výše, chybějící metody (zbytek kódu). Děkuji.

 
Nahoru Odpovědět
17.9.2013 15:16
Avatar
noName
Neregistrovaný
Avatar
noName:17.9.2013 15:19

Jen chci doplnit, že toto opravdu nedělám pro sebe, ale pro kamaráda, a že z toho vůbec nic nemám. Maximálně novou zkušenost.

 
Nahoru Odpovědět
17.9.2013 15:19
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:17.9.2013 15:21

Vždyť jsem ti napsal všechen kód, stačí ho tam doplnit jako skládačku ...

Editováno 17.9.2013 15:22
 
Nahoru Odpovědět
17.9.2013 15:21
Avatar
noName
Neregistrovaný
Avatar
noName:17.9.2013 15:26

To dělám odrána a nic :( Mám v sobě už 6 kafe a začínám z toho šílet.

 
Nahoru Odpovědět
17.9.2013 15:26
Avatar
noName
Neregistrovaný
Avatar
noName:17.9.2013 15:26

To dělám odrána a nic :( Mám v sobě už 6 kafe a začínám z toho šílet.

 
Nahoru Odpovědět
17.9.2013 15:26
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na
Jan Vargovský:17.9.2013 15:28

Teď jsem ti napsal před půl hodinou přesný postup co máš udělat. V tom kódu co jsi poslal naposled jsi akorát smazal ten velký paskvil.

 
Nahoru Odpovědět
17.9.2013 15:28
Avatar
noName
Neregistrovaný
Avatar
noName:17.9.2013 15:30

OK. Jdu si zapálit, a zkusím to znovu. Ale s mojí povahou (cholerik) ten krám poletí brzo z okna... :D

 
Nahoru Odpovědět
17.9.2013 15:30
Avatar
noName
Neregistrovaný
Avatar
noName:17.9.2013 16:01

Stále mi to nejede :(

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;
using System.Diagnostics;

namespace Maze
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            start();
            foreach (Control c in Controls)
            {
                if (c is Label)
                {
                    rectangles.Add(c.ClientRectangle);
                }
            }
        }

        private List<Rectangle> rectangles = new List<Rectangle>();

        private bool IsThrough(Rectangle playerRectangle, params Rectangle[] rectangles)
        {
            foreach (Rectangle r in rectangles)
            {
                if (playerRectangle.IntersectsWith(r))
                    return true;
            }
            return false;

            if (IsThrough(player.ClientRectangle, rectangles.ToArray()))
            {
                start();
            }
        }

        // STOPWATCH:
        public Stopwatch watch = new Stopwatch();

        // START:
        public void start()
        {
            player.Location = new Point(0, 575);
            watch.Reset();
            watch.Start();
        }

        // CONTROL:
        public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            // UP:
            if (e.KeyCode == Keys.W)
            {
                player.Top -= 10;
            }
            // DOWN:
            if (e.KeyCode == Keys.S)
            {
                player.Top += 10;
            }
            // LEFT:
            if (e.KeyCode == Keys.A)
            {
                player.Left -= 10;
            }
            // RIGHT:
            if (e.KeyCode == Keys.D)
            {
                player.Left += 10;
            }
            IsThrough();
        }

        // FINISH:
        public void finish()
        {
            watch.Stop();
            string time = watch.Elapsed.Seconds.ToString();
            MessageBox.Show("Congratulations! " + "Your time: " + time + " seconds.");
        }
    }
}

Vidíš chybu?

 
Nahoru Odpovědět
17.9.2013 16:01
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na
Petr Nymsa:17.9.2013 16:39

Metodu IsThrough v metodě IsThrough voláš proč ? Tu podmínku by jsi měl dát do metody kde ovládáš hráče. Takto donekonečna voláš metodu IsThgrough ;)

Nahoru Odpovědět
17.9.2013 16:39
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
noName
Neregistrovaný
Avatar
noName:17.9.2013 21:13

Teď se program sice spustí, ale nejde ovládat hráčem.

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;
using System.Diagnostics;

namespace Maze
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            start();
            foreach (Control c in panel1.Controls)
            {
                if (c is Label)
                {
                    rectangles.Add(c.ClientRectangle);
                }
            }
        }

        private List<Rectangle> rectangles = new List<Rectangle>();

        private bool IsThrough(Rectangle playerRectangle, params Rectangle[] rectangles)
        {
            foreach (Rectangle r in rectangles)
            {
                if (playerRectangle.IntersectsWith(r))
                    return true;
            }
            return false;
        }

        // STOPWATCH:
        public Stopwatch watch = new Stopwatch();

        // START:
        public void start()
        {
            player.Location = new Point(0, 575);
            watch.Reset();
            watch.Start();
        }

        // CONTROL:
        public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            // UP:
            if (e.KeyCode == Keys.W)
            {
                player.Top -= 10;
            }
            // DOWN:
            if (e.KeyCode == Keys.S)
            {
                player.Top += 10;
            }
            // LEFT:
            if (e.KeyCode == Keys.A)
            {
                player.Left -= 10;
            }
            // RIGHT:
            if (e.KeyCode == Keys.D)
            {
                player.Left += 10;
            }
            if (IsThrough(label1.ClientRectangle, rectangles.ToArray()))
            {
                start();
            }
        }

        // FINISH:
        public void finish()
        {
            watch.Stop();
            string time = watch.Elapsed.Seconds.ToString();
            MessageBox.Show("Congratulations! " + "Your time: " + time + " seconds.");
        }
    }
}
 
Nahoru Odpovědět
17.9.2013 21:13
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na
Jan Vargovský:17.9.2013 21:22

Jo, to bude tím, že máš v tom poli rectangles i ten rectangle toho hráče = vždycky ti to vráti true protože se ptáš jestli hráč a hráč se náhodou nepřekrývají => musíš vylepšit to přidání těch jednotlivých rectanglu do toho listu (v konstruktoru) dej si třeba k tomu labelu toho hráče k vlastnosti Tag třeba text "Player" a testuj jestli je label.Tag != "Player"
V kódu teda takto:

foreach (Control c in panel1.Controls)
            {
                if (c is Label)
                {
                    if( (c as Label).Tag != "Player")
                        rectangles.Add(c.ClientRectangle);
                }
            }

Pak už by to mělo všechno fungovat :)

 
Nahoru Odpovědět
17.9.2013 21:22
Avatar
noName
Neregistrovaný
Avatar
noName:18.9.2013 10:28

Asi bude chyba někde jinde, protože to stále nejede :(

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;
using System.Diagnostics;

namespace Maze
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Form1 LOAD:
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control c in panel1.Controls)
            {
                if (c is Label)
                {
                    if ((c as Label).Tag != "Player")
                    {
                        rectangles.Add(c.ClientRectangle);
                    }
                }
            }
            start();
        }

        // List of Rectangles:
        private List<Rectangle> rectangles = new List<Rectangle>();

        // Trough:
        private bool IsThrough(Rectangle playerRectangle, params Rectangle[] rectangles)
        {
            foreach (Rectangle r in rectangles)
            {
                if (playerRectangle.IntersectsWith(r))
                    return true;
            }
            return false;
        }

        // STOPWATCH:
        public Stopwatch watch = new Stopwatch();

        // START:
        public void start()
        {
            player.Location = new Point(0, 575);
            watch.Reset();
            watch.Start();
        }

        // CONTROL:
        public void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            // UP:
            if (e.KeyCode == Keys.W)
            {
                player.Top -= 10;
            }
            // DOWN:
            if (e.KeyCode == Keys.S)
            {
                player.Top += 10;
            }
            // LEFT:
            if (e.KeyCode == Keys.A)
            {
                player.Left -= 10;
            }
            // RIGHT:
            if (e.KeyCode == Keys.D)
            {
                player.Left += 10;
            }
            if (IsThrough(label1.ClientRectangle, rectangles.ToArray()))
            {
                start();
            }
        }

        // FINISH:
        public void finish()
        {
            watch.Stop();
            string time = watch.Elapsed.Seconds.ToString();
            MessageBox.Show("Congratulations! " + "Your time: " + time + " seconds.");
        }
    }
}

A tady je celý projekt:

http://uloz.to/x4846xQT/maze-rar
 
Nahoru Odpovědět
18.9.2013 10:28
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na
Jan Vargovský:18.9.2013 22:15

Kouknul jsem nato a opravil, nechce se mi to uploadovat, ale validuješ jestli není label1 (zeď ) náhodou ve zdi(sama v sobě) = pokaždé ti to vrátí true a vždy se vrátíš nazačátek.

Takže si to oprav na

if (IsThrough(new Rectangle(player.Location, player.Size), rectangles.ToArray()))
            {
                start();
            }

Pozn. když vytváříš rectangle, tak clientRectangle kašle na pozici (location toho controlu) takže to musíš sám vytvořit ten objekt
To samé platí i u toho jak si přidáváš ty jednotlivé rectangly v konstruktoru do toho listu

takže v tom kódu místo

rectangles.Add(c.ClientRectangle);

oprav na:

rectangles.Add(new Rectangle(c.Location, c.Size));
 
Nahoru Odpovědět
18.9.2013 22:15
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:18.9.2013 22:22

Ještě poznámka, jak máš tu metodu na KeyPress, tak použí raději switch a když nebude žádná klávesa, která by s ní pohla (default) tak zavolej return, zbytečně pak voláš tu metodu IsThrough a testuješ celé to pole... mluvím jen, že kdybys tam měl třeba takových kolizí možných třeba 5oo, tak už by to bylo značně poznat.

 
Nahoru Odpovědět
18.9.2013 22:22
Avatar
noName
Neregistrovaný
Avatar
noName:20.9.2013 8:17

Super. Už to jede. Mockrát děkuji.

 
Nahoru Odpovědět
20.9.2013 8:17
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 17 zpráv z 67.