Diskuze: Vlastní třída
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 17 zpráv z 67.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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)
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.
Vždyť jsem ti napsal všechen kód, stačí ho tam doplnit jako skládačku ...
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.
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?
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
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.");
}
}
}
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
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
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));
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.
Zobrazeno 17 zpráv z 67.