C # динамически перемещать класс Picturebox с помощью мыши - PullRequest
0 голосов
/ 20 ноября 2018

В настоящее время я пытаюсь создать редактор уровня видеоигры и пытаюсь создать его так, чтобы пользователь мог добавлять объекты на экран, а затем манипулировать их расположением и размерами, а что нет. Я начинаю с того, что просто имею класс платформы, и этот метод я использую, чтобы позволить пользователю редактировать расположение платформ:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LevelEditor
{
    class Platform : PictureBox
    {

        private PictureBox platform = new PictureBox();

        public Platform(int width, int height, int x, int y)
        {
            platform.Width = width;
            platform.Height = height;
            platform.Location = new Point(x, y);
            platform.BackColor = Color.Red;
            platform.BorderStyle = BorderStyle.FixedSingle;
        }

        public void drawTo(Form form)
        {
            form.Controls.Add(platform);
        }

        public void setPosition(int x, int y)
        {
            platform.Location = new Point(x, y);
        }

        private Point MouseDownLocation;

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                MouseDownLocation = e.Location;
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (e.Button == MouseButtons.Left)
            {
                platform.Left = e.X + platform.Left - MouseDownLocation.X;
                platform.Top = e.Y + platform.Top - MouseDownLocation.Y;
            }
        }
    }
}

Проблема в том, что он не работает. Я знаю, что Platform даже не обнаруживает событие MouseDown, потому что я его отладил. Я не уверен, в чем проблема, и любая помощь приветствуется!

1 Ответ

0 голосов
/ 20 ноября 2018

Проблема заключалась в том, что, как указывалось в комментариях, я наследовал от Picturebox, но в качестве самого объекта использовал экземпляр переменной Picturebox. Исправленный код таков:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LevelEditor
{
    class Platform : PictureBox
    {

        public Platform(int width, int height, int x, int y)
        {
            this.Width = width;
            this.Height = height;
            this.Location = new Point(x, y);
            this.BackColor = Color.Red;
            this.BorderStyle = BorderStyle.FixedSingle;
        }

        public void drawTo(Form form)
        {
            form.Controls.Add(this);
        }

        public void setPosition(int x, int y)
        {
            this.Location = new Point(x, y);
        }

        private Point MouseDownLocation;

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                MouseDownLocation = e.Location;
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (e.Button == MouseButtons.Left)
            {
                this.Left = e.X + this.Left - MouseDownLocation.X;
                this.Top = e.Y + this.Top - MouseDownLocation.Y;
            }
        }
    }
}
...