Diskuze: Vlastní třída

C# .NET .NET (C# a Visual Basic) Vlastní třída American English version English version

Avatar
noName
Neregistrovaný
Avatar
noName:

Dobrý den. Píši složitější kód a chtěl bych si jej rozdělit na několik kódů. Nevíte jak na to? Chci se z Form1 odvolávat na public void xxx z jiného souboru. Například public void Control (), public void Camera atd.) Děkuji.

 
Odpovědět 15.9.2013 15:24
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na noName
Theodor Johnson:

Nechápu jak můžeš psát něco složitějšího a ptát se na základy oop

Nahoru Odpovědět  +2 15.9.2013 15:25
Přecházím na "Cross-Platform Development"
Avatar
exyi
Redaktor
Avatar
Odpovídá na noName
exyi:

Zkus se podívat na zdejší tutoriály

 
Nahoru Odpovědět 15.9.2013 15:33
Avatar
noName
Neregistrovaný
Avatar
noName:

Můžeš mi aspoň napovědět, kde mám hledat?

 
Nahoru Odpovědět 15.9.2013 15:37
Avatar
Theodor Johnson
Redaktor
Avatar
Nahoru Odpovědět 15.9.2013 15:40
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět  +2 15.9.2013 15:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
noName
Neregistrovaný
Avatar
noName:

Asi jsme se špatně pochopili. Nenasel sem to nikde. Jde mi o tom udělat hlavni program, který si bude volat podprogramy. Můžete mi někdo stručně popsat jak na to?

 
Nahoru Odpovědět 15.9.2013 16:36
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na noName
Theodor Johnson:

Kdyby jsi uměl ty základy oop a nehledal to v nich tak to pochopíš, musíš si vytvořit třídy, zinicializovat je a volat na nich ty metody co chceš, třída může popřpadě dědit z jiné, nebo z formu.

Nahoru Odpovědět 15.9.2013 16:38
Přecházím na "Cross-Platform Development"
Avatar
exyi
Redaktor
Avatar
Odpovídá na noName
exyi:

podprogramem myslíš funkci(/metodu)? - tu zavoláš takto:

xxx();

Btw.: jenom nepiš ze ti to Visual Studio podtrhlo - metoda musí být nekde definovaná

Editováno 15.9.2013 16:46
 
Nahoru Odpovědět 15.9.2013 16:45
Avatar
noName
Neregistrovaný
Avatar
noName:

Ať dělám cokoli, stejně to nejede :( Já mám napsaný dlouhý kód, který chci rozškatulkovat do jednotlivých kódů a pak je z hlavního programu volat.

 
Nahoru Odpovědět 15.9.2013 20:32
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

Prosím, přečti si zdejší tutoriály .... tímhle to nikam nevede. Nemáš páru vůbec o čem se zde hovoří :) .. je pro zajímavost .. postni sem ten kód at třeba pomůžeme

Nahoru Odpovědět 15.9.2013 20:34
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Michal Žůrek (misaz):

podle mě nezná ani funkce natož metody.

Nahoru Odpovědět  ±0 15.9.2013 20:35
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

Hlavně je mi podivné, že se chce odvolávat na nějaké public void xxx z jiného souboru. Nevím, co s tím chce dělat. To má být nějaké novodobé imperativní programování nebo co?

Nahoru Odpovědět  +1 15.9.2013 20:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
noName
Neregistrovaný
Avatar
noName:

Asi mě stále nechápete. Chci, aby byl kód přehlednější, a proto chci kód rozdělit. Aby každý void měl svůj vlastní soubor. A pak v hlavním kódu volat jednotlivé voidy

 
Nahoru Odpovědět 15.9.2013 21:01
Avatar
coderex213
Člen
Avatar
Odpovídá na noName
coderex213:

Void? Snad funkce, nebo ne?

 
Nahoru Odpovědět 15.9.2013 21:08
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

Ne ne a ne .... přečti si zdejší tutoriály o OOP. Žádné "void" voalt nebudeš. Budeš si zakládat instance tvých tříd a v nich volat metody.

Nahoru Odpovědět 15.9.2013 21:15
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na noName
Michal Žůrek (misaz):

předpokládám že už si prošel první třídou a umíš číst.

// Usoudil jsem podle toho, že umí psát.

Nahoru Odpovědět 15.9.2013 21:19
Nesnáším {}, proto se jim vyhýbám.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Kit
Petr Nymsa:

Obávám se že ta hromada kódu bude jenom spousta ale moc spousta metod (těžko říct zda public či private) nabušené ve Form1.cs které ještě ani nic nevrací. A Form1 bude obsahovat desítky různých datových položek.

Nahoru Odpovědět 15.9.2013 21:19
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na Petr Nymsa
Kit:

Otázkou také je, co znamená "složitější kód". Například pro Luboš Běhounek (Satik)a by to mohlo být něco nad 10000 řádek.

Void je docela hezké slovo. Možná by nebylo špatné se podívat do slovníku, co vlastně znamená. Takové spojení "void noName" také nezní špatně.

Nahoru Odpovědět  +1 15.9.2013 21:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
noName
Neregistrovaný
Avatar
noName:

Tak zde je ten kód:

using System;
using System.Collec­tions.Generic;
using System.Componen­tModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Window­s.Forms;
using System.Diagnostics;

namespace Maze
{
public partial class Form1 : Form
{
public Form1()
{
InitializeCom­ponent();
start();
}

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

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

//RECTANGLE:
public void rectangle()
{
int rPx = player.Location.X;
int rPy = player.Location.Y;
Rectangle rPlayer = new Rectangle(rPx, rPy, 24, 24);
Rectangle rFinish = new Rectangle(end­.Location.X, end.Location.Y, end.Size.Width, end.Size.Height);
Rectangle r1 = new Rectangle(label1­.Location.X, label1.Location.Y, label1.Size.Width, label1.Size.He­ight);
Rectangle r2 = new Rectangle(label2­.Location.X, label2.Location.Y, label2.Size.Width, label2.Size.He­ight);
Rectangle r3 = new Rectangle(label3­.Location.X, label3.Location.Y, label3.Size.Width, label3.Size.He­ight);
Rectangle r4 = new Rectangle(label4­.Location.X, label4.Location.Y, label4.Size.Width, label4.Size.He­ight);
Rectangle r5 = new Rectangle(label5­.Location.X, label5.Location.Y, label5.Size.Width, label5.Size.He­ight);
Rectangle r6 = new Rectangle(label6­.Location.X, label6.Location.Y, label6.Size.Width, label6.Size.He­ight);
Rectangle r7 = new Rectangle(label7­.Location.X, label7.Location.Y, label7.Size.Width, label7.Size.He­ight);
Rectangle r8 = new Rectangle(label8­.Location.X, label8.Location.Y, label8.Size.Width, label8.Size.He­ight);
Rectangle r9 = new Rectangle(label9­.Location.X, label9.Location.Y, label9.Size.Width, label9.Size.He­ight);
Rectangle r10 = new Rectangle(label10­.Location.X, label10.Location.Y, label10.Size.Width, label10.Size.He­ight);
Rectangle r11 = new Rectangle(label11­.Location.X, label11.Location.Y, label11.Size.Width, label11.Size.He­ight);
Rectangle r12 = new Rectangle(label12­.Location.X, label12.Location.Y, label12.Size.Width, label12.Size.He­ight);
Rectangle r13 = new Rectangle(label13­.Location.X, label13.Location.Y, label13.Size.Width, label13.Size.He­ight);
Rectangle r14 = new Rectangle(label14­.Location.X, label14.Location.Y, label14.Size.Width, label14.Size.He­ight);
Rectangle r15 = new Rectangle(label15­.Location.X, label15.Location.Y, label15.Size.Width, label15.Size.He­ight);
Rectangle r16 = new Rectangle(label16­.Location.X, label16.Location.Y, label16.Size.Width, label16.Size.He­ight);
Rectangle r17 = new Rectangle(label17­.Location.X, label17.Location.Y, label17.Size.Width, label17.Size.He­ight);

if (rPlayer.Inter­sectsWith(rFi­nish))
{
finish();
}
if (rPlayer.Inter­sectsWith(r1))
{
start();
}
if (rPlayer.Inter­sectsWith(r2))
{
start();
}
if (rPlayer.Inter­sectsWith(r3))
{
start();
}
if (rPlayer.Inter­sectsWith(r4))
{
start();
}
if (rPlayer.Inter­sectsWith(r5))
{
start();
}
if (rPlayer.Inter­sectsWith(r6))
{
start();
}
if (rPlayer.Inter­sectsWith(r7))
{
start();
}
if (rPlayer.Inter­sectsWith(r8))
{
start();
}
if (rPlayer.Inter­sectsWith(r9))
{
start();
}
if (rPlayer.Inter­sectsWith(r10))
{
start();
}
if (rPlayer.Inter­sectsWith(r11))
{
start();
}
if (rPlayer.Inter­sectsWith(r12))
{
start();
}
if (rPlayer.Inter­sectsWith(r13))
{
start();
}
if (rPlayer.Inter­sectsWith(r14))
{
start();
}
if (rPlayer.Inter­sectsWith(r15))
{
start();
}
if (rPlayer.Inter­sectsWith(r16))
{
start();
}
if (rPlayer.Inter­sectsWith(r17))
{
start();
}
}

// CONTROL:
public void Form1_KeyDown(ob­ject 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;
}

// RECTANGLE:
rectangle();
}
// FINISH:
public void finish()
{
watch.Stop();
string time = watch.Elapsed­.Seconds.ToStrin­g();
Form Start = new Form();
Start.Show();
MessageBox.Show("Con­gratulations! " + "Your time: " + time + " seconds.");
}
}
}

A já chci každý ten VOID uložit zvlášť do souboru, abych je mohl využít i u jiného programu. Např. public void Form1_KeyDown, který rozhoduje, která klávesa byla stisknuta.

 
Nahoru Odpovědět 15.9.2013 21:33
Avatar
Odpovídá na noName
Michael Olšavský:

Děláš si srandu? Přečteš si už ty tutoriály nebo ne? To je naprostá blbost, to co se snažíš

 
Nahoru Odpovědět 15.9.2013 21:34
Avatar
noName
Neregistrovaný
Avatar
noName:

Že to není technicky možné?

 
Nahoru Odpovědět 15.9.2013 21:38
Avatar
Kit
Redaktor
Avatar
Odpovídá na noName
Kit:

Ještě jsi nepřišel na to, co znamená slovo void?

Nahoru Odpovědět 15.9.2013 21:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
noName
Neregistrovaný
Avatar
noName:

tak void nevrací hodnoty ne?

 
Nahoru Odpovědět 15.9.2013 21:43
Avatar
Kit
Redaktor
Avatar
Odpovídá na noName
Kit:

No vida, a jak se tedy říká tomu, co má vlastnost void a týká se nějakého kusu programu?

Nahoru Odpovědět 15.9.2013 21:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
noName
Neregistrovaný
Avatar
noName:

Myslíš metodu?

 
Nahoru Odpovědět 15.9.2013 21:58
Avatar
Kit
Redaktor
Avatar
Odpovídá na noName
Kit:

Skvělé. Když místo slova "void" budeš používat slovo "metoda", tak ti snad ostatní budou rozumět.

Škoda, že sis nevšiml tlačítka pro vložení zdrojového kódu. Je mezi tlačítkem pro kurzívu a tlačítkem pro vložení nicku. Pak by se tvůj kód ostatním sice také nelíbil, ale byl by podstatně čitelnější.

Nahoru Odpovědět 15.9.2013 22:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

Soutěž o nejpekelnější kód ? Kdybys alespoň znal AND, OR operátory ... Zkus si prosím tě přečíst raději tutoriály a pak si budeš trhat vlasy, co jsi to vůbec napsal :)

 
Nahoru Odpovědět  +1 15.9.2013 22:34
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na noName
Honza Bittner:

Ukládat tvé metody každý do jiného souboru je blbost ...

Píšeš že tam chceš dát metodu na ovládání vstupu klávesnice ...
Proč si na to neuděláš třídu ?

Dávat každou metodu do jednoho souboru, přičemž může být třeba 5 metod podobných, jen u jedné ověřuješ stisk, u druhé podržení atd. je dost špatné ...

Jak ti radí ostatní, nevyšiluj a přečti si ZNOVA celý tutoriál na C#.

Nahoru Odpovědět 16.9.2013 7:58
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

To je opravdu katastrofa. Přečti si ty zdejší tutoriály. Ty tvé "voidy" stejně v jiném programu fungovat nebudou například ten "void" co určuje stisknutou klávesu. A to jednodušše proto že to je callback události KeyDown na Formu :`

Nahoru Odpovědět  +1 16.9.2013 8:12
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na noName
Luboš Běhounek (Satik):

Pokud chceš kód jedné třídy rozstrkat do víc souborů, tak se koukni na klíčové slovo partial.

Nahoru Odpovědět 16.9.2013 8:36
:)
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Luboš Běhounek (Satik)
noName:

Děkuji. Konečně mi někdo stručně odpověděl.

 
Nahoru Odpovědět 16.9.2013 8:38
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

Ano používej partial pokud to má smysl. V tvém případě to smysl nemá. Podívej se na tutoriály o OOP a sám poznáš že by js to mohl napsat mnohem lépe ;)

Nahoru Odpovědět 16.9.2013 8:40
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
noName
Neregistrovaný
Avatar
noName:

Už na tom pracuji :D Například jsem zkoušel využít && pro

if (rPlayer.IntersectsWith(r1))
{
start();
}

ALE když to napíši:

if (rPlayer.IntersectsWith(r1&&r2))
{
start();
}

tak to nejede :(

 
Nahoru Odpovědět 16.9.2013 8:48
Avatar
Odpovídá na noName
Luboš Běhounek (Satik):

Myslím, že by ten kód mohl klidně zůstat v jednom souboru, zatím to není složitý kód ;)

Zaměř se raději na kód metody rectangle, dala by se napsat asi na 5 řádků :) .

Nahoru Odpovědět 16.9.2013 8:50
:)
Avatar
Odpovídá na noName
Luboš Běhounek (Satik):

Bylo by to takhle:

if (rPlayer.IntersectsWith(r1) || rPlayer.IntersectsWith(r2))
{
  start();
}

Ale doporučuji to přepsat úplně :)

Nahoru Odpovědět 16.9.2013 8:52
:)
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Luboš Běhounek (Satik)
noName:

Stále nemohu najít cestu pro jednodušší řešení než:

if (rPlayer.IntersectsWith(r1) || rPlayer.IntersectsWith(r2))
 {
   start();
 }

poradíš mi prosím?

 
Nahoru Odpovědět 16.9.2013 9:57
Avatar
Jakub Lásko[Saarix]:

Zkus se mrknout na cyklus foreach a skze něj prověř ty své rectangly zda nekolidují s hráčem. Poznámka nezapomeň si udělat list těch rectanglů, aby jsi je mohl projet.

Nahoru Odpovědět 16.9.2013 10:13
Časem je vše možné.
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Jakub Lásko[Saarix]
Honza Bittner:

nemůžeš napsat:
if (rPlayer.Inter­sectsWith(r1&&r2))
chceš napsat 2 parametry do 1dnoho ...

udělej si metodu na :
if (rPlayer.Inter­sectsWith(r1,r2))

Nahoru Odpovědět 16.9.2013 10:16
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza Bittner
Jakub Lásko[Saarix]:

Tuším že to neměla být odpověď mě? :-)

Nahoru Odpovědět 16.9.2013 13:03
Časem je vše možné.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

Nemůžeš spojovat parametry, musíš spojit ty výsledky. Když se zamyslíš nad tím kódem, tak i když spustíš hned u první podmínky ten start, tak se potom testujou ty všechny. (je to zbytečné - ale to je jen takový detail)

Jestli si pamatuju, jsi ten člověk, co dělal ty microsoftácké tutoriály.

Takže jestli ano, tak několik rad:

Ty všechny labely můžeš získat skrz foreach cyklus z formuláře :

foreach (Control c in Controls)
            {
                if (c is Label)
                {
                    // TODO
                }
            }

Pozn. Kdyby to bylo v panelu, tak by jsi akorát volal panel.Controls místo Controls.

Každý label má vlastnost ClientRectangle (velikost toho labelu), takže si je stačí uložit někde na začátku programu a jen snima pracovat.

Vytvořil by sis privátní list:

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

přidal do listu v konstruktoru všechny ty velikosti a souřadnice těch labelů

foreach (Control c in Controls)
            {
                if (c is Label)
                {
                    rectangles.Add(c.ClientRectangle);
                }
            }

A pak si jen napsal metodu, která ti proiteruje toho playera se zbytkem těch rectanglu.

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

           return false;
       }

Takže tvůj kód by byl

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

Tvůj kód je pak univerzální, že ať předěláš své bludiště jakkoliv (bylo by těm těch labelů třeba 1000) tak nebudeš vytvářet r1 - r1000 (kdybys použil alespoň pole), ale jednoduše si pomůžeš.

Snad ti to pomůže :)

 
Nahoru Odpovědět 16.9.2013 14:09
Avatar
Odpovídá na noName
Luboš Běhounek (Satik):

Jak píše Jakub Lásko[Saarix] - místo procházení každého labelu a kolizí ručně v kódu použij cyklus a kolize testuj v něm.

Budeš potřebovat foreach (nebo případně for) cyklus a v něm projít všechny labely, které představují překážky (najdeš je třeba u formuláře v kolekci Controls a zareagovat na to.

Nahoru Odpovědět 16.9.2013 14:09
:)
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Jan Vargovský
noName:

Díky. Přesně takto sem si to představoval, jen jsem nevěděl jak na to :D

 
Nahoru Odpovědět 16.9.2013 16:10
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

Problémem který tu všichni řešíme je ten, že zřejmě nechápeš přesně co se tam děje :) Pokud to potřebuješ splácat narychlo, opisuj. Pokud tomu chceš porozumět přečti si zdejší tutoriály ;)

Nahoru Odpovědět 16.9.2013 17:08
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jiří Gracík:

ještě 500x mu to řekněte, evidentně o ně má veliký zájem :)

Nahoru Odpovědět 17.9.2013 0:02
Creating websites is awesome till you see the result in another browser ...
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Jiří Gracík
noName:

Zájem mám, ale prvně musím dodělat toto :(

 
Nahoru Odpovědět 17.9.2013 7:28
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Jan Vargovský
noName:

Stále mi to nejede :( Můžeš prosím vložit ty kódy do mého kódu?
Labely jsou umístěny na panel1

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();
        }

        // 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;
            }
        }
        // FINISH:
        public void finish()
        {
            watch.Stop();
            string time = watch.Elapsed.Seconds.ToString();
            MessageBox.Show("Congratulations! " + "Your time: " + time + " seconds.");
        }
    }
}

Předem děkuji.

 
Nahoru Odpovědět 17.9.2013 12:24
Avatar

Neregistrovaný
Avatar
Odpovídá na Petr Nymsa
:

Odpovídá na Zirko

A ano, toto potřebuji udělat narychlo, ale hned jak to dokončím, začnu studovat tutoriály!

 
Nahoru Odpovědět 17.9.2013 12:32
Avatar
Odpovídá na noName
Luboš Běhounek (Satik):

Teď musíš někam pověsit ty kontroly pozic, jestli hráč nekoliduje s nějakým objektem - udělej si na to metodu a volej ji třeba na konci form1_keydown.

Do té kontrolní funkce musíš dát cyklus, kde projedeš všechny Controls toho panelu a zkontroluješ, jestli nekoliduje s hráčem.

Nahoru Odpovědět 17.9.2013 12:54
:)
Avatar
Odpovídá na
Jakub Lásko[Saarix]:

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

Nahoru Odpovědět 17.9.2013 14:40
Časem je vše možné.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:
  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:

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:

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ý
Redaktor
Avatar
Jan Vargovský:

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:

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:

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ý
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

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:

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:

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
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

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:

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ý
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

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:

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ý
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

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ý
Redaktor
Avatar
Jan Vargovský:

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:

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 67 zpráv z 67.