zmiana położenia pictureboxów za pomocą kliknięcia myszką

0

Witam,

mam pola nazwane od A1 do H8 (tak, jest to szachownica) będące pictureboxami. Są to pola nieruchome. Stworzyłem pictureboxy będące figurami szachowymi. Jak zrobić aby po kliknięciu na picturebox z figurą, a następnie na picturebox wolnego pola szachowego, ta figura zmieniła swoje położenie.

1

Jeżeli tekstury figur masz w osobnych plikach graficznych, to możesz po kliknięciu picturebox z figurą zapisywać go do jednego nowego picturebox'a, a po kliknięciu docelowego sprawdzić, czy ruch jest prawidłowy i jeżeli tak to po prostu do docelowego przypisać teksturę z pierwszego a pierwszemu ją wyczyścić.
Przykład:

	PictureBox Figura = null;
        private void PictureBoxZFigura_Click(object sender, EventArgs e)
        {
            Figura = PictureBoxZFigura;
        }

        private void PictureBoxDocelowy_Click(object sender, EventArgs e)
        {
            if (RuchJestOk())
            {
                PictureBoxDocelowy.Image = Figura.Image;
                Figura.Image = null;
            }
        }

Oczywiście możesz też manipulować właściwością Location wybranego picturebox'a, ale moim zdaniem powyższe rozwiązanie będzie prostsze.

0

Jest to dla mnie zrozumiale przedstawione, dzięki. Wstępnie chciałbym ustawić aby figury poruszały się po polach od A1 do H8 poprzez kliknięcie w to pole myszką. Czym wtedy będzie PictureBoxDocelowy? Jakąś funkcją obejmującą te wszystkie pola?
W ten sam sposób PictureBoxZFigurą byłby jakimś zbiorem nazw figur z uaktywniającą się nazwą w zależności od klikniętej figury? Tak żeby nie kopiować tego kodu dla każdej osobnej nazwy figury 32 razy.

0
Eremen napisał(a):

Tak żeby nie kopiować tego kodu dla każdej osobnej nazwy figury 32 razy.
A więc nie chcesz tworzyć zdarzenia click dla każdego pola. To co ty chcesz? Zrobić zdarzenie click dla ogółu formy i sprawdzać co zostało naciśnięte według położenia kursora?

0
PictureBox Figura = null;
        private void PionCzarny_Click(object sender, EventArgs e)
        {
            Figura = PionCzarny;
        }

        private void C3_Click(object sender, EventArgs e) 
        {
            //if (RuchJestOk())
            //{
                C3.Image = Figura.Image;
                Figura.Image = null;
            //}
        }

I rozumiem że tak dalej muszę kopiować dla każdego pola od A1_Click do H8_Click i to dla każdej figury. Wychodzi kupa kodu... chyba że coś źle zrozumiałem.

Edit: nie wiem w jakie ramy wziąć kod aby wyświetlał się z kolorowaniem składni

dodanie znacznika <code class="csharp"> - Furious Programming

1
  1. Ramy: code=csh@rp
 (zamiast @ ma być a)
2. Nie wiem, czemu nagle wyskoczyłeś z tym "PionCzarny". Załóżmy, że mamy trzy pola: A1, A2, A3. Każde z nich jest innym PictureBox'em. Powiedzmy, że na polou A1 znajduje się obecnie pion. Musisz ignorować kliknięcia w puste pola, jeżeli wcześniej nie zostało zaznaczone pole z figurą. Jeśli już masz ten warunek sprawdzony, sprawdzasz, czy ruch jest poprawny, ale to inny temat, więc to pomińmy. Teraz już tylko musisz przenieść figurę z jednego pola na drugie. Oto przykładowy kod:
```csharp
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 _4p
{
    public partial class Form1 : Form
    {
        List<PictureBox> pola = new List<PictureBox>();
        int ZaznaczonaFigura = 3;	//Nieważne ile, byleby więcej, niż masz pól

        public Form1()
        {
            InitializeComponent();

            pola.Add(A1);
            pola.Add(A2);
            pola.Add(A3);
        }

        private void A1_Click(object sender, EventArgs e)
        {
            if (ZaznaczonaFigura == 3)
            {
                if (A1.Image != null)
                {
                    ZaznaczonaFigura = 0;
                }
            }
            else
            {
                if (A1.Image == null)
                {
                    A1.Image = pola[ZaznaczonaFigura].Image;
                    pola[ZaznaczonaFigura].Image = null;
                    ZaznaczonaFigura = 3;
                }
            }
        }

        private void A2_Click(object sender, EventArgs e)
        {
            if (ZaznaczonaFigura == 3)
            {
                if (A2.Image != null)
                {
                    ZaznaczonaFigura = 1;
                }
            }
            else
            {
                if (A2.Image == null)
                {
                    A2.Image = pola[ZaznaczonaFigura].Image;
                    pola[ZaznaczonaFigura].Image = null;
                    ZaznaczonaFigura = 3;
                }
            }
        }

        private void A3_Click(object sender, EventArgs e)
        {
            if (ZaznaczonaFigura == 3)
            {
                if (A3.Image != null)
                {
                    ZaznaczonaFigura = 2;
                }
            }
            else
            {
                if (A3.Image == null)
                {
                    A3.Image = pola[ZaznaczonaFigura].Image;
                    pola[ZaznaczonaFigura].Image = null;
                    ZaznaczonaFigura = 3;
                }
            }
        }
    }
}
0

Tylko ten kod trochę się nie sprawdza, ponieważ w Twoim kodzie jest sprawdzanie warunków dla kliknięcia w pole np. A1. Jeśli mam na polu A1 figurę np. piona to będę klikał w pbx z pionem a nie na pole szachownicy A1 pod nim. Więc nie będzie to praktycznie funkcja A1_Click tylko jakaś pion_Click

0

Nie wiem czy zauważyłeś, ale ten kod nie zamienia żadnego pbx, a jedynie teksturki różnych pól.

0
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        List<PictureBox> pola = new List<PictureBox>();
        List<PictureBox> figury = new List<PictureBox>();

        public Form1()
        {
            InitializeComponent();

            pola = new List<PictureBox> 
            {   H1, H2, H3, H4, H5, H6, H7, H8, 
                G1, G2, G3, G4, G5, G6, G7, G8, 
                F1, F2, F3, F4, F5, F6, F7, F8, 
                E1, E2, E3, E4, E5, E6, E7, E8, 
                D1, D2, D3, D4, D5, D6, D7, D8, 
                C1, C2, C3, C4, C5, C6, C7, C8, 
                B1, B2, B3, B4, B5, B6, B7, B8, 
                A1, A2, A3, A4, A5, A6, A7, A8, };

            figury = new List<PictureBox>
            {   PionBialy1, PionBialy2, PionBialy3, PionBialy4, 
                PionBialy5, PionBialy6, PionBialy7, PionBialy8,
                WiezaBiala1, WiezaBiala2, SkoczekBialy1, SkoczekBialy2,
                GoniecBialy1, GoniecBialy2, KrolBialy, DamaBiala,
                PionCzarny1, PionCzarny2, PionCzarny3, PionCzarny4,
                PionCzarny5, PionCzarny6, PionCzarny7, PionCzarny8,
                WiezaCzarna1, WiezaCzarna2, SkoczekCzarny1, SkoczekCzarny2,
                GoniecCzarny1, GoniecCzarny2, KrolCzarny, DamaCzarna };

            foreach (Control control in Controls)
            {
                if (control is PictureBox)
                { 
                    control.MouseClick += new MouseEventHandler(PictureBoxMouseClick);
                    control.MouseDown += new MouseEventHandler(PictureBoxMouseDown);
                }
            }
        }

        private void PictureBoxMouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point p = this.Location;
            }
        }
       /* private void PictureBoxMouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                PictureBox box = sender as PictureBox;
                box.Left += e.X - ((Point)box.Tag).X;
                box.Top += e.Y - ((Point)box.Tag).Y;
            }
        }*/

        private void PictureBoxMouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
               /* PictureBox box = sender as PictureBox;
                box.Tag = e.Location;*/
            }
        }
    }
}

wykorzystałem trochę kodu od Ciebie oraz trochę innego kodu z internetu i wyszło mi takie coś. Nie działa to jeszcze tak jak powinno. W komentarzach są fragmenty kodu z poprzedniego kodu który polegał na przenoszeniu pictureboxów poprzez lokalizowanie pozycji myszki w sposób płynny. Mi natomiast zależy na tym aby przemieszczać pictureboxy za pomocą kliknięcia w pbx z figurą, oraz kliknięcie na innego pbx(docelowego).

Chce wykonać to poprzez kliknięcie w pbx z figurą, pobranie jego lokacji, po czym kliknięcie na pbx docelowy i przeniesienie pbx-a z figurą na pbx docelowy poprzez zlokalizowanie lokacji pbx-a docelowego.

1
            pola.Add(A1);
            pola.Add(A2);
            pola.Add(A3);
            pola.Add(A4);
            pola.Add(A5);
            pola.Add(A6);
            pola.Add(A7);
            pola.Add(A8);
pola = new List<PictureBox> { A2, A3, A4, A5, A6, A7, A8 };
0
    foreach (Control control in Controls)
            {
                if (control is PictureBox)
                { 
                    control.MouseClick += new MouseEventHandler(PictureBoxMouseClick);
                }
            }
        }
        
        int klik = 0;
        private void PictureBoxMouseClick(object sender, MouseEventArgs e)
        {
            
            if (e.Button == MouseButtons.Left)
            {
                if (klik == 0)
                {
                    Point p = this.Location;
                    klik = 1;
                }
                else 
                {
                    if (klik == 1)
                    {
                        Point p = this.Location;
                        klik = 0;
                    }
                }
                
            }
        }    

wykombinowałem tak, że program pobiera lokację za 1 kliknięciem oraz za drugim kliknięciem przypisuje nową lokację do starej... ale nie działa jak powinno. Już sam nie wiem...

0

przy klik = 0 i klik = 1 cały czas masz Point p = this.location. Nic nie zmieniasz

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