Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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


Ответ
 
Опции темы
Старый 17.11.2020, 16:05   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 141
По умолчанию Прорисовка видимой части карты

Всем доброго времени суток, уважаемые эксперты. Столкнулся с проблемой.

Задача:
Есть игровая карта (массив цифр). По цифрам рисую квадраты нужного цвета. Вся карта рисуется без проблем. Но мне необходимо сделать так, чтобы рисовалась только видимая персонажем часть карты. Я вычисляю по положению персонажа клетки, которые нужно показать (беру по всем сторонам +1 лишнюю клетку, которая будет либо не видна, либо видна частично при перемещении).
И при перемещении персонажа вроде бы сама карта двигается и прорисовывается плюс минус нормально. Когда персонаж подходит к границам карты - ее скроллинг (сдвиг nx, ny) прекращается, а когда отходит за средину размеров формы - скроллинг продолжается.

Беда заключается в том, что при отображении видимой части карты мой персонаж отображается неправильно (отображается не по центру экрана, а иногда вообще за границами). Я не правильно просчитываю его сдвиг, судя по всему. И никак не могу придумать нормальный сдвиг. Пробовал разными способами, но голова не соображает.

Если у кого-то есть идеи - заранее буду благодарен. Код и проект прилагаю (предполагаю ошибку в посл).

Код:
procedure DrawPart(var PX,PY,Cell,MapX,MapY:Integer; Buf,Graf:TBitmap);
var i,j,x0,x1,y0,y1,nx,ny:Integer; pxx,pyy:integer;
begin
  //razreshenie prorisovki eto razmer bufera
  //ogranicheniya granits prorisovki
  if (PX<=Buf.Width div 2) then x0:=0 else
  if (PX>MapX*Cell-Buf.Width div 2) then x0:=(MapX*Cell-Buf.Width) div Cell-1 else
  x0:=PX div Cell-1;

  if (PY<=Buf.Height div 2) then y0:=0 else
  if (PY>MapY*Cell-Buf.Height div 2) then y0:=(MapY*Cell-Buf.Height) div Cell-1 else
  y0:=PY div Cell-1;

  x1:=x0++(Buf.Width div Cell+1);
  y1:=y0+(Buf.Height div Cell+1);

  //sdvig prorisovki
  if (PX<=Buf.Width div 2) then nx:=0 else
  if (PX>=MapX*Cell-Buf.Width) then nx:=MapX*Cell-Buf.Width else
  nx:=PX;

  if (PY<=Buf.Height div 2) then ny:=0 else
  if (PY>=MapY*Cell-Buf.Height) then ny:=MapY*Cell-Buf.Height else
  ny:=PY;

  for i:=x0 to x1 do
  for j:=y0 to y1 do
  begin
    case map[i,j] of
    0:Buf.Canvas.Brush.Color:=clBlue;
    1:Buf.Canvas.Brush.Color:=clYellow;
    2:Buf.Canvas.Brush.Color:=clGreen;
    3:Buf.Canvas.Brush.Color:=clGray;
    4:Buf.Canvas.Brush.Color:=clOlive;
    end;
    if (i>=0) and (j>=0) and (i<=100) and (j<=100) then //ne vihodit za ramki

    Buf.Canvas.Rectangle(i*64-nx,j*64-ny,i*64+64-nx,j*64+64-ny);
    //Buf.Canvas.Draw(i*Cell-nx,j*cell-ny,Graf);
  end;

  buf.canvas.Brush.Color:=clRed;
  //sdvig
  pxx:=nx-form1.ClientWidth;
  if pxx<0 then pxx:=0;
  if pxx>MapX then pxx:=MapX;
  //sdvig
  pyy:=ny-form1.Clientheight;
  if pyy<0 then pyy:=0;
  if pyy>MapY then pyy:=MapY;
  //personazh
  buf.Canvas.Ellipse(px-pxx-nx,py-pyy-ny,px+64-pxx-nx,py+64-pyy-ny);
Armageddets вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме от 7000 рублей в месяц



Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение фона ЧАСТИ изображения Графические карты DimaDR HTML и CSS 1 01.11.2017 10:00
Ищем специалиста(смарт-карты,бонус.карты и т.п) modob1 Фриланс 3 20.01.2012 10:09
Изменение видимой части формы niki2012 Общие вопросы Delphi 14 13.01.2011 22:50
Координаты центра видимой части ScrollBox Алён@ Компоненты Delphi 13 04.02.2009 17:58
Как определить координаты видимой части PaintBox? Vladimir K. Общие вопросы Delphi 3 28.12.2006 10:02


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Скидки на курсы GeekBrains 40%, выбирайте программу для себя