Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2012, 23:01   #1
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию Передвижение объекта по клику мышью

Здравствуйте, делаю маленькую игру, и мне нужно, что бы при нажатии мышью на каюк-нибудь область объект двигался.
Проблем с координатами у меня нет, единственная проблема, это как рассчитать путь от клика до объекта.
Сможете мне помочь? Код приводить не буду, так как смысла нет, но если скажите, выложу.
Помощь ваша очень нужна! Буду очень благодарен.

Последний раз редактировалось Alek-de-Mik; 16.09.2012 в 23:08.
Alek-de-Mik вне форума Ответить с цитированием
Старый 17.09.2012, 00:44   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Среда программирования какая?

Если объект имеет координаты размещения, а курсор мыши позицию, то расстояние по осям находится элементарным вычитанием. Будем думать? ...код выкладывай.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 17.09.2012, 01:17   #3
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Среда программирования Visual C# 2010, OpenGL(Tao). Не знаю что именно нужно, поэтому выложу весь код.
Код:
using System;
...
using Tao.Platform.Windows;

namespace Game_Test
{
    public partial class Test : Form
    {
        public Test()
        {
            InitializeComponent();
            MoG.InitializeContexts();
        }
        double ScreenW, ScreenH;
        double MousX, MousY;
        private float devX;
        private float devY; 
        private bool mousClick;
        private double x=0, y=0, R=0;
        private void Form1_Load(object sender, EventArgs e)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
            Gl.glClearColor(0, 0, 0, 1);
            Gl.glViewport(0, 0, MoG.Width, MoG.Height);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            //перехожу в декартову систему координат
            if ((float)MoG.Width <= (float)MoG.Height)
            {
                ScreenW = 30.0;
                ScreenH = 30.0 * (float)MoG.Height / (float)MoG.Width;
                Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
            }
            else
            {
                ScreenW = 30.0 * (float)MoG.Width / (float)MoG.Height;
                ScreenH = 30.0; 
                Glu.gluOrtho2D(0.0, 30.0 * (float)MoG.Width / (float)MoG.Height, 0.0, 30.0);
            }
            //Соотношение сторон экрана
            devX = (float)ScreenW / (float)MoG.Width;
            devY = (float)ScreenH / (float)MoG.Height;
            //Координаты центра объекта
            x = 5.0;
            y = 5.0;
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            RenderTimer.Start();
        }
        private void RenderTimer_Tick(object sender, EventArgs e)
        {
            Draw();
        }
////Продолжение в следующем посте///
Alek-de-Mik вне форума Ответить с цитированием
Старый 17.09.2012, 01:21   #4
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Код:
 
...
  private void Draw()
        {
            R = (double)trackBarR.Value;
                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
            //отрисовка сетки координат
                for (double d_x = 0.0; d_x <= 31.0; d_x = d_x + 1.0)
                {
                    Gl.glBegin(Gl.GL_LINES);
                    Gl.glColor3d(0.25, 0.25, 0.25);
                    Gl.glVertex2d(d_x, 0.0);
                    Gl.glVertex2d(d_x, 30.0);
                    Gl.glEnd();
                }
                for (double d_y = 0.0; d_y <= 30.0; d_y = d_y + 1.0)
                {
                    Gl.glBegin(Gl.GL_LINES);
                    Gl.glColor3d(0.25, 0.25, 0.25);
                    Gl.glVertex2d(0.0, d_y);
                    Gl.glVertex2d(31.0, d_y);
                    Gl.glEnd();
                }
            //отрисовка оси Y
                Gl.glBegin(Gl.GL_LINES);
                Gl.glColor3d(0.0, 0.0, 1.0);
                Gl.glVertex2d(0.0, 1.0);
                Gl.glVertex2d(31.0, 1.0);
                Gl.glEnd();
            //отрисовка оси X
                Gl.glBegin(Gl.GL_LINES);
                Gl.glColor3d(0.0, 1.0, 0.0);
                Gl.glVertex2d(1, 0.0);
                Gl.glVertex2d(1, 30.0);
                Gl.glEnd();
                Polygon(x, y, R);
                Gl.glFlush();
            MoG.Invalidate();
        }
        //функция рисования круга
        private void Circle(double x0, double y0, double R)
        {
            double[,] GrapValuesArray;
            int elements_count = 0;
            double x, y;
            elements_count = 0; 
            GrapValuesArray = new double[63, 2];
            for (double fi = 0.0; fi < 2.0*Math.PI; fi += 0.1)
            {
                x = x0 + R * (Math.Cos(fi));
                y = y0 + R * (Math.Sin(fi));
                GrapValuesArray[elements_count, 0] = x;
                GrapValuesArray[elements_count, 1] = y;
                elements_count++;
            };
            Gl.glBegin(Gl.GL_LINE_LOOP);
            Gl.glVertex2d(GrapValuesArray[0, 0], GrapValuesArray[0, 1]);
            for (int ax = 1; ax < elements_count; ax += 2)
            {
                Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
            }
            Gl.glEnd();
        }
        //функция рисования окружности
        private void Polygon(double x0, double y0, double R)
        {
            double[,] GrapValuesArray;
            int elements_count = 0;
            double x, y;
            elements_count = 0;
            GrapValuesArray = new double[63, 2];
            for (double fi = 0.0; fi < 2.0 * Math.PI; fi += 0.1)
            {
                x = x0 + R * (Math.Cos(fi));
                y = y0 + R * (Math.Sin(fi));
                GrapValuesArray[elements_count, 0] = x;
                GrapValuesArray[elements_count, 1] = y;
                elements_count++;
            }
            Gl.glPolygonMode(Gl.GL_FRONT_AND_BACK, Gl.GL_FILL);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex2d(GrapValuesArray[0, 0], GrapValuesArray[0, 1]);
            for (int ax = 1; ax < elements_count; ax += 2 )
                Gl.glVertex2d(GrapValuesArray[ax, 0], GrapValuesArray[ax, 1]);
            Gl.glEnd();
        }
        private void MoG_MouseDown(object sender, MouseEventArgs e)
        {
            mousClick = true;
        }
        private void MoG_MouseUp(object sender, MouseEventArgs e)
        {
            mousClick = false;
        }
        private void MoG_MouseMove(object sender, MouseEventArgs e)
        {
            if(mousClick)
           {     
          //Координаты мыши                       
                MousX = devX * e.X;
                MousY = (double)(ScreenH - devY * e.Y);
           }
        }
    }
}
Alek-de-Mik вне форума Ответить с цитированием
Старый 17.09.2012, 12:12   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Весь проект киньте (коли не сложно), вечером после работы погляжу, авось накачу то, что Вам надо, ибо мне самому интересно, хотя соображалка вечером не ахти.
Безотносительно задачи - Алгоритм_Брезенхэма - имеем 2 точки (4 числа) на 2д плоскости, в ходе алгоритма получаем точки-смещения для всех шагов между заданными, по ним в таймере рисуем.
Правда, есть небольшая оговорка для этого алгоритма - смещение по диагоналям будет визуально быстрее, чем по ортогоналям.


УПД. весь проект - имеется ввиду всю папочку (архивчиком) - там ведь не только 1 cs файл, а ещё куча всего, чтобы мне не копипастой проект собирать, а просто взять и запустить, Тао качну сам, но можете и вложить.

Последний раз редактировалось phomm; 17.09.2012 в 13:06.
phomm вне форума Ответить с цитированием
Старый 17.09.2012, 12:48   #6
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

А это и есть весь проект на данный момент, я решил сначала разобраться с перемещением, а затем идти дальше. Спасибо, за наводку, попробую, посмотрю что получится.
Alek-de-Mik вне форума Ответить с цитированием
Старый 17.09.2012, 18:17   #7
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Рабочее пространство имеет препятствия (области, которые нужно обходить)? Если да, то можно поискать в гугле:
"Алгоритм поиска пути".

Если нет, то задача элементарная, нужно лишь подумать чуть-чуть. Арифметика и координаты.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 17.09.2012, 18:20   #8
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Посмотрел как мне и советовали, для моего случая используют Алгоритм Ли. Кто нибудь имел с ним дело?
Alek-de-Mik вне форума Ответить с цитированием
Старый 17.09.2012, 18:27   #9
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание

Цитата:
Сообщение от Alek-de-Mik Посмотреть сообщение
Посмотрел как мне и советовали, для моего случая используют Алгоритм Ли. Кто нибудь имел с ним дело?
Я с ним дело не имел.
Но как дойдешь до прорисовки карты (при условии что она 2-х мерная и изометрическая), я могу помочь. Я когда делал, придумал свой алгоритм прорисовки. Назвал его "Метод градиентной матрицы (с)". И не надо там никаких сложнейших пересчетов координат. Но я пишу на Delphi.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 17.09.2012, 18:32   #10
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Пользуешь gluUnProject/gluProject (или пишешь свои) - получаешь корды двух векторов в пространстве(два вектора - начало и конец пути), затем линейная интерполяция между ними.

Что -то около этого...
Код:
// linear interpolation
inline float lerp(float a, float b, float t)
{
	return a + (b - a) * t;
}
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передвижение объекта мышкой Яр|/||< (^_^) Qt и кроссплатформенное программирование С/С++ 3 26.06.2012 01:10
CLR. Ошибка C3918. Как вызвать из объекта обработчик, переданный родителю объекта от деда? Stilet Общие вопросы .NET 0 15.01.2011 17:49
Движение объекта на форме мышью _-Re@l-_ Общие вопросы Delphi 12 24.07.2010 02:12
Управление движением объекта мышью program123 Общие вопросы Delphi 9 08.03.2009 20:11
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37