Statki - klasa plansza, metoda rysowania

0

Witam.

Mam pewien problem z klasą plansza do gdy w statki. Stworzyłem sobie klasę planszy, zawierającą w sobie współrzędne rysowania planszy i tablicę dwuwymiarową typów wyliczeniowych. Wszystko fajnie lecz mam problem ze stworzeniem metody rysowania planszy. Wykorzystuję do tego System.Drawing, gdy dodaje ten event Paint z poziomu Forma to wszystko gra i rysuje pięknie wszystko co chcę, lecz przy pisaniu metody cały czas jest coś nie tak. Próbowałem ominąć PaintEventArg za pomocą Graphics g = this.CreateGraphicts();, lecz nadal w przy metodzie w klasie to nie działa :( Jeśli wyraziłem się nie jasno to przepraszam, ale jestem początkującym, a jednak projekt trzeba oddać. Z góry dziękuję za pomoc;

0

lecz przy pisaniu metody cały czas jest coś nie tak

Po takim opisie problemu to raczej nikt nie zgadnie co jest źle...

0

hmm może to trochę rozjaśni problem:

 class Pola
    {
        public int x;
        public int y;
        public typPola[,] rozmiar;

        void rysuj(int x, int y, typPola[,] rozmiar)
        {
            Graphics graphics = this.CreateGraphics();
            Pen p = new Pen(Color.Black, 4);
            SolidBrush kolor_morze = new SolidBrush(Color.Aqua);
            SolidBrush kolor_statek = new SolidBrush(Color.DarkGray);
            SolidBrush kolor_zestrzelony = new SolidBrush(Color.Red);
            SolidBrush kolor_pudlo = new SolidBrush(Color.DarkBlue);
            for (int i = 0; i < 10; i++, x = x + 40)
            {
                for (int j = 0; j < 10; j++, y = y + 40)
                {
                    if (rozmiar[i, j] == typPola.pudlo)
                    {


                        graphics.FillRectangle(kolor_pudlo, x, y, 40, 40);
                        graphics.DrawRectangle(p, x, y, 40, 40);


                    }
                    else if (rozmiar[i, j] == typPola.statek)
                    {

                        graphics.FillRectangle(kolor_statek, x, y, 40, 40);
                        graphics.DrawRectangle(p, x, y, 40, 40);
                    }
                    else if (rozmiar[i, j] == typPola.zestrzelone)
                    {
                        graphics.FillRectangle(kolor_zestrzelony, x, y, 40, 40);
                        graphics.DrawRectangle(p, x, y, 40, 40);
                    }
                    else
                    {
                        graphics.FillRectangle(kolor_morze, x, y, 40, 40);
                        graphics.DrawRectangle(p, x, y, 40, 40);
                    }

                }

            }
        }

ewidentnie problem występuje z funkcją rysowania CreateGraphics(), Visual Studio wywala taki błąd:

Error 1 'statkiv3.Pola' does not contain a definition for 'CreateGraphics' and no extension method 'CreateGraphics' accepting a first argument of type 'statkiv3.Pola' could be found (are you missing a using directive or an assembly reference?) C:\Users\Luqaz\Desktop\STATKI - wersja z klasą, bez metody\statkiv3\Pola.cs 22 38 statkiv3

0

Musisz przekazać klasie Pola referencję do Formy najlepiej poprzez konstruktor klasy Pola i odwoływać się poprzez tą referencję a nie this.

0

czy mógłbyś mi pokazać jak napisać taki konstruktor odwołujący się do Formy?

0

wymieniłem this na

new Control()

bład nie występuje lecz rysowanie się nie odbywa, ktoś wie dlaczego tak jest ?

0
using System.Windows.Forms;

    class Pola
    {
        Form1 form;
        public Pola(Form1 form)
        {
            this.form = form;
        }

 
 Graphics graphics = form.CreateGraphics();
 
0

tylko przy inicjalizacji obiektu jaki argument wpisać?

0
 this
0

niestety to nie działa :(

1

Napisz osobną klasę na widok i logike. Możesz zrobić plansze pokolei dodając Controlki do flowpanelu,odpowiednio dobierzesz rozmiar i same sie ułożą jak trzeba :), + możesz przyokazji przypisać wszyskim odpowiednie eventy na klikniecie. W widoku dasz metodę w stylu

void SetFieldView(int no, ViewType type ){panel.Controls[no]."widok"= type;}
//i/lub
void SetFieldView(int x,int y, ViewType type ){panel.Controls[y*sizeX+x]."widok"= type;}


Dość wygodne i zaoszczędzisz dużo procesora na nie renderowaniu grafiki co 16 ms.

1 użytkowników online, w tym zalogowanych: 0, gości: 1