_Q12_ Ответов: 2

Навигационные стрелки ?


-q12-
У меня есть UserControl с именем Background и простой класс NavigationArrows.

Этот класс NavigationArrows загружает кучу изображений*. png, отображающих некоторые стрелки, которые горят или не горят, в зависимости от нажатия клавиши пользователем.
Фон UC содержит большое фоновое изображение и панорамирует его через событие Background_KeyPress.
----
То, что я хочу, просто:
Я хочу соединить стрелки с событием нажатия клавиши.
(чтобы показать светящееся изображение стрелки при нажатии клавиши)
----
Но !
Я могу сделать это очень просто, все внутри UC. Но я этого не хочу.
Я хочу, чтобы класс NavigationArrows содержал все аспекты стрелок!!!!
загрузка изображений, то !!!События!!!, положение на холсте, размер стрелок и все остальное, о чем я сейчас не могу думать. Одним словом, содержать все свойства, события, методы, которые связаны с классом arrows / (или объектом, если хотите).
Моя большая проблема - это связи между двумя классами. Как соединить их простым и элегантным способом, логически, не путая.
Мой способ связать эти 2 класса очень запутан в коде. Слишком много споров тут и там. (Это не сбивает с толку из-за названий, которые я дал - не то) Это сбивает с толку из-за структуры, которую я должен построить !!! Он чрезвычайно запутан и wtf на каждом углу.
----
Прямо сейчас, на этой стадии я представляю код, это начало.
Но мне придется загрузить и связать остальные изображения стрелок (я не показывал этого здесь)-это еще не сценарий. Но я знаю по опыту, что она очень быстро агломерируется.
Кроме того, мне придется загружать и другие классы/объекты в canvas. Этот класс Arrow-всего лишь тест. Если мне нужно загрузить 100 классов, каждый из которых содержит свой собственный набор изображений (скажем, 50 img На класс), и со своими собственными методами и свойствами, и со своими собственными !!События!!, что они должны быть соединены с фоновым объектом (каким-то образом).
Вы понимаете, что я имею в виду под логическим путем и без путаницы ?
Это должно быть похоже на включение/выключение этой связи между объектом и классом. Что-то вроде:
UI. NavigationArrows navArrows = новый UI.NavigationArrows();
наварроуз.Активный();
navArrows.номер позиции(0,0);
navArrows.размер(20,20);
И это все. И они должны выполнять и выполнять свою работу!
Как я могу этого достичь?
Спасибо,
-q12-

Что я уже пробовал:

public partial class Background : UserControl
//...................

        //UI.NavigationArrows navArrows = new UI.NavigationArrows();
        Rectangle navArrowsRectangle = new Rectangle(10, 10, 100, 100);
        void Background_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(q1.backgroundImage, q1.rectangle);//BackgroundImage
             
            string imgName = "UI\\NavigationArrows OFF.png";
            Image BaseImg = Image.FromFile(imgName);
            e.Graphics.DrawImage(BaseImg, navArrowsRectangle);//NavigationArrows OFF
        }

        void Background_KeyPress(object sender, KeyPressEventArgs e)
        {
            int th12 = 0;
            if (e.KeyChar == 'w')
            {
                if (q1.rectangle.Y < 0) q1.rectangle.Y += q1.amount;
                else q1.rectangle.Y = 0;
            }
            if (e.KeyChar == 's')
            {
                th12 = -q1.imgy + this.Height;
                if (q1.rectangle.Y > th12) q1.rectangle.Y -= q1.amount;
                else q1.rectangle.Y = th12;
            }
            if (e.KeyChar == 'a')
            {
                if (q1.rectangle.X < 0) q1.rectangle.X += q1.amount;
                else q1.rectangle.X = 0;
            }
            if (e.KeyChar == 'd')
            {
                th12 = -q1.imgx + this.Width;
                if (q1.rectangle.X > th12) q1.rectangle.X -= q1.amount;
                else q1.rectangle.X = th12;
            }
            this.Refresh();//forPaintEvent
        }

и это мой второй класс, который я хочу переделать, чтобы он стал "сам по себе".
Я имею в виду, что он должен подключаться и играть в фоновом классе.
public class NavigationArrows
{

    public void  InitializeNavigationArrows()
    {
        string imgName = "UI\\NavigationArrows OFF.png";
        BaseImg = Image.FromFile(imgName);
    }
    public Image BaseImg;

Ralf Meier

Для моего понимания ... из-за твоего сообщения я немного запутался.

Что вы хотите переместить с помощью управления стрелками ? Что-то на форме, где находится стрелка-контроль ?
Должен ли этот элемент управления со стрелками всегда работать с клавишами - независимо от того, имеет ли этот элемент управления фокус или нет ?

_Q12_

.. и дать вам конкретные ответы на ваши вопросы.:
вы" - что вы хотите переместить с помощью стрелки-управления ? "
я: - ничего на данный момент - я хочу,чтобы они загружались при каждом конкретном нажатии клавиши.(w,a,s, d и комбинации).
вы" - что-то на форме, где находится стрелка-контроль ?"
я-на форме, на фоновом контроле, везде есть позиция ВКЛ.
вы "должны ли этот стрелочный контроль всегда работать с клавишами?
- независимое, имеет ли этот контроль фокус или нет ?"
я-да, работаю с ключами. И да, независимо от Фокуса.

_Q12_

Фон-это UserControl; NavigationArrows - это класс (но может быть чем угодно - и контроль тоже), но в моем примере, чтобы было легко объяснить, это класс.
На данный момент класс NavigationArrows должен реагировать на нажатие пользователем клавиши и вызывать соответствующее изображение на каждую нажатую клавишу.
Если 'ж' нажата, стрелка становится видимым, когда " п " выпущен, "NavigationArrows выкл.ПНГ" отображается по умолчанию. Очень просто!
Я ничего не говорил о функциональности стрелок (когда пользователь нажимает на стрелку мышью - она должна перемещать вещи) Ещё нет. Но разве это очень хороший момент, что когда-нибудь он будет реализован?
Мой вопрос не о стрелках как таковых, а об управлении кодом, файлами и когда все агломерировано, чтобы управлять им и поддерживать его достаточно чистым.
Когда у меня будут загружены все 9 изображений для стрелок, каждое из них должно быть связано с событием нажатия клавиши и срабатывать при нажатии определенной клавиши и комбинации клавиш (например, "wa" или "sd").
И поверьте мне, когда я говорю, что 9 изображений создают хаос в коде, если они не "должным образом" (я еще не знаю, как это сделать) управляются и планируются.
А 9-это просто и мало, но что делать, когда у меня есть 50 других класов, для персонажей, врагов, пуль, взрывов и т. д... Как я буду [интегрировать] их все на одной странице кода и [видеть] их без путаницы. Все, что я могу сделать со своими знаниями до сих пор, - это хороший кодовый суп, с большой головной болью и крайней интенсивной концентрацией, когда он должен быть более расслабленным и упорядоченным. Но я еще не знаю этого - ты должен умно пукнуть для меня. И я поймаю его и буду счастлив. :)))

Ralf Meier

ОК... Я пытаюсь возобновить то, что вы сказали :
- обычно на экране ничего не видно
- если вы нажмете (например) клавишу "w", то Стрелка вверх-картинка появится в определенном положении на экране. То же самое и с другими ключами.

Если вы скажете ему" Да", вы должны сделать что-то вроде этого :
- ключи обычно принадлежат элементу управления, который имеет фокус. Самый простой способ решить эту проблему: эта функциональность является частью формы. Другие формы, которые должны иметь ту же функциональность, могут быть получены из этой формы.
- изображения, которые вам нужны для этого, могут принадлежать к этому классу (возможно, это может быть компонент - который позволит вам сделать некоторые настройки с помощью пользовательского интерфейса)

Я думаю, вы пытаетесь разработать своего рода игру.
В данный момент мне очень трудно быть более конкретным, потому что я не могу себе представить, какова ваша цель на данный момент и какая является конечной целью.

_Q12_

вы- " если вы нажмете (например) "w", то Стрелка вверх-картинка появится в определенном положении на экране. То же самое и с другими ключами."
я-правильно!
вы: "ключи обычно принадлежат элементу управления, который имеет фокус. "
мне - очень хорош этот пункт! Мой управления, что упор будет сделан на фоне управления. На этом элементе управления я уже рисую большое фоновое изображение. Теперь я нарисую вторичное изображение под названием NavigationArrows. Но я хочу нарисовать его снаружи этого фона UC. Я хочу рисовать с урока. Что-то такое, что соберет воедино все мелкие детали об этой стреле.

BillWoodruff

1. это Windows Forms ? Что такое "основная форма"; что такое любые другие формы ?

1. а где же фон пользовательского элемента управления расположены ? на "основной форме"?

2. визуальные элементы "клавиши со стрелками" также являются пользовательскими элементами управления ? или, их тянет на пользовательский элемент управления или форму с помощью краски.

_Q12_

да, его оконные формы. На фоне пользовательский элемент управления создается на форму form1, да. NavigationArrows-это простой класс. Он используется внутри события paint из фонового элемента управления.
Background_Paint недействительным(объект отправителя, объект painteventargs е)
{
е.Графика.Функция drawImage(БГ.раздел backgroundimage БГ.прямоугольник); //раздел backgroundimage
е.Графика.DrawImage (наварроу.Active (), navArrowsRectangle); / / NavigationArrows
}

BillWoodruff

Я думаю, что если вы поместите какой-то "визуальный индикатор" в пользовательский интерфейс, он должен реагировать на то, что пользователь нажимает на него. Я бы хотел, чтобы щелчок по вашим навигационным стрелкам вызвал событие "щелчок", на которое можно подписаться везде, где обрабатываются события клавиатуры для вашего приложения.

_Q12_

Я также представил решение!
Но это неправильно... Ну, это правильно и работает так, как там написано, но не удовлетворяет моим потребностям.Вы можете понять, что я делаю из этого решения, потому что там весь фоновый UserControl.

BillWoodruff

Я думаю, что есть гораздо более простой способ сделать это без использования краски.

Но сначала вам нужно отредактировать и упростить описание того, что вы пытаетесь реализовать.

Является ли "фоновый элемент управления" контейнером, содержащим растровое изображение ,и вы хотите, чтобы клавиши со стрелками перемещали изображение?

_Q12_

Я могу панорамировать растровое изображение фонового изображения, то есть внутри контейнера "BackGround Control". Я уже сделал это. Я действительно включил частичный код для этого аспекта здесь:
(вы можете увидеть это в моем запросе и в моем решении)
Background_Paint недействительным(объект отправителя, объект painteventargs е)
{
е.Графика.Функция drawImage(БГ.раздел backgroundimage БГ.прямоугольник); //раздел backgroundimage
}

и все, что находится внутри:
void Background_KeyDown(отправитель объекта, KeyEventArgs e)
речь идет об этом растровом изображении,перемещаемом клавишами (w,a,s, d).

Однако проблема немного сложнее,чем использование растровых изображений, стрелок или события Paint, потому что это маленькие винтики. Меня больше интересует коробка, в которой находятся эти шестеренки, и связь между коробками.

Прямо сейчас, в моем решении я уже сделал класс
UI. NavigationArrows, который содержит пути к изображениям и некоторые методы подключения к UControl. Но этот класс больше похож на расширение. Я хочу его "самого по себе".
Все, что я хочу, это "инкапсулировать" /или/собрать все [navArrow] из фонового UControl и сделать один класс/или/объект/или что угодно и иметь чистый UControl, только с 1 или 2 ссылками на этот класс navArrow.

_Q12_

Я также обновил свое решение!
Я поместил туда весь UserControl. Вы можете видеть все, и фоновое растровое изображение тоже. Видимо, все не так просто, как я думал. Спасибо.

BillWoodruff

Ваш код теперь гораздо более читабелен ! Я постараюсь ответить в ближайшее время.

твое здоровье, Билл

_Q12_

Большое спасибо! Пожалуйста, не торопитесь. Теперь я знаю, что ответить на этот вопрос нелегко. Но это мне очень поможет.(и все, кто заинтересован)

2 Ответов

Рейтинг:
1

_Q12_

Вот о чем я говорил!
И я жалуюсь потому что это очень расстраивает и раздражает;
Посмотри, во сколько мест ввинчен наварроу.
Я выделю их для вас.
Это очень уродливый код - и я не могу сделать другого, что этот.
Это основной код, который я обычно могу сделать.

Представьте себе, что теперь мне нужно добавить еще один класс (ы) с изображениями внутри него.
Только представьте себе размер WTF, когда я ищу что-то, что можно найти в этом стоге сена кода!

Отредактированы: Я показываю весь UserControl !

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

namespace game_GameMap
{
    public partial class Background : UserControl
    {
        public struct BackgroundImage_
        {
            public int imgx, imgy;
            public int amount;
            public Image backgroundImage;
            public Rectangle rectangle;
            public Size windowSize;
        }
        public BackgroundImage_ bg = new BackgroundImage_();
        void Initialize_bg()
        {
            bg.amount = 50;
            string imgName = "assets\\map1Moon.jpg";
            bg.backgroundImage = Image.FromFile(imgName);
            bg.imgx = 736 * 3; bg.imgy = 552 * 3;
            bg.rectangle = new Rectangle(0, 0, bg.imgx, bg.imgy);
            bg.windowSize = this.Size;
        }
        public Background()
        {
            InitializeComponent();
        }
        private void Background_Load(object sender, EventArgs e)
        {
            DoubleBuffered = true;
            this.KeyDown += new KeyEventHandler(Background_KeyDown);
            this.KeyUp += new KeyEventHandler(Background_KeyUp);
            this.Paint += new PaintEventHandler(Background_Paint);
            Initialize_bg();

            navArrow.aInitializeNavigationArrows(); //navArrowPos();
        }




       
        void Background_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bg.backgroundImage, bg.rectangle);//BackgroundImage
            e.Graphics.DrawImage(navArrow.Active(), navArrowsRectangle);//NavigationArrows
        }

       
        UI.NavigationArrows navArrow = new UI.NavigationArrows();
        int navarrowX = 100, navarrowY = 100;
        Rectangle navArrowsRectangle;
        void navArrowUpdatePosition()
        {
            navarrowX = this.Width / 2 - 50; navarrowY = this.Height - 100;
            navArrowsRectangle = new Rectangle(navarrowX, navarrowY, 100, 100);
        }
        void Background_KeyDown(object sender, KeyEventArgs e)
        {
            navArrowUpdatePosition();

            int th12 = 0;
            if (e.KeyCode == Keys.W)
            {
                navArrow.GetKey("w");
                if (bg.rectangle.Y < 0) bg.rectangle.Y += bg.amount;
                else bg.rectangle.Y = 0;
            }
            if (e.KeyCode == Keys.S)
            {
                navArrow.GetKey("s");
                th12 = -bg.imgy + this.Height;
                if (bg.rectangle.Y > th12) bg.rectangle.Y -= bg.amount;
                else bg.rectangle.Y = th12;
            }
            if (e.KeyCode == Keys.A)
            {
                navArrow.GetKey("a");
                if (bg.rectangle.X < 0) bg.rectangle.X += bg.amount;
                else bg.rectangle.X = 0;
            }
            if (e.KeyCode == Keys.D)
            {
                navArrow.GetKey("d");
                th12 = -bg.imgx + this.Width;
                if (bg.rectangle.X > th12) bg.rectangle.X -= bg.amount;
                else bg.rectangle.X = th12;
            }
            this.Refresh();//forPaintEvent
        }
        void Background_KeyUp(object sender, KeyEventArgs e)
        {
            navArrow.GetKey("none");
            this.Refresh();
        }
        private void Background_SizeChanged(object sender, EventArgs e)
        {
            navArrowUpdatePosition(); 
            this.Refresh();
        }

    }
}


BillWoodruff

Пожалуйста, не публикуйте правки и обновления вашего вопроса в качестве решения; вместо этого включите их в свой оригинальный пост.

_Q12_

пожалуйста, поймите, что это реальное решение - код здесь работает в реальности - вы можете проверить его сами, если хотите. Здесь нет ничего неуместного. Кроме того, оригинальный пост уже очень длинный, добавив Это, я делаю его огромным. Вы хотите, чтобы я сделал его огромным? Но это решение неверно в то же время, я уже писал почему... Надеюсь, не так уж трудно понять, что я хочу получить.
Спасибо Вам за понимание.

Рейтинг:
0

_Q12_

(извините за то, что я делаю несколько решений, но это ради ясной визуализации и понимания.)
Я еще больше упростил свою задачу...
И у меня есть 1 Ссылка NavigationArrows в каждом событии!
Если я смогу фильтровать больше...
Я представляю себе, что это должно быть что-то вроде этого:
Внутри класса NavigationArrows, чтобы иметь возможность реализовать каждое событие, как это происходит здесь, в фоновом режиме UserControl. Иметь паралельную реализацию события в 2-х местах, но на самом деле быть одним и тем же событием.
Возможен ли такой маневр ?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using game_GameMap_v2.UI;

namespace game_GameMap_v2
{

    public partial class Background : UserControl
    {
        public static int Width_ = 0, Height_ = 0;
        public Background()
        {
            InitializeComponent();
            DoubleBuffered = true;
            this.KeyDown += new KeyEventHandler(Background_KeyDown);
            this.KeyUp += new KeyEventHandler(Background_KeyUp);
            this.Paint += new PaintEventHandler(Background_Paint);

            Map.Initialize();
            NavigationArrows.Initialize();
        }

    
        void Background_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(Map.Img1, Map.rectangle);//BackgroundImage

            e.Graphics.DrawImage(NavigationArrows.Active(), NavigationArrows.Rectangle_);//NavigationArrows
        }



        void Background_KeyDown(object sender, KeyEventArgs e)
        {
            Map.GetKey(e.KeyCode.ToString());
            NavigationArrows.GetKey(e.KeyCode.ToString());
            this.Refresh();
        }
        void Background_KeyUp(object sender, KeyEventArgs e)
        {
            Map.GetKey("none");
            NavigationArrows.GetKey("none");
            this.Refresh();
        }
        private void Background_SizeChanged(object sender, EventArgs e)
        {
            Width_ = this.Width; Height_ = this.Height;//update this first
            NavigationArrows.UpdatePosition();
            this.Refresh();
        }

    }
}