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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2008, 10:11   #21
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию продолжаем

В дальнейшем все построения и расчеты будем делать в привязке к этим пяти const (пятая - это Ycenter -думаю понятно что это).
XL, XR - координаты по Х ракеток. Они также неизменные.

Зачем все это? Представьте, что вам надо изменить размеры корта (пришли большие тетеньки поиграть) или переместить в другое место (оказывается скоростная трасса Москва-СанктПетербург как раз пройдет через ваш корт). Тогда по всей программе вам придется изменять множество значений и не факт, что вы не пропустите чего-то. В нашем же случае достаточно изменить значения в const и все изменения в программе пройдут пропорционально.

Переменные. Пока нам нужны будут:
x,y -текущие координаты курсора формы (не путайте с курсором мыши).К ним привязаны координаты мяча.
rX, yLR - переменные координат ракеток. В них будут находиться координаты или левой, или правой ракеток.
dx,dy,yr - приращения к координатам, понадобятся дальше для движения.
countL,countR - в них будем хранить счет игры.
pen_color, brush_color - цвет пера и кисти.

На Canvas рисуется инструментами PEN(перо) для рисования линий фигур и BRUSH(кисть) - цвет заливки фигур или фон для текста.

Теперь программа. В процедуре FormActivate задаем начальное положение - ракетки посредине, мяч - слева посредине. Так как ракетки и мяч - это объекты, которые будут двигаться, то для рисования их пишем отдельно процедуры рисования Raket и Ball. Параметры в них указаны формально, т.е. они пока ничего не значат. Фактически эти процедуры - это шаблоны. По необходимости в программе мы вызываем эти шаблоны (сколь угодно раз и в любом месте программы), задаем необходимые значения переменным (формальным значениям присваиваем ФАКТИЧЕСКИЕ) и процедура рисует нам то, что нужно. То же самое с процедурой Info - для вывода табло счета. И теперь в процедуре FormPaint c помощью методов графических примитивов объекта TCanvas и созданных нами процедур рисуется игровое поле с неоходимыми атрибутами (мяч, ракетки).

Пока все - рисуем. Дальше разберемся как это все можно двигать.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось Beermonza; 28.10.2011 в 15:44.
DeKot вне форума Ответить с цитированием
Старый 02.09.2008, 15:34   #22
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию следующее продолжение

Попробуем оживить нашу игру. У нас будут три движущихся объекта - мяч и ракетки. Существуют различные методы создания эффекта движения. Но принцип в общем то один - сначала нужно уничтожить существующий объект (рисунок), а затем вывести его в другом месте, т.е. дать координатам объекта некое приращение. В зависимости от вида приращения к координатам можно получить различные виды перемещения, от простого прямолинейного перемещения до сложного - под углом, по кругу или эллипсу,
или по сложной кривой. Уничтожить объект можно различными методами - нарисовать поверх объекта прямоугольник размером равным объекту и цветом фона (в случае простого однотонного фона), нарисовать сам объект на том же месте, но задав цвет пера и кисти равным цвету фона (опять же, если фон однотонный). При сложном фоне нужно запоминать участок фона, куда будет выводиться рисунок, а потом для уничтожения рисунка накладывать запомненный фон. И так на каждом шаге перемещения.

Мы воспользуемся вторым методом - перерисовка объекта цветом фона. В процедурах Move_R и Move_B рисуем объект на том же месте, задав цвета пера и кисти равными цвету фона. Объекты становятся невидимыми (сливаются с фоном, но все таки продолжают существовать на форме. Т.е. фактического уничтожения объекта нет - он просто становится невидимым в этом месте).
Далее даем приращение координатам. Для ракетки достаточно одного по оси Y - yr, а для мяча dx и dy. Тогда он будет двигаться под углом. Опять же, процедуры Move_R и Move_B - это только шаблоны. Для создания движения воспользуемся обработчиком события нажатия клавиши FormKeyDown. Используем клавиши "стрелка вверх" (код 38) и "стрелка вниз" (код 40) для перемещения ракетки и клавишу "пробел" (код 32) для перемещения мяча. Создайте обработчик и запишите в него следующий код :

Код:
     procedure   TForm1.FormKeyDown(Sender: TObject; var  Key:  Word;  Shift:  TShiftState);
     begin
         case  Key  of                  //   воспользуемся оператором выбора  case
         38:  begin  yr:= -20;  Move_R; end;     //  нажата  клавиша Up.Присваиваем  yr значение = - 20 и
                                                                       //  вызываем  процедуру перемещения ракетки  Move_R 
          40: begin  yr:= 20:  Move_R; end;      //   то же самое в другую сторону
          32: begin  dx:= 16;  dy:= 4;  Move_B; end;    //  для мяча  даем приращение по двум координатам
          end;
     end;
Запустите программу и посмотрите, что получилось. Поменяйте значения приращений. Для непрерывного движения мяча можно воспользоваться оператором цикла :

Введите var i : byte;

Код:
          32:  begin   dx:= 16; dy:= 4;
                            for  i := 1  to   20  do
                            begin
                               Move_B;
                            end;
                  end;
            end;
       end;
Все это конечно пока примитивно - и мяч и ракетка будут убегать за пределы формы. Далее научимся держать объекты в нужных пределах.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось Beermonza; 28.10.2011 в 15:49.
DeKot вне форума Ответить с цитированием
Старый 02.09.2008, 15:40   #23
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию окончание

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

Стратегия игры следующая - после подачи (клавиша "пробел") клавишами UP и DOWN перемещаем ракетку (ту к которой движется мяч), чтобы "отбить" мяч (мяч попадает в ракетку). При попадании - мяч движется в противоположную сторону и управление ракеткой переходит на ту к которой опять движется мяч. От боковых линий мяч отскакивает, меняя направление движения на противоположное. Если мяч не попал в ракетку - проигрывается очко и подача переходит к выигравшей стороне. Для управления движения мячом используем таймер Timer1. При каждом срабатывании таймера мяч перемещается на один шаг (dx и dy). В промежутках между срабатыванием таймера будем управлять движением ракеток, анализировать позицию и выводить информацию о счете.

Обратите внимание на кое какие изменения в переменных. Я ввел для каждой ракетки свою переменную координат по оси Y - yL и yR (xL и xR - const). Переменным rX и rY будем, по необходимости присваивать координаты левой или правой ракетки. dx и dy - приращения координат для мяча, db - еще одна дополнительная переменная приращения для мяча. Когда выигрывается очко, создадим небольшой эффект мигающего мяча. Там она и понадобится. Переменная приращения координат по-Y для ракеток названа - dr. Все дальнейшие подробные пояснения смотрите в коде в комментариях.

Игра получилась простой как по коду так и по алгоритму, на уровне древнего тенниса из приставок, хотя и не в таком черно-белом квадратном формате. В принципе данный код можно использовать, как шаблон и на ее основании развивать игру дальше, вводя какие-то новые элементы и алгоритмы.
Вложения
Тип файла: rar TENNIS_02.rar (9.6 Кб, 44 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось Beermonza; 28.10.2011 в 15:55.
DeKot вне форума Ответить с цитированием
Старый 08.02.2010, 03:08   #24
romec1
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 50
По умолчанию

Люди, а исходника тенниса на Билнере ни у кого нету ?
Я не волшебник.. я только учусь
romec1 вне форума Ответить с цитированием
Старый 08.02.2010, 10:11   #25
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

To romec1
Что ВЫ имеете ввиду под исходником на Билдере?
Здесь на форуме есть несколько игр типа Теннис - пройдитесь поиском.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 08.02.2010, 11:55   #26
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Добавил своего кода Удобный выход по Esc:
Код:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  // реакция на нажатие клавиш
  Shift: TShiftState);
begin
   case Key of
  38: begin if rY < YlineU  then dr:=0   // если ракетка достигла верх. края корта
                                         // приращения нет - ракетка дальше не двигается
            else dr:=-20;   // при каждом нажатии клавиши стрелка UP - сдвиг
            Move_R; end;    // ракетки на 20 pixels
  40: begin if rY > (YlineD - 50)  then dr:= 0   // аналогично при движении ракетки вниз
            else dr:= 20;   // при DOWN -сдвиг ракетки вниз
            Move_R; end;
  32: begin
        Form1.Timer1.Enabled:= true;  // подача - запускаем таймер,управляющий
      end;                            // движением мяча
  27: close;                          // выходим из игры
  end;
end;
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 28.10.2011, 01:04   #27
wolf_den
Пользователь
 
Регистрация: 28.10.2011
Сообщений: 14
По умолчанию

это все конечно интересно, но слишком просто... вот пытаюсь сейчас сделать волейбол при помощи DelphiX и столкнулся с проблемой полета мяча, он вообще ну никак не хочет летать по всему экрану...полет того же шарика на обычной форме описан в инете и проблем нет, но в DXDraw правила несколько иные и ничего не получается, мяч летает туда-сюда только по диагонали....может поможет кто с проблемой? (((
wolf_den вне форума Ответить с цитированием
Старый 28.10.2011, 07:13   #28
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Чтобы помочь с проблемой, надо её локализовать, а мы никак этого не сможем, мы не хакИры, чтобы со своего компьютера залезть в Ваш и смотреть код, Вам надо его закинуть сюда на форум, вложением, в архиве. Надо указать, где, по-Вашему, может быть источник проблемы, а то копать-разбирать чужой код мало кто захочет, а так Вы разительно упросите работу по "помоганию Вам" и впредь, имейте это, пожалуйста, в виду.

А по поводу слишком просто - тут каждый полуторный (сиречь 75%) хочет написать игру и глохнет за пару месяцев, сделав не так уж и много, так что постарайтесь не тянуть, и делайте простое, быстрее и вероятнее закончите, а вот потом уж занимайтесь сложным, это просто совет "бывалого" ))
phomm вне форума Ответить с цитированием
Старый 28.10.2011, 19:05   #29
wolf_den
Пользователь
 
Регистрация: 28.10.2011
Сообщений: 14
По умолчанию

да с простыми вещами проблем мало....а вот с DelphiX сутки уже мучаюсь чтобы движение мяча описать в DoMove
Вложения
Тип файла: rar волейбол.rar (433.2 Кб, 14 просмотров)
wolf_den вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доделать браузерную игру Beliar Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 31.07.2008 19:24
Доделать браузерную игру. Beliar Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 31.07.2008 15:07
Зацените игру snake-as Софт 3 08.01.2008 00:16
Ищу игру PAVEL315 Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 20.04.2007 12:13