Воскресенье, 11 Апреля 2021, 16:42

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » zombihello [4]
Результаты поиска
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! | Слава солнцу!
Форум игроделов » Записи участника » zombihello [4]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2021 Рейтинг