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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2011, 23:08   #41
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Поясню, почему в разы, а не половина. Если грамотно провести анализ сдвига карты, то можно заметить, что попиксельное смещение идет постоянно, но поклеточное только по прошествии некоторого времени, которое равно {Интервал таймера} * {Число пиксерей в клетке}. Т.е. обновление заднего фона требуется гораздо реже, чем кажется на первый взгляд. Мы просто делаем буфер больше чем вмещается на экране на 1 клетку, и двигаем вывод буфера по-пиксельно (выводить все равно каждый такт), а как только сдвиг насчитает размер клетки - перерисовывать буфер по данным массива, но уже применив сдвиг координат по карте, смещение заднего фона снова установить в 0 по нужной оси.
Спасибо за пояснение, думаю это действительно улучшит производительность, жаль что придется парится,с редактированием этой большой картинки, при иземении чего либо на карте
Цитата:
Сообщение от Beermonza Посмотреть сообщение
От Canvas нужно уходить, если дело касается масштабного сбора задника через малые промежутки времени, с учетом большого количества анимированных объектов.
А как можно избежать Canvas, точнее, какие еще функцию ввывода на экран бывают, я других не знаю


PS Огромное спасибо за ответы в теме
Всё будет так, как должно было быть, даже, если будет наоборот.
Odinok вне форума Ответить с цитированием
Старый 08.06.2011, 21:51   #42
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Читай в теме "Как Вы относитесь к созданию игр на Delphi?" с сообщения #442 и далее.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.01.2012, 12:32   #43
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Решил продолжить делать свою игру. Посмотрел на код и ужаснулся, от того что там где можно было использовать функцию или процедуру, использовался разбор каждого возможно варианта. Ну посидел подумал, переделать все, что смог, но с одним участком кода не могу разобраться, есть 4 процедуры, по сути делающие одни и те же вещи, только для разных переменных, и возник вопрос, как сделать так, что бы эти 4 функции превратить в одну. Посоветуйте что-нибудь.
Код:

procedure PlayerKeyLeft;     
begin
  if keyon=false then         
    begin
      keyon:=true;
      Player.TypeAnim:=Player.LeftAnim;
      If (Cell[Player.X-1,Player.Y].Move=1) or (Player.dX<>0) or (Player.dY<>0) then   
        If Player.dY=0 then
          begin 
            Player.dX:=Player.dX-Player.Speed;
            Player.TypeAnim:=Player.LeftAnim;
            If Player.dX=-Length_X then
              begin
                Player.dX:=0;
                Player.X:=Player.X-1;
              end;
          end else  
            If abs(Player.dY)<=(Length_Y div 2) then
              begin
                If Player.dY>0 then
                If Cell[Player.X-1,Player.Y].Move=1 then
                  begin
                    Player.dY:=Player.dY-Player.Speed;
                    Player.TypeAnim:=Player.UpAnim;
                  end;
                If Player.dY<0 then
                  If Cell[Player.X-1,Player.Y].Move=1 then
                    begin
                      Player.dY:=Player.dY+Player.Speed;
                      Player.TypeAnim:=Player.DownAnim;
                    end;
              end else
                If abs(Player.dY)>=(Length_Y div 2) then
                  begin
                    If Player.dY>0 then
                      begin
                        Player.dY:=Player.dY+Player.Speed;
                        Player.TypeAnim:=Player.DownAnim;
                        If Player.dY=Length_Y then
                          begin
                            Player.dY:=0;
                            Player.Y:=Player.Y+1;
                          end;
                      end;
                    If Player.dY<0 then
                      begin
                        Player.dY:=Player.dY-Player.Speed;
                        Player.TypeAnim:=Player.UpAnim;
                        If Player.dY=-Length_Y then
                          begin
                            Player.dY:=0;
                            Player.Y:=Player.Y-1;
                          end;
                      end;
                  end;
    end;
end;

procedure PlayerKeyUp;       
begin
  if keyon=false  then         
    begin
      keyon:=true;
      Player.TypeAnim:=Player.UpAnim;
      if (Cell[Player.X,Player.Y-1].Move=1) or (Player.dX<>0) or (Player.dY<>0) then    
        if Player.dX=0 then
          begin
            Player.dY:=Player.dY-Player.Speed;  
            Player.TypeAnim:=Player.UpAnim;
            If Player.dY=-Length_Y then
              begin
                Player.dY:=0;
                Player.Y:=Player.Y-1;
              end;
          end else
            if abs(Player.dX)<=(Length_X div 2) then
              begin
                If Player.dX>0 then
                  If Cell[Player.X,Player.Y-1].Move=1 then
                    begin
                      Player.dX:=Player.dX-Player.Speed;
                      Player.TypeAnim:=Player.LeftAnim;
                    end;
                If Player.dX<0 then
                  If Cell[Player.X,Player.Y-1].Move=1 then
                    begin
                      Player.dX:=Player.dX+Player.Speed;
                      Player.TypeAnim:=Player.RightAnim;
                    end;
              end else
                if abs(Player.dX)>=(Length_X div 2) then
                  begin
                    If Player.dX>0 then
                      begin
                        Player.dX:=Player.dX+Player.Speed;
                        Player.TypeAnim:=Player.RightAnim;
                        If Player.dX=Length_X then
                          begin
                            Player.dX:=0;
                            Player.X:=Player.X+1;
                          end;
                      end;
                    If Player.dX<0 then
                      begin
                        Player.dX:=Player.dX-Player.Speed;
                        Player.TypeAnim:=Player.LeftAnim;
                        If Player.dX=-Length_X then
                          begin
                            Player.dX:=0;
                            Player.X:=Player.X-1;
                          end;
                      end;
                  end;
    end;
end;
Код весь не влез, и комментарии кода, не правильно отображаются.
Суть кода в том, персонаж двигается в направлении, которое ему задали или выравнивается,что бы была возможность пробежать дальше, наверное, надо переделать эту функцию совсемь, но вопрос как сделать процедуры, которая, будет менять разные глобальные переменные
Всё будет так, как должно было быть, даже, если будет наоборот.

Последний раз редактировалось Odinok; 13.01.2012 в 12:38.
Odinok вне форума Ответить с цитированием
Старый 13.01.2012, 18:06   #44
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Odinok Посмотреть сообщение
как сделать так, что бы эти 4 функции превратить в одну. Посоветуйте что-нибудь.
Смотри в суть процесса. Движение объекта - это изменение скорости по осям координат. Есть положительные скорости, есть отрицательные. При положительных скоростях объект перемещается слева направо, сверху вниз, а при отрицательных - справа налево, снизу вверх. При этом код функции проделывает операцию сложения текущих координат со скоростью (округляет, если надо) всегда, и в этом универсальность.


Код:
procedure PlayerMove(SpeedX, SpeedY: Integer);  // Лучше Real и округление
Если обе переменные равны нулю, объект будет стоять на месте. Обработка переменных по нажатию клавиш. Думай как выглядит код. Если что пиши сюда где застрял.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.01.2012, 18:25   #45
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Смотри в суть процесса. Движение объекта - это изменение скорости по осям координат. Есть положительные скорости, есть отрицательные. При положительных скоростях объект перемещается слева направо, сверху вниз, а при отрицательных - справа налево, снизу вверх. При этом код функции проделывает операцию сложения текущих координат со скоростью (округляет, если надо) всегда, и в этом универсальность.


Код:
procedure PlayerMove(SpeedX, SpeedY: Integer);  // Лучше Real и округление
Если обе переменные равны нулю, объект будет стоять на месте. Обработка переменных по нажатию клавиш. Думай как выглядит код. Если что пиши сюда где застрял.
Не у меня проблема возникает когда игроку говорят идти вниз, а он еще не дошел до той клетке где ему можно проходить, и вследствие он идет не вниз, а в сторону, что бы потом смог идти вниз, вот как сделать так, что бы одной функцией он проверял так и вниз, и влево, и вправо, и вверх. И как процедурой
Код:
procedure PlayerMove(SpeedX, SpeedY: Integer);  // Лучше Real и округление
изменять координаты по х или по у, if'ами что ли?


А и вы говорили, про более быстрый таймер, это как?
Всё будет так, как должно было быть, даже, если будет наоборот.
Odinok вне форума Ответить с цитированием
Старый 13.01.2012, 20:43   #46
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Odinok Посмотреть сообщение
изменять координаты по х или по у, if'ами что ли?
Да, будет четыре условия. Процедура PlayerMove будет находиться в теле таймера. Она только размещает объекты в буфере. Обработка движения отправляется под контроль формы в событие OnKeyDown. В ней, в зависимости от нажатой клавиши и положения объекта, в Cell[].Move отслеживаются свободные клетки. Если при нажатой клавише "вниз" Cell[Player.X, Player.Y + 1].Move окажется проходной, то SpeedY станет положительной единицей заданной скорости. То же самое по всем кнопкам, со своими сдвигами.

В таймере, после процедуры PlayerMove, переменные скорости SpeedX и SpeedY обнуляются. В следующий такт, если клавиши по прежнему зажаты, PlayerMove снова подвинет объекты. Если к началу выполнения процедуры PlayerMove клавиши так и не были нажаты, то объекты будут стоять на местах, поскольку SpeedX и SpeedY по прежнему хранят нулевую скорость для осей координат.

Цитата:
Сообщение от Odinok Посмотреть сообщение
А и вы говорили, про более быстрый таймер, это как?
Это конечный цикл в теле которого выполняется сложный код и подсчитывается процессорное время выполнения кода в последней строке. Все проходы сохраняются в массив. Затем, после окончания цикла, данные выводятся списком, так, что можно просмотреть время выполнения кода в каждом такте. Таким образом выбирается интервал для стандартного таймера. У меня код выполняется за 11-14 мс, вывод в форму за 16 мс, итого: 30 мс, ...интервал таймера TTimer я поставил 31 мс. Интервал 32 мс уже не котируется в TTimer, он выходит за замки двух оттяжек времени по 15-16 мс, и равен тем же 46 мс. Т.е. ты уже наверное понимаешь, что TTimer считает оттяжками по 15-16 мс, и нет смысла ставить разнообразные числа интервала, все равно таймер реагировать на них не будет. Учить создавать быстрый код и тебе 30 кадров в секунду хватить на всю жизнь, пока ты работаешь с 2D.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На Delphi 7 сделать игру кто хочет стать миллионером в delphi 7 666dart666 Помощь студентам 11 04.11.2010 17:57
Rad Studio 2011 XE: новое в Delphi, C++ Builder, RadPHP и Delphi Prism savva-paladin Софт 18 02.10.2010 20:24
Delphi. Как нарисовать в Delphi два движущиеся шара с определенной скоростью? redred Общие вопросы Delphi 10 11.12.2007 10:43
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54
не StringGrid1.Cells[1,1]:='Delphi'; а вот так SG1.C[1,1]:='Delphi' Nemesisking Компоненты Delphi 7 08.09.2007 03:27