PictureBox(Kaczka) HitBox

0

Witam,
mam pytanie jak usunąć hitboxy w pictureboxie? Chodzi mi o to, że jak kliknę obok obrazka to coś się dzieje. Tak jak na poniższym obrazku mam kaczkę i jak kilkne obok niej to mi nalicza punkty i jak zrobić by tylko naliczało jeżeli kliknę na obiekt kaczki, a nie na pictureboxa?

Hitboxp.png

0

Wydaj mi się, że tak nie da rady. Bo zdarzenie clicknięcia dotyczy pictureboxa. Musiałbyś ewentualnie wyliczać poozycje kursora względem pictureboxa i wyeliminować te pozycje gdzie jest kaczka. ale to chyba dużo roboty

1

Albo lepszym rozwiązaniem byłoby sprawdzenie czy kliknąleś na pixel przeźroczysty. tu jest coś podobnego: https://stackoverflow.com/questions/2569538/detecting-if-a-png-image-file-is-a-transparent-image

0

Dzięki pomogłeś

2

A najlepszym rozwiązaniem jest zrobienie tego w Unity :)

0

Generalnie zależy od kaczki

Najtrywialniejszy hitbox, to chyba po prostu wysokość i szerokość obrazka z kaczką.

Dla tła dodajemy onclick zliczający nietrafione strzały, a obrazek z kaczką zalicza trafienia - i tyle

abc (1).gif

        public Form1()
        {
            InitializeComponent();

            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = Image.FromFile("woda.jpg");
            pictureBox1.Click += PictureBox1_Click;

            pictureBox2.Visible = false;
            pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox2.Height = 100;
            pictureBox2.Width = 100;
            pictureBox2.Image = Image.FromFile("kaczka.jpg");
            pictureBox2.Location = new Point(15, 15);
            pictureBox2.Click += PictureBox2_Click;
        }

        int score = 0;
        int missedshoots = 0;

        private void PictureBox1_Click(object sender, EventArgs e)
        {
            missedshoots++;
            label2.Text = $"Missed: {missedshoots}";
        }

        private void PictureBox2_Click(object sender, EventArgs e)
        {
            score++;
            label1.Text = $"Score: {score}";
        }

        async Task PutTaskDelay()
        {
            await Task.Delay(50);
        }

        async void GameLoop()
        {
            pictureBox2.Visible = true;
            while (true)
            {
                await PutTaskDelay();
                MoveKaczka();
            }
        }
        void MoveKaczka()
        {
            pictureBox2.Location = new Point
            (
               pictureBox2.Location.X + 1,
               pictureBox2.Location.Y + 1
            );
        }

        private void Start_Click(object sender, EventArgs e)
        {
            GameLoop();
        }
0

Pomysł Kolegi wyżej dot Unity jest najlepszy.
duzo gotowych mechanizmów (silników) + cross platform + C# :)
Wada że trochę słabe OOP jest wewnątrz (struktury, elastyczny wzorzec (nazwa mi uciekła) niestety wymusza częste rzutowania intancji klas ).

Sam nic nie robiłem ale dobry kolega w tym gry tworzy (mobilne) na zlecenia a także na codzień w tym pracuje... fajnie i ładnie to wygląda.
Proste gry, z podstawowa fizyka (mając grafiki) można zrobić w 1-2 tygodnie.
Czasem trzeba dopracować sterowanie/problemy sprzetowe dla konkretnej platformy ale i tak zajmuje to dużo mniej czasu niż pisanie "natywne" dla każdej platformy z osobna.

Pozdrawiam
P

0

@fprogrammer: zupełnie nie znając Unity i zupełnie nie znając Blendera (ani innych programów graficznych 3D) i pracując na etacie, zrobiłem w Unity prostą grę 3D (z zombiakami i zagadkami) w jakieś 3 tygodnie. Czyli potwierdzam - da się :D Pewnie zrobiłbym szybciej, gdybym umiał już wcześniej Blendera. Niestety niektóre modele musiałem sam sobie przygotować.

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