Červený kříž - nevykreslý se grafika – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Červený kříž - nevykreslý se grafika – .NET – Fórum – Programujte.comČervený kříž - nevykreslý se grafika – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
ronin0
Duch
13. 7. 2012   #1
-
0
-

Dobrý den,

s C# teprve začínám, proto omluvte případné nepochopení některých principů ať již samotného jazyka nebo OOP. Obracím se k vám s prosbou o pomoc. Zkoušel jsem hru - snake. Zasekl jsem se už na začátku. Přečetl jsem 3 učebnice, ale s podobným problémem jsem se nesetkal. Předpokládám, že problém bude v metodách při předávání pole.

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;

namespace Hra_had
{
    public partial class OknoProgramu : Form
    {

        Segment[] had = new Segment[100];
        


        public OknoProgramu()
        {
            
            InitializeComponent();
        }

        private void OknoProgramu_Paint(object sender, PaintEventArgs e)
        {
            
             Graphics kp =  e.Graphics;
             Segment.KresliHada(kp, had);
            
            

        }

        private void OknoProgramu_Load(object sender, EventArgs e)
        {


            Segment.vytvoř(had);
           
        }
    }
}



 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;

namespace Hra_had
{
     class Segment
    {

        public int xStředu, yStředu;
        public const int šířka = 20, výška = 20;
        public static int částíHada = 4;

        public static void KresliHada(Graphics kp, Segment[] s)

        {
            for (int i = 0; i <= částíHada; i++)
            {
                int x = s[i].xStředu - šířka / 2 ;
                int y = s[i].yStředu - výška / 2;

                kp.DrawEllipse(Pens.Black, 50, 50, šířka, výška); 
            }

        }

         // Zde použít konstruktor
        public static void vytvoř(Segment[] s)
        {
            s[0].xStředu = 200;
            s[0].yStředu = 250;
            for (int i = 1; i <= 4; i++)
            {
                s[i].xStředu = s[0].xStředu - šířka*i;
                s[i].yStředu = s[0].yStředu;
            
            }
        }
    }
}

Děkuji


Nahlásit jako SPAM
IP: 89.102.171.–
ronin0
Duch
13. 7. 2012   #2
-
0
-

#1 ronin
Teď jsem tam objevil ještě pár kosmetických chybiček, které jsem natropil, když hledal problém. U kreslení elipsy má být samozřejmě místo 50 x a y.

Nahlásit jako SPAM
IP: 89.102.171.–
Marvin
~ Anonymní uživatel
23 příspěvků
13. 7. 2012   #3
-
0
-

Nejsem si jistý ale myslím že je problém v tom, že při vytváření dáš hada metodě ale už si ho nevezmeš spět. Upravit by to šlo asi takto:

public static Segment[] vytvoř(Segment[] s)
        {
            s[0].xStředu = 200;
            s[0].yStředu = 250;
            for (int i = 1; i <= 4; i++)
            {
                s[i].xStředu = s[0].xStředu - šířka*i;
                s[i].yStředu = s[0].yStředu;
           
            }
        }

a volat had = vytvoř(had)

nejsem si jistí zda to funguje píšu z hlavy

Nahlásit jako SPAM
IP: 90.176.13.–
Řešení
zdenda
~ Anonymní uživatel
257 příspěvků
13. 7. 2012   #4
-
0
-
Vyřešeno Nejlepší odpověď

To pole 'had' musíš ještě naplnit. had[x] = new Segment();

Nahlásit jako SPAM
IP: 80.188.216.–
zdenda
~ Anonymní uživatel
257 příspěvků
13. 7. 2012   #5
-
0
-

Případně teda ve vytvoř - s[x] = new Segment();

Nahlásit jako SPAM
IP: 80.188.216.–
Marvin
~ Anonymní uživatel
23 příspěvků
13. 7. 2012   #6
-
0
-

#4 zdenda
od to pole naplňuje v metodě vytvoř

Nahlásit jako SPAM
IP: 90.176.13.–
ronin0
Duch
14. 7. 2012   #7
-
0
-

Díky, už to funguje. Stačilo přidat Zdendův příkaz s[0] = new Segment();

Bohužel mi to připomíná jedno meme:

Měl jsem za to, že při deklaraci pole " Segment[] had = new Segment[100] " vytvořím 100 instancí třídy Segment, která budou již naplněna.

Nahlásit jako SPAM
IP: 89.102.171.–
Kolemjdoucí
~ Anonymní uživatel
71 příspěvků
16. 7. 2012   #8
-
0
-

Ne, jen vytvoříš pole pro uložení až 100 instancí třídy segment.

Po zavolání Segment[] had = new Segment[100] tam budeš mít jen 100 * NULL.

Nahlásit jako SPAM
IP: 78.128.198.–
ronin0
Duch
24. 7. 2012   #9
-
0
-

Had funguje, přesto mám ještě dvě drobnosti, které bych rád vyřešil.

1. V uživatelském rozhraní by mělo být možno změnit nastavení ovládání. Bohužel nefunguje zápis : 

Keys klávesa = new Keys();
klávesa = Keys.Left;
            switch (e.KeyCode)

            {
                case klávesa :

...

A ani žádný jiný, který jsem zkoušel. Case funguje pouze v případě, vložim-li do něho přímo Keys.Left

Nahlásit jako SPAM
IP: 89.102.171.–
ronin0
Duch
24. 7. 2012   #10
-
0
-

2. Snažil jsem se vyřešit žebříček (tabulku) nahraného skóre. Napadla mě varianta s připojení txt souboru do exe. Program by měl vyhodnotit, zdali se hráč dostal do tabulky a jestli ano, vyžadovat po něm jméno. Poté by se měl celý txt soubor přepsat, aby byl aktuální.

Bohužel jsem se zasekl již na začátku při pouhém přečtení txt souboru :

StreamReader soubor = new StreamReader(Properties.Resources.Žebříček);

string řádek, celýText = null;

            do
            {
                řádek = soubor.ReadLine();
                if (řádek != null)
                    celýText += řádek + Environment.NewLine;

            }
            while (řádek != null);
            textBox1.Text = celýText;
            soubor.Close();

Buď to hlásí problém s cestou, anebo se to tváří, jakoby byl soubor prázdný.

Nahlásit jako SPAM
IP: 89.102.171.–
TC
~ Anonymní uživatel
1 příspěvek
25. 7. 2012   #11
-
0
-

#9 ronin

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;

namespace Ronin
{
    public partial class Form1 : Form
    {
        delegate void Ronin();
        Dictionary<Keys, Ronin> map;
        public Form1()
        {
            InitializeComponent();
            map = new Dictionary<Keys, Ronin>{
            {Keys.A,a},
            {Keys.B,b}
           }; 
            KeyDown += new KeyEventHandler(Form1_KeyDown);
        }

        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (map.ContainsKey(e.KeyCode)) map[e.KeyCode]();
        }

        void a() { Text = "A"; }
        void b() { Text = "B"; }
    }
}
Nahlásit jako SPAM
IP: 213.169.104.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 25 hostů

Podobná vlákna

C++ grafika — založil Hornster

Grafika — založil Milan

Grafika — založil Michal115

Grafika — založil Gadael

2D grafika — založil Dušan

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý