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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 13:58   #11
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Функции перевода экранных координат в координаты поля проверялись? У меня такие расчеты ерунду выдают, хотя мб что то напутал
Цитата:
Сообщение от Beermonza
Form1.Left, Form1.Top - присутствуют только в том случае, если игра работает в окне, которое можно перемещать по экрану. Поправка по-X и по-Y нужна для центровки курсора в точке, ...у меня например в Windows XP и Vista значение поправок разные, почему так я не знаю, но на экране центр будет одинаковый только если правильно его выбрать.
Для этого случая есть функция ScreenToClient(). А "поправки" могут быть разные и в XP для разных тем (оформления окон)
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 23.07.2009, 14:58   #12
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от 0nni Посмотреть сообщение
Функции перевода экранных координат в координаты поля проверялись? У меня такие расчеты ерунду выдают, хотя мб что то напутал
Скорее всего что-то напутали ) ...алгоритм работает исправно 2 года.
Правильно ли выбраны поправки? ...у вас XP или Vista? Вот так для Vist'ы:
Код:
CellX := 1 + Trunc((Mouse.CursorPos.X - Form1.Left + 8) / Wp);
CellY := 1 + Trunc((Mouse.CursorPos.Y - Form1.Top - 22) / Hp);
...я беру координаты мыши по таймеру, в этом же таймере и обновление множества параметров, надписей, системных и игровых, ...если это все загнать в FormMouseMove, то заметно повышается нагрузка на CPU при движении мышью.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 23.07.2009, 15:05   #13
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Что за поправки? Буэ, плохой код, есть TForm.ClientWidth/ClientHeight и ScreenToClient опять же
пыщь
JTG вне форума Ответить с цитированием
Старый 23.07.2009, 16:14   #14
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

Beermonza, для какой висты?! сделай в висте оформление 95-й винды и твои поправки уже ни куда не годятся:
Код:
var pt : TPoint;
begin
  pt := Form1.ScreenToClient(Mouse.CursorPos);
  Caption := IntToStr(pt.X) + ':' + IntToStr(pt.Y);
в pt координаты мыши относительно клиентской части окна.

зы. Я говорил про код который в статье, для "нормальной" изометрии.
Сказал и загрустил от бесспорности своей правоты.

Последний раз редактировалось 0nni; 23.07.2009 в 16:18.
0nni вне форума Ответить с цитированием
Старый 23.07.2009, 16:15   #15
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Да простят меня боги трансформации, ...не использую ничего такого и этакого, без надобности, ...извиняйте, что знал то дал, дальше сами ))) ...но это же не значит, что простота интерпретации представлена плохо? ...наоборот, если внести коррективы, то будет еще проще.
Пользуйте на полный экран ))
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 23.07.2009, 19:54   #16
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

После того, как меня отпинали, можно даже сказать ногами (буга-га-га), ...нашел метод попроще, естественно заглянув в обвертки ScreenToClient(). Вот так можно взять координаты очень просто с активного окна, раз уже это есть, пусть будет так:
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  MouseX := X + {четверть длины клетки};
  MouseY := Y + {четверть высоты клетки};
end;
... потом в вычислениях когда нужно:
Код:
CellX := 1 + Trunc(MouseX / {половина длины клетки});
CellY := 1 + Trunc(MouseY / {половина высоты клетки});
Значения в фигурных скобках, естественно - переменные, сразу заданные в OnCreate формы.
Может я и параноик совсем, но что-то меня коробит вызывать ScreenToClient() от мыши в форме, притом что в ней уже есть FormMouseMove, где X и Y уже содержат те же значения, что мы стремимся получить из ScreenToClient().
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 23.07.2009, 23:17   #17
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
Функции перевода экранных координат в координаты поля проверялись?
В этой же ветке в теме Игра с Гошей в деревне в полную меру используются все расчеты. Код я выложил, так что кому интересно , без проблем могут все это проверить (для этого и выдан открытый код)
В проекте именно по этому вопросу вроде багов не наблюдалось.
А по сути систем счисления по отношению к экранным координатам , как раз и проявляются интересные моменты в плане оптимизации кода.
Добавлю - я обычно все проекты тестирую , как минимум, на трех разных машинах и, обязательно, на одной с минимальной конфигурацией.Понятно, что на 2 .. 4 ядерных процессорах это может и не актуально, но все же любой проект должен работать на любой машине.
Может не в тему, но меня всегда коробит от того,что, например, файлы созданные в AutoCAD 2007 ненльзя открыть в 2003-м, или Corel12 не открыть в одинадцатом.
Понимаю, что это политика производителя софта, дабы покупали все новейшее (Windows именно такую политику проповедует).
Но, считаю, программисты должны придерживаться правила IBM - то есть открытости архитектуры и использования всех ресурсов , начиная с минимума.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 23.07.2009 в 23:44.
DeKot вне форума Ответить с цитированием
Старый 23.07.2009, 23:38   #18
0nni
Форумчанин
 
Аватар для 0nni
 
Регистрация: 24.07.2008
Сообщений: 279
По умолчанию

У меня при компиляции среда виснет, (кодгир 2009) поэтому не смог оценить.
Еще помучаю и отпишусь.
Сказал и загрустил от бесспорности своей правоты.
0nni вне форума Ответить с цитированием
Старый 30.10.2011, 19:24   #19
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Уже давно пытаюсь создать изометрическую игру, но не могу найти хороший алгоритм создания карты.

Первый вариант (создал на основе этой статьи):

Код:
procedure DrawMap;
const
X2=6; Y2=10; // Число клеток.
var
X, Y: Byte;
DrawX, DrawY: Word;
begin
for Y:=0 to Y2 do
for X:=0 to X2 do
begin
// При условии, что оба числа имеют одну четность: 
if (Odd(X)=Odd(Y)) then
begin
// Позиция отрисовки:
DrawX:=(X div 2)*64; DrawY:=(Y div 2)*32;
// Смещение при нечетных координатах:
if Odd(X) then DrawX:=DrawX+32;
if Odd(Y) then DrawY:=DrawY+16;
// Вывод текстуры:
Form1.Image.Canvas.Draw(DrawX, DrawY, Texture);
end;
end;
end;
Плюсы:
  • Нулевой индекс карты ([0, 0]) соответствует верхнему левому углу, что вполне удобно.
  • Определить индекс клетки по координатам мыши не составляет труда.
Минусы:
  • Не задействованы координаты разной четности, то есть, нет объектов, у которых X=3 и Y=2.
    Соответственно при объявлении массива:
    Код:
    Map: array [0..6, 0..10] of Byte;
    его половина элементов не будет использована.
  • Для отображения области 256x192 требуется 39 вызовов процедуры Draw.

Второй вариант (получил в результате поворота карты на 45º и уменьшении высоты вдвое):

Код:
procedure DrawMap;
const
X2=6; Y2=10; // Число клеток.
var
X, Y: Byte;
DrawX, DrawY: ShortInt;
begin
for Y:=0 to 3 do
for X:=0 to 3 do
  begin
// Координаты вывода:
DrawX:=(32*X)-(Y*32); DrawY:=(X+Y)*16;
// Вывод текстуры:
Form1.Image.Canvas.Draw(96+DrawX, DrawY, Texture);
  end;
end;
Плюсы:
  • Используются все элементы массива карты.
  • Область 256x192 создается за 16 проходов цикла.
Минусы:
  • Не привычно, когда карта начинается в середине экрана.
  • Карта в виде ромба отпугивает игроков, так как прямоугольная форма более удобна и имеет приятный вид.

Вопрос к разработчикам, которые смогли реализовать изометрическую проекцию в своей игре:
как создать правильную систему координат?
P.S. Под правильной системой координат, я подразумеваю объединение плюсов первого и второго варианта
Alexan-Dwer вне форума Ответить с цитированием
Старый 30.10.2011, 20:00   #20
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Alexan-Dwer, если подумать хорошо, то у первого метода минусов нет, если учесть, что можно задействовать и "межклеточное" пространство, т.е. объект может стоять и между клетками. Фактически, клетки - сетка наложения тайлов, а объекты перемещаются с большей степенью свободы, вставая там, где требуется.

По этой же системе строится и сотовая система координат. Тайлы размещаются и в четных и нечетных координатах по структуре.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клеточное поле в изометрии. proglamer HTML и CSS 10 26.05.2009 01:09
Графика StudentPolitech Помощь студентам 1 26.12.2008 19:13
графика ben95 Общие вопросы Delphi 3 06.02.2008 22:24
Графика С++ kommunist Общие вопросы C/C++ 6 14.01.2008 15:21
Графика Dizman Помощь студентам 20 17.12.2007 17:03