[C#] Karetní hra

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod cejdap 28. 2. 2009 22:04

Chtel bych si naprogramovat v C# hru Solitaire jako je ve windows.
Da se to naprogramovat ve winforms? Jde mi o to presouvani karet( to nevim jak bych udelal).
Nebo v cem by to slo ?

Diky za rady.
cejdap
Junior
Uživatelský avatar


Odeslat příspěvekod steelspace 1. 3. 2009 12:49

Jestli začínáš, tak bych rovnou použil WPF. Oproti WinForms se s tím tyhle věci dají dělat daleko snadněji. (Podpora vektorové grafiky, 3D, hardwarová akcelerace).
steelspace
Junior

Odeslat příspěvekod cejdap 2. 3. 2009 19:44

Diky :)

Ted bych potreboval poradit s premistovanim objektu pomoci mysi.
Kód: Vybrat vše
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 PohybObjektu
{
    public partial class Form1 : Form
    {
        private bool bPohyb = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                bPohyb = true;
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (bPohyb)
            {
                pictureBox1.Left = e.X;
                pictureBox1.Top = e.Y;
               
                if (pictureBox1.Left <= 0)
                    pictureBox1.Left = 0;
                else if (pictureBox1.Left >= Width - pictureBox1.Width)
                    pictureBox1.Left = Width - pictureBox1.Width;
                if (pictureBox1.Top <= 0)
                    pictureBox1.Top = 0;
                else if (pictureBox1.Top >= Height - pictureBox1.Height)
                    pictureBox1.Top = Height - pictureBox1.Height;
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            bPohyb = false;
        }
    }
}



V tomhle mi to presouva obrazek nejak divne a furt mi blika :(

Ja bych chtel, kdyz zmacknu levy klik a nez ho pustim tak se mi obrazek bude posouvat podle mysi tak jak to je ve windows solitaire.

Dekuji za rady :)


edit:
tak uz jsem to opravil :)

Kód: Vybrat vše
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 PohybObjektu
{
    public partial class Form1 : Form
    {
        private bool bPohyb = false;
        private int iStartX, iStartY;

        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                bPohyb = true;
                iStartX = e.X;
                iStartY = e.Y;
            }
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (bPohyb)
            {
                pictureBox1.Left = pictureBox1.Left + e.X - iStartX;
                pictureBox1.Top = pictureBox1.Top + e.Y - iStartY;
                //pictureBox1.Location = new Point(pictureBox1.Left + e.X - iStartX, pictureBox1.Top + e.Y - iStartY);
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            bPohyb = false;

            if (pictureBox1.Left <= 0)
                pictureBox1.Left = 0;
            else if (pictureBox1.Left >= Width - pictureBox1.Width)
                pictureBox1.Left = Width - pictureBox1.Width;
            if (pictureBox1.Top <= 0)
                pictureBox1.Top = 0;
            else if (pictureBox1.Top >= Height - pictureBox1.Height)
                pictureBox1.Top = Height - pictureBox1.Height;
        }
    }
}

cejdap
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 2. 3. 2009 21:28

Mno, asi to myslis dobre, ale je to spatny postup. "e.X" a "e.Y" neobsahuje pozici od rohu formu. Ale jsou tam relativni pozice od rohu toho pictureboxu.

Tady ma celkem univerzalni kod na pohyb, kterej mi funguje v pohode:
Kód: Vybrat vše
        public Form1()
        {
            InitializeComponent();
            foreach (Control control in this.Controls)
            {
                PictureBox pb = control as PictureBox;
                if (pb == null) continue;
                pb.MouseUp += new MouseEventHandler(mouseUp); // Tady priradim obsluhy udalosti k tem obrazkum. klidne si to naklikej v designeru, ale tohle je rychlejsi.
                pb.MouseDown += new MouseEventHandler(mouseDown); //a muzu pak bez problemu pohybovat vsemi pictureBoxy, ktere na tom formulari mam.
                pb.MouseMove += new MouseEventHandler(mouseMove);
            }
        }

        private Control karta = null; //promena, ktera urcuje, kterym prvkem formulare pohybuji.
        private int relativeX = 0;
        private int relativeY = 0;

        private void mouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) karta = sender as Control; //pri stisku si zapamatuji objekt k pohybovani
            if (karta != null)
            {
                relativeX = e.X; //a relativni pozice kurzoru mysi.
                relativeY = e.Y;
            }
        }

        private void mouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) karta = null; // pri pusteni mysi nebudu pohybovat objektem.
        }

        private void mouseMove(object sender, MouseEventArgs e)
        {
            if (karta == null) return;
            karta.Left = karta.Left + (e.X - relativeX); // posunu objekt o vzdalenost, kterou se posunula mys z minule polohy.
            karta.Top = karta.Top + (e.Y - relativeY);
        }
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod cejdap 3. 3. 2009 12:23

Diky, ale jsete by me zajimalo jak to udelam, kdyz budu ty karty vykreslovat pomoci graphics, zadny picturebox? Tam nemam za co to chytit.
A nebo co je lepsi ? Pouzit pictureboxy nebo ten graphics ?
cejdap
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 3. 3. 2009 14:33

Zalezi jak to budes delat.
Jestli si udelas "vlastni control" (tj potomka tridy Control) kteremu prepises metodu na vykreslovani, tak muzes klidne pouzit ten muj kod. Protoze ty udalosti a vlastnosti co pouzivam ma kazdy Control. Takze vlastne jen misto tridy "PictureBox" pouzijes nejakou tridu "MujNovyControlSobrazkemKaret".

Pokud chces vykreslovat "natvrdo" primo do toho formu, bez pouziti controls, tak i form obsahuje udalosti mysi. Jen si pak musis sam zjistit, ze kdyz kliknes na pozici X,Y, tak jaka karta tam je, aby jsi vedel s jakou kartou mas pohybovat.

A nebo treti moznost. Tridou Graphics vykreslis nejaky objekt typu Bitmap, a tuto bitmapu na tom formu zobrazis pomoci PictureBoxu.

No a jeste me napada par moznosti jak to udelat, ale ty se mi ted nechce psat. Takze moznosti mas dost. Zalezi na tobe jak to udelas.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod cejdap 3. 3. 2009 19:12

A jeste, kdyz dam do pictureboxu nejaky obrazek, ktery ma v sobe pruhlednost, tak se mi, pokud hodim vic pictureboxu pres sebe, neprojevi ta pruhlednost. On picturebox ma BackColor, ale tam nemuzu dat (none) a kdyz dam Transparent tak to nefunguje. Da se to udelat ?
cejdap
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 3. 3. 2009 22:57

Jo tak to nevim. Ale asi to nepujde.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod cejdap 10. 3. 2009 21:38

Kdyz si vytvorim potomka tridy control a prepisu mu metodu onpaint, tak mi to nsfunguje :(

Mohl by mi nekdo napsat kus kodu, kde budu mit potomka tridy control, ktery bude vykreslovat treba trojuhelnik nebo kruh ?
A nebo kdybych chtel aby ten mujvlastnicontrol mel tvar hexu, jak to presne udelat ?
cejdap
Junior
Uživatelský avatar

Odeslat příspěvekod sunamo 22. 3. 2009 01:03

Kód: Vybrat vše
/// <summary>
    /// Vypisuje text a elipsu..
    /// </summary>
    class MůjOP : Control
    {
       
        /// <summary>
        /// Napíše do levého rohu Moniko, Miláčku.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics grfx = e.Graphics;

            grfx.DrawString("text", Font, Brushes.Red, new Point(0,0));
            grfx.DrawEllipse(Statika.pero, Statika.rectangle);
        }

        /// <summary>
        /// Vypíše souř. v MB.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClick(EventArgs e)
        {
            base.OnClick(e);

            MessageBox.Show(this.Bounds.ToString());
        }
    }

T Statika obsahuje jen test. PP, pokud by ti to nefungovalo, mohu ji sem postnout..
sunamo
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků