Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Draftpad
26 / 27 / 1
Регистрация: 12.10.2011
Сообщений: 83
#1

Стрельба в координаты мыши - C++

02.11.2011, 21:34. Просмотров 837. Ответов 11
Метки нет (Все метки)

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

Собственно, производится выстрел из корабля, снаряд должен лететь по направлению к мышке.
Известны координаты начала полёта снаряда и координаты мышки, есть вектор, далее мысли заканчиваются... Гугл на эту тему, ничего путнего не предложил.

Прикладываю картинку, чтобы было понятно, чего я хочу.
Буду раз примеру вместе с кодом, либо простому примеру с расчётами с приведёнными на картинке значениями.

Стрельба в координаты мыши
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2011, 21:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стрельба в координаты мыши (C++):

Координаты мыши - C++
Предисловие: делаю OpenGl приложение в консольном режиме. Как определить координаты мыши? POINT pt; GetCursorPos(&pt); //Get the...

Координаты курсора мыши - C++
Ребят подскажите библиотеку которая умеет: манипулировать устройствами ввода + возвращать нажатые клавиши и координаты курсора! и примерчик...

Координаты точки нажатия мыши. - C++
С помощью OpenGL создаю окно. Нужно определить координаты куда я в этом окне кликнул мышкой.

Перемещение курсора мыши на заданные координаты и клик - C++
Добрый день. Подскажите, пожалуйста, как можно реализовать сабж. Гугление выдает некоторые варианты, но ни один из примеров не...

Как узнать координаты курсора мыши и отобразить их? c++ - C++
Как узнать координаты курсора мыши и отобразить их? c++

Как определить координаты мыши относительно рабочего стола - C++
как сделать тоже самое только в c++?Вынесено отсюда.

11
Spark_sfb
6 / 6 / 0
Регистрация: 02.11.2011
Сообщений: 56
02.11.2011, 21:38 #2
Я тут недавно, поэтому может что и не понимаю, но в чем суть задачи то?
Анимацию сделать? Координаты попадания снаряда?
0
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
02.11.2011, 21:39 #3
по какой траектории ?
0
I2um1
Злой няш
1403 / 1101 / 142
Регистрация: 05.04.2010
Сообщений: 1,949
02.11.2011, 21:42 #4
Ну~, допустим должны быть две переменные-скорости по X и Y: speedX, speedY.
Пусть координаты корабля - это (X, Y), тогда координаты мыши - это (X2, Y2).
Рассчитываем шаг по X и Y:
stepX = (X2 - X) / speedX;
stepY = (Y2 - Y) / speedY;
Предположим координаты снаряда - это Xr, Yr.
Тогда эмулировать движение так:
C++
1
2
3
4
for (Xr = X, Yr = Y; Xr <= X2 || Yr <= Y2; Xr += stepX, Yr += stepY)
{
   // Отображаем безобразие на экране
}
P.S. Это если прямолинейное движение без ускорения.
2
zek921
02.11.2011, 21:44
  #5

Не по теме:

оффтоп

0
Bers
Заблокирован
02.11.2011, 21:47 #6
Известны стартовые координаты снаряда. Известны конечные координаты снаряда.
Известно, что снаряд летит по прямой.

Нужно: определить текущие координаты с наряда в текущий момент времени.
Требуется дополнительно: определить единичный отрезок времени, и скорость полёта снаряда.

Тогда можно будит определять координаты снаряда через энный промежуток времени, с момента выстрела.
1
Draftpad
26 / 27 / 1
Регистрация: 12.10.2011
Сообщений: 83
02.11.2011, 21:59  [ТС] #7
Всем спасибо, таки додумался до такого способа с элементарными расчётами(перебор идёт в цикле):
C++
1
2
3
    dir=-atan2(shots[i].coord.y-stMouseStates.iY,stMouseStates.iX-shots[i].coord.x);
    dx = cos(dir) * 1; shots[i].coord.x+=dx;
    dy = sin(dir) * 1; shots[i].coord.y+=dy;
dir - направление
stMouseStates - координаты мышки
shots[i].coord - координаты выстрелов

Правда при расчёте 300+ выстрелов в секунду заметно снижается фпс)) что не удивительно.

ЗЫ: Прошу прощения, что толком не сформулировал вопрос, времени 2 ночи, котелок варит уже с трудом =\
0
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
02.11.2011, 22:51 #8
считать синусы и косинусы в таких вещах не очень хорошо. можно придумать более упрощенные варианты. к примеру, вдохновиться алгоритмом Брезенхэма.

самый очевидный вариант - ввести некоторую оценочную ф-цию для каждой следующей точки. к примеру отношение (y2-y1)/(x2-x1). чем ближе оно к идеальному, замеренному для исходной точки, тем эта точка лучше. вроде есть способ и без деления обойтись.
1
Draftpad
26 / 27 / 1
Регистрация: 12.10.2011
Сообщений: 83
02.11.2011, 23:27  [ТС] #9
Цитата Сообщение от Paporotnik Посмотреть сообщение
считать синусы и косинусы в таких вещах не очень хорошо.
Почему не хорошо?

Завтра буду пытаться найти более элегантный выход из этой ситуации.
0
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
02.11.2011, 23:37 #10
тем, что это "тяжелые" функции и использовать их в частых и многочисленных расчетах, а особенно если результат должен быть real-time, нежелательно из соображений быстродействия. если заменишь их чем-то, то наверняка твои "300 выстрелов в секунду" будут гораздо адекватнее)
0
Bers
Заблокирован
02.11.2011, 23:43 #11
Цитата Сообщение от Draftpad Посмотреть сообщение
Почему не хорошо?
Потому что медленно. Геймдеф такое дело. Нужно стремится минимизировать количество операций. По возможности избавляясь от всех тяжелых операций, умножения, деления, и тп.

Например, тебе один раз достаточно найти угол (сняряд же летит по прямой, и с течением времени угол уже не меняется). Запомнить этот угол в переменной, и больше не использовать тяжелую функцию косинуса/синуса/тангенса.

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

и тд, и тп.

Конечно, преждевременная оптимизация - зло. И заниматься этим нужно только тогда, когда уже ощущаются заметные падения фпс.
0
Draftpad
26 / 27 / 1
Регистрация: 12.10.2011
Сообщений: 83
03.11.2011, 11:46  [ТС] #12
Весь день я мучал поисковики на тему выстрелов по координатам в двухмерном пространстве, таки везде метод с синусами, косинусами и арктангенсом.

В примере от Blood-Angel без дополнительных вычислений, не будет известна скорость, с которой должен двигаться снаряд, в итоге скорость полёта напрямую зависит от расстояния мышки до начала полёта снаряда. Скорость вычислять приходится опять через арктангенс.

Алгоритмом Брезенхэма тоже ничего путнего сделать не получилось, плавное передвижение снаряда по точкам не выходит.

Либо эта тема имеет, какое-то другое, но скрытое от общего взора решение. Или же используется метод, приведённый в первом моём примере.

Кстати, подкорректировал функцию, теперь даже при расчёте 2000+ снарядов, нагрузка минимальна, буду надеяться, что к финальной версии, вместе с расчётами AI и прочим, падений производительности не будет.
0
03.11.2011, 11:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2011, 11:46
Привет! Вот еще темы с ответами:

Как получить координаты курсора при нажатии любой кнопки мыши? - C++
Неужели не кто не знает?

Создать следующую программу: при наведении указателя мыши на кнопку ее координаты изменяются произвольным образом в пределах формы (кнопка убегает - C++
Создать следующую программу: при наведении указателя мыши на кнопку ее координаты изменяются произвольным образом в пределах формы (кнопка...

Стрельба в мишень - C++
Для десяти выстрелов, координаты которых задаются с клавиатуры, вывести текстовые сообщения о попадании в мишень. Мишень задана на...

Даны координаты вершин треугольника и координаты некоторой точки внутри него - C++
Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найти расстояние от данной точки до ближайшей стороны...


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

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

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