Результаты поиска
| |
zombihello | Дата: Четверг, 27 Апреля 2017, 20:46 | Сообщение # 1 | Тема: Как изменить размер квадрата потянув за его ребро мышкой |
был не раз
Сейчас нет на сайте
| Всем добрый день. Пишу для своего движка небольшой 3д редактор уровней (базовый функционал) на подобии Valve Hammer. Так вот, в чем проблема? Проблема в том что у меня не получается нормально реализовать изменения размеров браша. А именно когда я рисую с верхнего левого угла в правый нижний (и не только), то вершины отзеркаливаються и перетаскиваются тогда противоположные. Как это справить? Я пытался это профиксить, но все идеи которые ко мне приходили не помогали
Вот здесь я хочу увеличить правую сторону, но оно изменяет левую (движется в сторону курсора) Помогите решить эту проблему , код под скриншотом
А вот сам код: Вот так я создаю вершины
Код public override void Create( Vector3f StartPosition, Vector3f EndPosition ) { //AddVertex - просто в List добавляем вершину //AddIdVertex - просто в List добавляем id вершины чтобы знать что с чем соединять
InitBrush( StartPosition, EndPosition ); ColorBrush = new Color( 1, 1, 1 ); DefaultColorBrush = ColorBrush;
// Front AddVertex( 0, 0, 0, Vertex.TypeVertex.LeftBottom ); // 0 AddVertex( Size.X, 0, 0, Vertex.TypeVertex.RightBottom ); // 1 AddVertex( Size.X, Size.Y, 0, Vertex.TypeVertex.RightTop ); // 2 AddVertex( 0, Size.Y, 0, Vertex.TypeVertex.LeftTop ); // 3
// Back AddVertex( 0, 0, Size.Z, Vertex.TypeVertex.Back_LeftBottom ); // 4 AddVertex( Size.X, 0, Size.Z, Vertex.TypeVertex.Back_RightBottom ); // 5 AddVertex( Size.X, Size.Y, Size.Z, Vertex.TypeVertex.Back_RightTop ); // 6 AddVertex( 0, Size.Y, Size.Z, Vertex.TypeVertex.Back_LeftTop ); // 7 ToGloablCoords();
// Front AddIdVertex( 0 ); AddIdVertex( 1 ); AddIdVertex( 2 ); AddIdVertex( 3 ); AddIdVertex( 0 ); AddIdVertex( 3 ); AddIdVertex( 1 ); AddIdVertex( 2 ); // и т.д }
Вот так я инициализирую браш
Код protected void InitBrush( Vector3f StartPosition, Vector3f EndPosition ) { if ( StartPosition.X == 0 ) StartPosition.X = Viewport.fSize; // Viewport.fSize у меня равен 20 (это размер сетки)
if ( StartPosition.Y == 0 ) StartPosition.Y = Viewport.fSize;
if ( StartPosition.Z == 0 ) StartPosition.Z = Viewport.fSize;
Position = Program.Align( StartPosition, Viewport.fSize ); // Align - метод который прикрепляет точку к сетке
Size.X = Program.Align( EndPosition.X, Viewport.fSize ) - Position.X; Size.Y = Program.Align( EndPosition.Y, Viewport.fSize ) - Position.Y; Size.Z = Program.Align( EndPosition.Z, Viewport.fSize ) - Position.Z; }
Так я привожу к глобальным координатам браш
Код protected void ToGloablCoords() { for ( int i = 0; i < mLocalVertex.Count; i++ ) { mGlobalVertex[i].X = mLocalVertex[i].Position.X + Position.X; mGlobalVertex[i].Y = mLocalVertex[i].Position.Y + Position.Y; mGlobalVertex[i].Z = mLocalVertex[i].Position.Z + Position.Z; }
CenterBrush.X = Position.X + Size.X / 2; CenterBrush.Y = Position.Y + Size.Y / 2; CenterBrush.Z = Position.Z + Size.Z / 2;
for ( int i = 0; i < mPointsResize.Count; i++ ) // обновляем белые точки для масштабирования (те что на скрине) mPointsResize[i].InitPoints( this, mPointsResize[i].typeViewport ); }
А вот так я собственно изменяю размер браша
Код public void Resize( Vector3f FactorSize, Viewport.TypeViewport typeViewport ) // TODO: Сделать изменение размеров браша { switch ( PointsResize.SelectPointType ) { case PointsResize.PointType.LeftCenter: // если мы тянем за левую центральную точку if ( typeViewport == Viewport.TypeViewport.Front_2D_yz ) { Size.Z += Program.Align( FactorSize.X, Viewport.fSize ); Position.Z += Program.Align( FactorSize.X, Viewport.fSize ); } else if ( typeViewport == Viewport.TypeViewport.Top_2D_xy || typeViewport == Viewport.TypeViewport.Side_2D_xz ) { Size.X -= Program.Align( FactorSize.X, Viewport.fSize ); Position.X += Program.Align( FactorSize.X, Viewport.fSize ); }
ResizeLocalVertex( new Vector3f( FactorSize.X, 0, 0 ), typeViewport ); break;
case PointsResize.PointType.RightCenter: // если мы тянем за правую центральную точку if ( typeViewport == Viewport.TypeViewport.Front_2D_yz ) Size.Z += Program.Align( FactorSize.X, Viewport.fSize );
else if ( typeViewport == Viewport.TypeViewport.Top_2D_xy || typeViewport == Viewport.TypeViewport.Side_2D_xz ) Size.X += Program.Align( FactorSize.X, Viewport.fSize );
ResizeLocalVertex( new Vector3f( FactorSize.X, 0, 0 ), typeViewport ); break;
case PointsResize.PointType.RightTop: break; }
ToGloablCoords(); }
А таким методом я обновляю вершины после изменения размера
Код private void ResizeLocalVertex( Vector3f FactorSize, Viewport.TypeViewport typeViewport ) { for ( int i = 0; i < mLocalVertex.Count; i++ ) // проходим по всем вершинам и смотрим какие нам надо двигать { Vertex vertex = mLocalVertex[i];
switch ( PointsResize.SelectPointType ) { case PointsResize.PointType.LeftCenter: if ( typeViewport == Viewport.TypeViewport.Top_2D_xy || typeViewport == Viewport.TypeViewport.Side_2D_xz ) { if ( vertex.typeVertex == Vertex.TypeVertex.LeftTop || vertex.typeVertex == Vertex.TypeVertex.LeftBottom || vertex.typeVertex == Vertex.TypeVertex.Back_LeftTop || vertex.typeVertex == Vertex.TypeVertex.Back_LeftBottom ) vertex.Position.X += Program.Align( FactorSize.X, Viewport.fSize ); } else if ( typeViewport == Viewport.TypeViewport.Front_2D_yz ) { if ( vertex.typeVertex == Vertex.TypeVertex.RightBottom || vertex.typeVertex == Vertex.TypeVertex.RightTop || vertex.typeVertex == Vertex.TypeVertex.LeftBottom || vertex.typeVertex == Vertex.TypeVertex.LeftTop ) vertex.Position.Z += Program.Align( FactorSize.X, Viewport.fSize ); } break;
case PointsResize.PointType.RightCenter: if ( typeViewport == Viewport.TypeViewport.Top_2D_xy || typeViewport == Viewport.TypeViewport.Side_2D_xz ) { if ( vertex.typeVertex == Vertex.TypeVertex.RightTop || vertex.typeVertex == Vertex.TypeVertex.RightBottom || vertex.typeVertex == Vertex.TypeVertex.Back_RightTop || vertex.typeVertex == Vertex.TypeVertex.Back_RightBottom ) vertex.Position.X += Program.Align( FactorSize.X, Viewport.fSize ); } else if ( typeViewport == Viewport.TypeViewport.Front_2D_yz ) { if ( vertex.typeVertex == Vertex.TypeVertex.Back_RightBottom || vertex.typeVertex == Vertex.TypeVertex.Back_RightTop || vertex.typeVertex == Vertex.TypeVertex.Back_LeftBottom || vertex.typeVertex == Vertex.TypeVertex.Back_LeftTop ) vertex.Position.Z += Program.Align( FactorSize.X, Viewport.fSize ); }
break; } }
// если тянули за центральную левую точку, то мы перемещаем в противоположную сторону все вершины кроме левых //(ибо при изменении позиции в глоб. координатах без сего дела браш будет двигаться вслед за курсором)
if ( PointsResize.SelectPointType == PointsResize.PointType.LeftCenter ) for ( int i = 0; i < mLocalVertex.Count; i++ ) { Vertex vertex = mLocalVertex[i]; if ( vertex.typeVertex != Vertex.TypeVertex.LeftTop || vertex.typeVertex != Vertex.TypeVertex.LeftBottom ) if ( typeViewport != Viewport.TypeViewport.Front_2D_yz ) vertex.Position.X -= Program.Align( FactorSize.X, Viewport.fSize ); else vertex.Position.Z -= Program.Align( FactorSize.X, Viewport.fSize ); } }
Laudate sol! | Praise The Sun! | Слава солнцу!
|
|
| |
zombihello | Дата: Вторник, 25 Октября 2016, 00:56 | Сообщение # 2 | Тема: Нужен художник и сценарист в команду Hollow Box |
был не раз
Сейчас нет на сайте
| О команде: На данный момент в команде только я и по этому как таковой команды еще нету Кого ищу: Нужен сценарист и художник для работы над проектом "Mind Control"
Требования к сценаристу: 1. Иметь хорошую фантазию 2. Ответственность, желание.
Требования к художнику: 1. Рисование 2d персонажей, предметов и т.д в стиле pixelArt'a для плтаформера. 2. Ответственность, желание.
Моя роль в команде: В основном я программист ( знаю С++ и C# ), но поскольку я пока один, то приходиться быть и художником, и сценаристом
О проекте: Ссылка на диздок: https://yadi.sk/i/6_LMXP2Xu5ynJ Жанр: Платформер, 2D в стиле пиксель арта Движок: Unity3d Платформа: Windows Описание: Под Мухосранском располагался научно-исследовательский комплекс «Черный Рассвет», в котором занимались исследованием аномальных материалов, изучением природы порталов, разработкой машины времени и прочих ништяков. В одном из таких отделов вели разработку проекта под кодовым названием «Контроль Разума», оно представляло биологическое оружие, которое должно было контролировать сознание носителя и заражать других, таким образом, создавая армию рабов. Прогресс разработки оружия продвигался весьма успешно, пока не дошло до эксперимента на человеке. Для этих целей с улицы города притащили бомжа, пообещав ему за этого бутылку водяры, но конечно же ему никто ничего давать не собирался ( настоящие преступление! ). После обследования его завели в камеру, где и распылили этот вирус. На протяжении нескольких дней подопытный бомж вел себя так, как планировали ученые, но на третий день эксперимента ученные зафиксировали аномальную мутацию и неподчинение приказам. Работники планировали ликвидировать неудачный эксперимент, но не успели. Глубокой ночью, разломав дверь камеры, вылез на свободу настоящий монстр, который стал заражать всех сотрудников, а попытки охраны остановить это чудовище были четны. И им на помощь были отправлены военные призванные эвакуировать выживших и устранить следы эксперимента, в рядах которых был и рядовой Артем
Laudate sol! | Praise The Sun! | Слава солнцу!
|
|
| |
zombihello | Дата: Понедельник, 11 Июля 2016, 00:08 | Сообщение # 3 | Тема: Зависмость размеров спрайтов от размера окна |
был не раз
Сейчас нет на сайте
| Я конечно понимаю что прошло уже 3 года и автора эта тема не волнует, но есть такие ребята которым нужна помощь. Ну давайте я не буду тянуть кота за хвост и перейду сразу к теме.
Мой способ таков: в SFML есть такой класс View ( типо игровой камеры ) и с помощью него можно решить данную проблему. Т.е мы берем какое-то разрешение на котором у нас будет работать игра, например, 1280х720 и масштабируем игровую камеру под это разрешение
Пример: разрешение у игрока: 800x600 выбранное разрешение: 1280х720 Далее, мы находим разницу ( W = 1280-800; H=720-600 ), а потом ее прибавляем к разрешению игрока ( 800+W; 600+H )
Пример на коде:
Код Vector2f Difference; // вектор в котором будет хранится разница Difference.x = 1280 - 800; // находим разницу длины. ВАЖНО: Выбраное разрешение должно стоять первым ( если у игрока разрешение будет больше, то оно его отнимет ) Difference.y = 720 - 600; // находим разницу высоты. View( FloatRect( 0, 0, 800 + Difference.x, 600 + Difference.y ) ); // создаем камеру с разрешением 1280x720. Ну а дальше мы эту камеру применяем на окне ( setView )
Laudate sol! | Praise The Sun! | Слава солнцу!
|
|
| |
zombihello | Дата: Среда, 04 Мая 2016, 00:08 | Сообщение # 4 | Тема: Нужна помощь с SFML!!! |
был не раз
Сейчас нет на сайте
| Если эта тема еще актуальна, то вот эти строки
Цитата jone157 ( ) while (window.isOpen()){ draw_c(10,10,10,10,255,255,255,255,true,255,255,255,255, window) window.display(); window.clear(Color::Color(10, 10, 10, 255));
}
надо немного подправить, т.е сделать вот так
Код while (window.isOpen()){ window.clear(Color(10, 10, 10)); draw_c(10,10,10,10,255,255,255,255,true,255,255,255,255, window); window.display(); }
короче говоря метод clear должен идти перед отрисовкой уровня
P.S: Я твой код так подправил и у меня FPS зашкаливал
Laudate sol! | Praise The Sun! | Слава солнцу!
|
|
| |
|