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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2008, 12:52   #91
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

А вот ещё недочёт. С первым уроком, как я уже говорил всё понятно, НО прикол в том что если использовать Form1.Canvas.Draw(130,50,Buf); потом свернуть и развернуть экран - картинка исчезнет...
Манжосов Денис :) вне форума Ответить с цитированием
Старый 21.08.2008, 14:30   #92
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Да! Такой глюк присутствует.При изменении размеров окна запускается процедура TForm4.FormPaint(Sender: Object);
Самый простой способ избавиться от этого, дабы не бороться программно,
это в Object Inspector в свойствах Form 4 - BorderIcons все четыре параметра установить в False, отключив тем самым системные кнопки
управления окном.

Пойдем дальше знакомиться с программой.
Теперь начнем непосредственно работать с программой.
Первое: составим алгоритм взаимодействия между формами в виде блок – схемы.
Вообще составление блок-схем очень важная часть программирования. Приучите себя
постоянно пользоваться этим инструментом. Это генеральный план разработки программы.
Он позволяет постоянно видеть процесс создания программы, незаменим при отладке и
поисках ошибок.

Все переходы между формами у нас происходят по событиям OnClick кнопок меню, за
исключением вывода заставки и справки по On Paint на Form 1 и Form 2.
Блок – схема 1 во вложении.




Позже составим алгоритм работы программы непосредственно в Form 4 - основная программа.
Вложения
Тип файла: rar Блок-схема1.rar (17.5 Кб, 15 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 16:47   #93
Манжосов Денис :)
Участник клуба
 
Регистрация: 29.01.2008
Сообщений: 1,039
По умолчанию

С этим ясно, возможно нам следует уже начать программировать сам игровой мир?
Манжосов Денис :) вне форума Ответить с цитированием
Старый 21.08.2008, 17:43   #94
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Хорошо, Денис! Идем дальше.Правда, что-то Алекса не видно.Подозреваю он еще учится.
Смотрим загрузку новой игры.
Теперь основное - весь алгоритм программы в Unit4 и Form4.
Начнем с построения уровня. Итак : склад – это 15 на 15 блоков по 50 на 50 пикселей.
Каждый блок сначала надо нарисовать (ручками-ручками).Впрочем можно и слямзить откуда нибудь и доработать под свои нужды. Я лично рисую в Paint-е.Далее – каждый блок имеет свой
индекс ( см. выше цифры в скобках).Файл каждого блока записываем в файл ресурсов Unit4.res.
Структуру каждого уровня, т. е. индексы блоков будем хранить в двухмерном массиве:
mas : TIndex = array [0..14,0..14] of integer;
а все уровни в одномерном массиве двухмерных массивов TIndex:
all_mas: array[0..59] of TIndex; - начальные значения, как const,
а текущие в mem_mas: array [0..59] of TIndex ; - как переменная (текущие значения по ходу игры
будут изменяться с каждым ходом).
Все начальные значения индексов каждого уровня заносим в массив all_mas опять же рученьками. Да-да, только так.Представте – 60 уровней по 15*15=225 .А если уровней еще больше?
Вот так! Частенько программирование – это рутинная работа.
Далее просто – см. процедуры StroySklad и StroySegement . В первой используем два цикла
for, а во второй уже знакомый метод с буфером TBitMap.

Карта уровней .
Изначально при любом включении игры карта загружается из файла ресурсов
Unit4.res уже известным нам методом Draw через буфер TBitMap. Смотри процедуру
StroyMap. Сама карта показывающая начальное состояние всех уровней, рисуется вручную(опять!).Говорю же , что рутины тут навалом. Потом только надо выделить текущий уровень - делаем желтую окантовку по периметру уровня . Для этого используем метод
заливки области FloodFill ( x,y – координаты точки внутри (обязательно замкнутой) области;
color – цвет заливки; fsSurface – тип заливки). Смотри процедуру FillBorderMap.
При переходах между уровнями убираем окантовку на старом уровне и отрисовываем на
новом.
Когда по ходу игры все сундуки установлены на свои места , уровень выделяется - изменяется картинка (схематично показано собранный уровень) и устанавливается ярко-зеленый фон. Каждый такой собранный уровень вырисовывался отдельным файлом 46 х 46 пикселей
и затем записаны в ImageList. Индекс файла в ImageList совпадает с номером уровня (склада).
Затем по необходимости каждый такой файл накладывается на основную карту процедурой
SkladSobran c использованием координат уровней на карте - KoordMap.

Атрибуты индикации - визуальные компоненты, брошенные на форму с использованием их
свойств. Здесь , мне кажется, также все просто и понятно. Но если это не так – спрашивайте. Я постарался отразить структуру программы
со всеми вложениями процедур, как они происходят по мере их вызовов. В квадратах отдельные процедуры с некоторыми пояснениями сути процессов.Блок-схема поможет разобраться с последовательностью работы начальной части программы. В след. раз
разберем загрузку сохраненной Игры.


Во вложении блок-схема 2 начала с новой Игры.
Изображения
Тип файла: jpg Блок-схема-2_1.jpg (9.8 Кб, 132 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 17:54   #95
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Да! Формат JPEG нормально не прочитаешь.Сам проверил.Повторю вложение блок-схемы 2 в другом формате.
Вложения
Тип файла: rar Блок-схема-2.rar (44.9 Кб, 17 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 18:21   #96
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Извините что вмешиваюсь в процесс
Денис писал
Цитата:
А вот ещё недочёт. С первым уроком, как я уже говорил всё понятно, НО прикол в том что если использовать Form1.Canvas.Draw(130,50,Buf); потом свернуть и развернуть экран - картинка исчезнет...
Учитель на это ответил, мол не парься, спрячь кнопки и все. Хочу предложить более правильный вариант, создайте обработчик события формы OnPaint, и туда впишите ту же самую отрисовку Form1.Canvas.Draw(130,50,Buf);
Теперь если по каким-то причинам изображение на форме затрется, все опять восстановится.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.08.2008, 18:49   #97
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

И это, конечно, правильно.НО!Если быть точным, то картинка не исчезает,
а перерисовывается и появляется Игра с начального уровня. Т.е. теряем
все то что мы "набегали".Получится, что надо будет периодически после каждого хода или через какие-либо промежутки времени сохранять экран в буфер, чтоб при перерисовке по OnPaint восстановить именно
последний текущий сюжет. Это, конечно вполне возможно, но будет громоздко. Поэтому считаю вариант с исключением системного управления более рациональным.
Но я же повторяю - вносите любые изменения в проект. Это только на пользу.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 19:33   #98
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Поэтому считаю вариант с исключением системного управления более рациональным.
Вы не учитываете сторонних факторов, изображение может затереться не обязательно по вине пользователя. Любое сообщение выведенное поверх окна затрет его, например файл закачался или любое другое сообщение от любой программы.
А если нужно на минуту открыть другую программу, куда игру девать?

Мое изменение в проект - либо рисовать в TImage, либо обрабатывать перерисовку.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.08.2008, 19:40   #99
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
А если нужно на минуту открыть другую программу, куда игру девать?
Игру можно сохранить в любой момент и потом продолжить с сохраненного места. А если рисовать в Image, то придется открыть
15 х 15 = 225 Image, т. к. алгоритм построен на принципе работы с каждым блоком отдельно.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 20:02   #100
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Отрисовка в Image:

Код:
Image1.Picture.Bitmap.Canvas.Draw(130,50,Buf);
Отрисовка в PaintBox:

Код:
PaintBox1.Canvas.Draw(130,50,Buf);
Это все аналогично выводу в форму, только не затирается.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Калькулятор в Delphi" в теоретические аспекты??? jenja Общие вопросы Delphi 1 25.05.2008 23:23
основные цели и задачи студенческого форума? ALEXBAZ Свободное общение 1 14.05.2008 22:24
комп. для программирования фамил Компьютерное железо 4 09.05.2008 12:11
Неделя программирования Stiker Свободное общение 2 10.02.2008 21:15