Среда, 18 Декабря 2024, 17:46

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
поворот к мышке
stalker5889Дата: Четверг, 18 Августа 2011, 17:06 | Сообщение # 1
Свободный игродел
Сейчас нет на сайте
Суть такова, у меня есть герой с переменной rotation и есть мышь с координатами x и y. Мне нужно что бы угол мыши сохранялся в переменной rotation. Как это вычислить?

noTformaTДата: Четверг, 18 Августа 2011, 17:32 | Сообщение # 2
Ukrainian independent game developer
Сейчас нет на сайте
Quote (stalker5889)
Суть такова, у меня есть герой с переменной rotation и есть мышь с координатами x и y. Мне нужно что бы угол мыши сохранялся в переменной rotation. Как это вычислить?

rotation = Атан2 (расстояние по оси у от объекта до мыши, расстояние по оси х от объекта до мыши);
Я не знаком с математическими функциями с++, но если что, то http://gcup.ru/publ/unity3d_dvizhenie_v_storonu_kursora/1-1-0-291 - тут я писал как разворачивать объект в сторону мыши, но для юнити.


@noTformaT
karuyДата: Четверг, 18 Августа 2011, 17:37 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
vec1=(1,0); //Условно вектор тыкающий вперед
vec2=((x-PlayerPos),(y-PlayerPos)); //Вектор от игрока к позиции мышки
rotation=acos(cos(vec1,vec2));//Угол между векторами
ЗЫ все вверху псевдокод.
stalker5889Дата: Четверг, 18 Августа 2011, 18:55 | Сообщение # 4
Свободный игродел
Сейчас нет на сайте
Не, не получается. sad А можете скинуть пример?

karuyДата: Пятница, 19 Августа 2011, 11:54 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Держы пример.

Добавлено (19.08.2011, 11:54)
---------------------------------------------
noTformaT, кстати смотря на твою статью: сразу бросается в глаза что таким подходом можно вычислить угол < 90, что не есть гуд.

stalker5889Дата: Пятница, 19 Августа 2011, 18:38 | Сообщение # 6
Свободный игродел
Сейчас нет на сайте
Quote (karuy)
Держы пример.

karuy, эммм. Может ваш пример и хорош но как мне посмотреть код того как вы измеряете угол? Где файл .cpp и .sln ? Пооткрывал фалы блокнотом - это дельфи?


noTformaTДата: Пятница, 19 Августа 2011, 18:41 | Сообщение # 7
Ukrainian independent game developer
Сейчас нет на сайте
Quote (karuy)
кстати смотря на твою статью: сразу бросается в глаза что таким подходом можно вычислить угол < 90, что не есть гуд.

нельзя, http://en.wikipedia.org/wiki/Atan2
but to define atan2 uniquely one uses the principal value in the range (−π, π]. That is, −π < atan2(y, x) ≤ π.
А вот atan обычный вернет smile


@noTformaT
karuyДата: Пятница, 19 Августа 2011, 18:53 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
stalker5889, да делфи. Код того как я измеряю угол в Юните1.пас, блокнота хватит чтоб открыть.


Сообщение отредактировал karuy - Пятница, 19 Августа 2011, 18:55
stalker5889Дата: Пятница, 19 Августа 2011, 19:00 | Сообщение # 9
Свободный игродел
Сейчас нет на сайте
А можно решить это чисто математически, не используя функции яп?

Добавлено (19.08.2011, 19:00)
---------------------------------------------
Просто у меня атан2 глючит.


noTformaTДата: Пятница, 19 Августа 2011, 19:00 | Сообщение # 10
Ukrainian independent game developer
Сейчас нет на сайте
stalker5889, ну та, я же скинул ссылку на вики про атан2, там полно описания, но блин на английском smile
еще погугли акрсинус


@noTformaT
SanAVДата: Пятница, 19 Августа 2011, 19:15 | Сообщение # 11
Alex Versus
Сейчас нет на сайте
Вот пример с моего бложика про HGE. Функция atan2 принадлежит заголовку cmath. Полученное значение будет НЕ в градусах, а в радианах. Т.е. если вы используете систему, работающую на градусах - переведите полученное значение в радианы. Каким способом? dir_gradus=dir_rad * 180 / Pi


My Games:
· [2D, TDS] Death Embrace.


Сообщение отредактировал SanAV - Пятница, 19 Августа 2011, 22:03
stalker5889Дата: Пятница, 19 Августа 2011, 19:16 | Сообщение # 12
Свободный игродел
Сейчас нет на сайте
Кто-нибудь знает что это значит:" Error: Отсутствуют экземпляры перегруженная функция "atan2", соответствующие списку аргументов."?
Вылазит когда навожу мышку на atan2. Вот код:
Code
double dir = atan2(GetMouseY,GetMouseX);


SanAVДата: Пятница, 19 Августа 2011, 19:20 | Сообщение # 13
Alex Versus
Сейчас нет на сайте
stalker5889, прочитайте пример по ссылке. Он будет работать, если спрайт повернут вправо, на нулевой угол по система радианов.

My Games:
· [2D, TDS] Death Embrace.
karuyДата: Пятница, 19 Августа 2011, 19:30 | Сообщение # 14
заслуженный участник
Сейчас нет на сайте
Quote (stalker5889)
А можно решить это чисто математически, не используя функции яп?

А какие я функции яп я юзал?) Я спецыально все разписал, чтоб просто и понятно было ))
stalker5889Дата: Пятница, 19 Августа 2011, 19:48 | Сообщение # 15
Свободный игродел
Сейчас нет на сайте
karuy, для меня дельфи тёмный лес, притом такой кустой что я даже не знаю где вы обьявили переменные. А не могли бы вы написать это словами?

karuyДата: Пятница, 19 Августа 2011, 21:10 | Сообщение # 16
заслуженный участник
Сейчас нет на сайте
Словами я описал в посте №3, програма делает то же самое что описано в посте если присмотреться. Могу еще псевдокодом описать)
СПП псевдокод: (как же я давно не строчил ничего на спп=))
nilremДата: Пятница, 19 Августа 2011, 21:12 | Сообщение # 17
Просветленный разум
Сейчас нет на сайте
Вот, хотя тебе уже тут насоветовали:

Code


#include "windmill.h"  //подключение заголовочного файла
#include <math.h>

#pragma comment (lib,"windmill.lib")    //подключение файла библиотеки

void Game();
float AngleToMouse(float,float);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
  IniEngine(L"RotateToMouse",500,500); // инициализация движка с настройками по умолчанию  
  TextGen(L"",16);    // генерация шрифтов
  RunEngine(Game);    // запуск движка
  return 0;
}
void Game()
{
  int posx=200;
  int posy=200;
  float rotate = AngleToMouse(posx+16,posy+16);    // 16 смещение на центр спрайта
  PrintDigit(rotate,2,20,20);
  DrawSprite(L"",posx,posy,1,rotate);
}
float AngleToMouse(float x,float y)
{
  return atan2(y-GetWorldY(),x-GetWorldX())*(180/3.14);

  // или так, что тоже самое но медленнее  
  /*
  float a = y-GetWorldY();
  float b = x-GetWorldX();
  float radian = atan2(a,b);
  float degree = radian * (180/3.14);
  return degree;
  */
}



Windmill 2

WindMill 2D Game Engine
stalker5889Дата: Суббота, 20 Августа 2011, 10:19 | Сообщение # 18
Свободный игродел
Сейчас нет на сайте
Заработало!!! Сначала не крутилось, ну никак, я создал новый проект и... заработало!!! Всем по плюсу и спасибо!

  • Страница 1 из 1
  • 1
Поиск:

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