Форум программистов, компьютерный форум, киберфорум
XNA/MonoGame
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/32: Рейтинг темы: голосов - 32, средняя оценка - 4.94
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
1

Как нарисовать прямоугольник выделения?

18.07.2010, 15:32. Просмотров 5869. Ответов 10
Метки нет (Все метки)


2д графика, обычный пустой прямоугольник
тот самый которым выделяют юнитов в любой стратегии (он же в винде для выбора нескольких файлов/папок и т.п )

в винформс это пара строк кода(Graphics.DrawRectangle), а в XNA вообще нет идей
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2010, 15:32
Ответы с готовыми решениями:

Как нарисовать прямоугольник, изменить его координаты и нарисовать заново уже без первого прямоугольника?
Как нарисовать прямоугольник, изменить его координаты и нарисовать заного уже без первого...

Прямоугольник выделения
Подскажите пожалуйста как реализовать прямоугольник выделения ? Вот

как нарисовать прямоугольник
Доброго времени суток. вопрос: как сделать, чтобы при нажатии кнопки (Paint) в этой форме рисовался...

как нарисовать прямоугольник
Проблема с прямоугольником case Item.Rectangle: g.DrawRectangle(new Pen(new...

10
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,842
18.07.2010, 16:44 2
Рисуете примитив, который ничем не закрашиваете. Допустим рисуете примитив из четырех отрезков, и устанавливаете свойство FillMode = WireFrame, если я не ошибаюсь.
0
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
18.07.2010, 18:48  [ТС] 3
ну да...примитивом получилось, всего навсего ~100 строк на отрисовку прямоугольника
еще не сталкивался с примитивами как-то, все спрайты да спрайты - пришлось накопировать с мсдн и допилить методом тыка

вообще думал может как-то силами стандартного spriteBatch можно...без всех этих матриц преобразования, вершин и шейдеров
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
19.07.2010, 01:21 4
а что тебе мешает взять картинку пгн и просто масштабировать ее? будешь рисовать точно так же через спрайт бич и все)
0
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
20.07.2010, 18:25  [ТС] 5
всетаки запилил силами спрайт бича
сделал картинку тупо линию, потом из этой единственной линии строю прямоугольник(поворачиваю, растягиваю и т.п)


Sequd, не это не то
вместе с размерами этого прямоугольника увеличится и толщина линий из которых он нарисован
0
85 / 84 / 8
Регистрация: 03.11.2009
Сообщений: 723
20.07.2010, 18:46 6
ну я это и имел в виду)
кстати можешь выложить кусок кода, так как вопрос актуальный
0
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
20.07.2010, 19:23  [ТС] 7
код все равно довольно враждебный получился, парой строк тут не обойтись..


C#
1
2
        Rectangle selectedRectangle;
        Texture2D line;
где-то в Update создаем прямоугольник
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   
//m_pointStartSelect это откуда начали тянуть прямоугольник
 
    //текущее положение мышки или где отпустили кнопку
m_pointEndSelect = new Point(m_currMouseState.X, m_currMouseState.Y); 
 
            selectedRectangle.Width = (int)MathHelper.Distance(m_pointEndSelect.X, m_pointStartSelect.X);
            selectedRectangle.Height = (int)MathHelper.Distance(m_pointEndSelect.Y, m_pointStartSelect.Y);
           
//тянуть ведь можно не только вправо вниз, но и вверх-налево и т.п, это надо спалить и вылечить
            var leftTopPoint = m_pointStartSelect;
            if (m_pointEndSelect.X <= m_pointStartSelect.X)
                leftTopPoint.X = m_pointEndSelect.X;
            if (m_pointEndSelect.Y <= m_pointStartSelect.Y)
                leftTopPoint.Y = m_pointEndSelect.Y;
 
            selectedRectangle.Location = leftTopPoint;
потом рисую известно где
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  private void DrawRectangle()
        {
            float rotation = 0.0f;
            Rectangle drawRect = new Rectangle(); //это для самой линии
 
            drawRect.Width = line.Width; 
            drawRect.Height = selectedRectangle.Height; 
 
            drawRect.Location = new Point(selectedRectangle.Left, selectedRectangle.Top);
 
            spriteBatch.Draw(line, drawRect, null, Color.White, rotation,
                Vector2.Zero, SpriteEffects.None, 0.1f);
 
            drawRect.Location = new Point(selectedRectangle.Right - line.Width, selectedRectangle.Top);
 
            spriteBatch.Draw(line, drawRect, null, Color.White, rotation,
                 Vector2.Zero, SpriteEffects.None, 0.1f);
 
 
            rotation = (float)Math.PI / 2; //поворот линии, дальше уже горизонтальные
 
            drawRect.Width = line.Width;
            drawRect.Height = selectedRectangle.Width;
            drawRect.Location = new Point(selectedRectangle.Left, selectedRectangle.Top + line.Width);
           
 
            spriteBatch.Draw(line, drawRect, null, Color.White, rotation,
                new Vector2(line.Width, line.Height), SpriteEffects.None, 0.1f);
 
            drawRect.Location = new Point(selectedRectangle.Left, selectedRectangle.Bottom + line.Width);
 
            spriteBatch.Draw(line, drawRect, null, Color.White, rotation,
                 new Vector2(line.Width, line.Height), SpriteEffects.None, 0.1f);
 
        }
0
Изображения
 
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
20.07.2010, 19:48  [ТС] 8
вообще если подумать можно вместо линии взять крошечный квадратик, проще будет..
если конечно растягивание пары пикселей на пол экрана не повлияет на производительность

p/s и ктож придумал что пост нельзя править через 10 минут...нафик оно надо не понятно
0
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,842
20.07.2010, 20:54 9
Наверняка чтобы потом показания сошлись ))
0
3 / 3 / 0
Регистрация: 20.09.2009
Сообщений: 18
30.07.2010, 12:04 10
XNA не юзает некоторые приятные вещи директа для рисования примитивов.
Потому 100 строк - это еще не предел (кст, не нужно забывать о шейдере)
Использования для этого спрайтов - не вариант, т к скейлится все, следовательно
изменяется толщина выделяющей линии и дублируются соседние пикселы.

Лучше один раз не пожалеть время, написать класс для отрисовки примитивов
и не мучать себе мозг
0
1265 / 966 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
30.07.2010, 13:20  [ТС] 11
да пока и спрайтами вполне нормальный прямоугольник получается
0
Миниатюры
Как нарисовать прямоугольник выделения?  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2010, 13:20

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

Как нарисовать повернуты прямоугольник
Вот такой вопрос... Как нарисовать повернутый прямоугольник? Задача такая: 1. Рисуем...

Как нарисовать прямоугольник на форме ?
public void DrawRectangleRectangle(PaintEventArgs e) { // Create pen. Pen blackPen =...

Убрать прямоугольник выделения с контрола
Здравствуйте! Есть форма и на ней 1 кнопка. Нужно, чтобы по-умолчанию не было видно...

Как нарисовать прямоугольник поверх флекса
Попробовал, не получилось. Может кто подскажет?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.