none
Kopírování objektu

    Dotaz

  • Zdravim,

    můj problém spočívá v tom, že mám primitivní hru (nejsem příliš pokročilý uživatel, ale něco zvládnu a většinu kódů si přelouskám), princip je jednoduchý, pohybujete se s panáčkem a sbíráte kuličky, to vše funguje, můj kámen úrazu je v druhé části, kdy potřebuji z kuliček "stavět", neboli přepnu si do druhého formuláře a chci aby se tečka zobrazila na pozici panáčka (také funguje)

       private void Form3_Paint(object sender, PaintEventArgs e)
            {
                
                kreslici_plocha = e.Graphics;
                    kreslici_plocha.FillEllipse(Brushes.Red, xElipsy, yElipsy, 19, 19);  
            }
    
    ---
    case Keys.Space:
    
                        xElipsy=xPanak;
                        yElipsy=yPanak;                  
                        Refresh();
                        break;
    Ale teď přichází kámen úrazu -> když přejdu na jinou pozici a chci znovu vykreslit kuličku, kulička se jen překreslí, nevytvoří nová (změní se souřadnice). A zde potřebuji pokud možno radu. Pevně věřím že to bude něco jednoduchého (i když ne, děkuji za každou radu). Jak již jsem řekl, nejsem moc pokročilý, proto jsem zkoušel najít různé kódy, bez úspěchu. (Není tu nějaka možnost na vyřešení přes cyklus, pole, save obrazovky, nějaké zakomponování "new"?) Doufám, že jsem popsal problém rozumě a smysluplně a že mi někdo poradí, předem děkuji za pomoc. btw jazyk: C#

    neděle 27. května 2012 16:53

Odpovědi

  • Dobrý den,

    ono celé je to postavené jinak než bych to udělal já ale s tím nebudu dělat nic. Každý programuje tak jak umí.

    MAX_KULICKY=100;

    publicpartialclassForm3:Form{

    int KulickyX[MAX_KULICKY];

    int KulickyY[MAX_KULICKY];

    boolean KulickyU[MAX_KULICKY];

    for (int i=0;i<MAX_KULICKY;i++) { KulickyU[i]=false; } int xElipsy = -300;

    private void Form3_Paint(object sender, PaintEventArgs e) { kreslici_plocha = e.Graphics; kreslici_plocha.DrawImage(PANAK, xPanak, yPanak, 45, 45);

    for (int i=0;i<MAX_KULICKY;i++) {

    if (KulickyU[i]) { kreslici_plocha.FillEllipse(Brushes.Red, KulickyX[i], KulickyY[i], 19, 19); } } }


    JCH

    • Upravený Jan Chaloupek pondělí 28. května 2012 14:11
    • Označen jako odpověď Peet čtvrtek 31. května 2012 19:29
    pondělí 28. května 2012 14:06
  • case keys.Space:    for (int i=0;i<MAX_KULICKY;i++) {      if (!KulickyU[i]) {        KulickyU[i]=true;        KulickyX[i]=xPanak;        KulickyY[i]=yPanak;

    break; }    }    Refresh();    break;

    Namám možnost teď zkontrolovat syntaxi ve studiu a opravdu raději programuji v pascalu nebo C++.

    .

    Pokud to řeší tvůj problém, označ to prosím jako odpověď.


    JCH

    • Upravený Jan Chaloupek úterý 29. května 2012 5:11
    • Označen jako odpověď Peet čtvrtek 31. května 2012 19:27
    pondělí 28. května 2012 15:24

Všechny reakce

  • Dobrý den,

    nevídime celý kód takže můžu jen odhadout, že problém je v tom že kreslíš pořád jen jednu kuličku. Máš někde zapamatované souřadnice všech kuliček? Bez toho to asi rozumě nepůjde.

    Vytvoř si pole, které bude obsahovat strukturu:

    • kulička je použita (use)
    • souřadnice (x, y).

    Vykreslování potom bude znamenat procházení položek pole a pokud zjistíš žekulička je použita, nakreslíš kuličku na jejích souřadnicích.

    Stačí to takto?


    JCH

    pondělí 28. května 2012 5:13
  • Částečně máte pravdu, zkusím trochu upřesnit + přikládám celý zdroj, kód.

    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 Panacek
    {
        public partial class Form3 : Form
        {
            
            
            int xElipsy = -300;
            int yElipsy = -300;
            
            int xPanak = 22, yPanak = 29;
            Image PANAK = Properties.Resources.panacek;
            Image PANAK_zada = Properties.Resources.panacek_zada;
            Image PANAK_bilej = Properties.Resources.panacek_white;
            Image PANAK_bilej_levo = Properties.Resources.panacek_white_left;
            Image PANAK_bilej_pravo = Properties.Resources.panacek_white_right;
            Graphics kreslici_plocha;
           
    
            public Form3()
            {
                InitializeComponent();
            }
            
            private void Form3_Load(object sender, EventArgs e)
            {
                label1.Text = Panacek.Form1.Score.ToString();
            }
    
            private void Form3_Paint(object sender, PaintEventArgs e)
            {
                
                kreslici_plocha = e.Graphics;
                kreslici_plocha.DrawImage(PANAK, xPanak, yPanak, 45, 45);
                
               
                    kreslici_plocha.FillEllipse(Brushes.Red, xElipsy, yElipsy, 19, 19);
                  
                
            }
     
    
            private void Form3_KeyDown(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.W:
                        yPanak -= 8;
                        PANAK = PANAK_zada;
                        
                        break;
    
    
                    case Keys.S:
    
                        yPanak += 8;
                        PANAK = PANAK_bilej;
                        break;
    
                        
    
                    case Keys.A:
    
                        xPanak -= 8;
                        PANAK = PANAK_bilej_levo;
                        break;
    
    
                    case Keys.D:
    
                        xPanak += 8;
                        PANAK = PANAK_bilej_pravo;
                        break;
    
                    case Keys.Space:
    
                        xElipsy=xPanak;
                        yElipsy=yPanak;
                        Refresh();
                        break;
    
                    case Keys.F12:
                        Application.Exit();
                        break;
    
                   
    
                }
                Refresh();
            }

    Problém je v tom, jak jste již říkal, že kreslím stále jednu a tu samou kuličku. (Ale nepotřebuji zapamatovat souřadnice kuliček)

    Já chci dejme tomu, mít v zásobě 100 kuliček. Dojdu na nějaké souřadnice a tam se vykreslí kulička, dojdu na další souřadnice, tam se vykreslí další kulička atd....

     Nejspíše bude řešení, jak jste psal v poli, ale jak jsem řekl, nejsem moc zběhlý programátor, proto v tom mám trochu guláš a mám problém s napsáním toho pole. Nevím jestli jsem to popsal lépe, ale ocenil bych pokud máte možnost, mi dát nějaký názorný příklad přímo do tohoto kontextu. Pokud by se to vyřešilo, byl bych vám mockrát vděčný.


    • Upravený Peet pondělí 28. května 2012 13:46
    pondělí 28. května 2012 13:45
  • Dobrý den,

    ono celé je to postavené jinak než bych to udělal já ale s tím nebudu dělat nic. Každý programuje tak jak umí.

    MAX_KULICKY=100;

    publicpartialclassForm3:Form{

    int KulickyX[MAX_KULICKY];

    int KulickyY[MAX_KULICKY];

    boolean KulickyU[MAX_KULICKY];

    for (int i=0;i<MAX_KULICKY;i++) { KulickyU[i]=false; } int xElipsy = -300;

    private void Form3_Paint(object sender, PaintEventArgs e) { kreslici_plocha = e.Graphics; kreslici_plocha.DrawImage(PANAK, xPanak, yPanak, 45, 45);

    for (int i=0;i<MAX_KULICKY;i++) {

    if (KulickyU[i]) { kreslici_plocha.FillEllipse(Brushes.Red, KulickyX[i], KulickyY[i], 19, 19); } } }


    JCH

    • Upravený Jan Chaloupek pondělí 28. května 2012 14:11
    • Označen jako odpověď Peet čtvrtek 31. května 2012 19:29
    pondělí 28. května 2012 14:06
  • No ono je to spíše celé taková jedna velká matlanice než nějaký smysluplný program :D

    Váš zápis jsem více-méně pochopil (není to spíše C++? protože v C# se to zapisuje trochu jinak, ale nevadí, to jsem si upravil) jen ten cyklus s tím KulickyU -> to je omezení na max hranici?

    Plus můj největší problém je v tom, jak to nastavit/napsat právě na tu klávesu Space

     case Keys.Space:
    
                        xElipsy=xPanak;
                        yElipsy=yPanak;
                        Refresh();
                        break;

    aneb -> "Teď kresli kuličku".

    Vím že tady asi otravuju nesmyslama a mnozí  si nejspíše drží hlavu v dlaních :D, ale ještě jsem to plně nepobral.

    pondělí 28. května 2012 14:48
  • case keys.Space:    for (int i=0;i<MAX_KULICKY;i++) {      if (!KulickyU[i]) {        KulickyU[i]=true;        KulickyX[i]=xPanak;        KulickyY[i]=yPanak;

    break; }    }    Refresh();    break;

    Namám možnost teď zkontrolovat syntaxi ve studiu a opravdu raději programuji v pascalu nebo C++.

    .

    Pokud to řeší tvůj problém, označ to prosím jako odpověď.


    JCH

    • Upravený Jan Chaloupek úterý 29. května 2012 5:11
    • Označen jako odpověď Peet čtvrtek 31. května 2012 19:27
    pondělí 28. května 2012 15:24
  • Sice to neni uplne presne, ale dost mi to pomohlo. Vyuzivam k tomu cyklus i poli, ktere jsem konecne alepson castecne pochopil. Dekuji za uzitecne rady a trpelivost.
    čtvrtek 31. května 2012 19:29