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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2012, 15:18   #11
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

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

по-моему, наилучшее решение - это взять множество ВСЕХ клеток,
исключить из него множество клеток, в которых находится змейка,
и нужную клетку выбирать из оставшихся клеток.
xrob вне форума Ответить с цитированием
Старый 23.09.2012, 21:22   #12
Slin
Пользователь
 
Регистрация: 06.09.2012
Сообщений: 14
По умолчанию

xrob, Вы правы на счет первого варианта, поэтому я и реализовал второй.
Slin вне форума Ответить с цитированием
Старый 26.09.2012, 13:02   #13
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Забыл отписать, позавчера сел порефакторить в педагогических целях код, вот выкладываю. Там, кстати, реализован этот второй способ - без перебора "пока не попал в пустую клетку", а именно взятием случайного числа(номера клетки в наборе) из набора гарантированно пустых клеток.

Что хочу сказать. Для начала - хорошо, что пошли правильным путём и начали с малого - со змейки, причём на готовых элементах - шейпах, имейджах и т.п.
Я советую продолжать дальше и поизучать "важные" темы из этого раздела (раздела игр) - там очень много учебной информации - как раз по написанию игровых составляющих на дельфи.
В первую очередь, хочу посоветовать направить усилия на кодирование графики "руками" - т.е. без шейпов, имейджей и т.п. - хотя бы чисто на канвасе. Можно более универсально работать над вводом - от мыши и клавиатуры. Начать работать с файлами - для динамической подгрузки контента (а то, что в имейджах лежит - оно прикомпилируется в экзешник и менять малореально без той же дельфи и тем более исходных кодов) и выгрузки игровых данных типа сейвов, карт, таблиц рекордов.
Ещё надо направить усилия на большее структурирование и алгоритмизирование кода - выделение структур, подпрограмм, массивов, методов обработки всего этого, возможно подступиться к динамическому программированию(на указателях). Потом можно перейти к классам (ооп) и /или движкам и сложным системам.
В этих вопросах, в приницпе, можете всецело рассчитывать на мою помощь и консультацию.
Вложения
Тип файла: zip Unit1.zip (2.6 Кб, 12 просмотров)

Последний раз редактировалось phomm; 26.09.2012 в 13:09.
phomm вне форума Ответить с цитированием
Старый 28.09.2012, 15:35   #14
Slin
Пользователь
 
Регистрация: 06.09.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
без шейпов, имейджей и т.п.
Именно этим я сейчас и занят, думал, что это тяжело, без шейпов-то, имейджов, а нет, нужно было просто освоиться.
Начал писать "стратегию" накидал имейджов штук 10-это были только кнопки меню, сразу понял, что так дело не пойдет, поудалял все, начал писасть заново на канве - совсем другое дело, смотришь, и глаз радуется, на форме пустота, только один таймер красуется. (Просто у меня через Paint, который у формы, не получилось выводить изображение ). А вообще, канва- это вещь! Пока что вопросов у меня не возникло. Хотя есть один: как указать, какой цвет будет прозрачным у битмапа? Если писать так:
Код:
all_tex[i].Transparent:= true
То получается, что цвет задает - левый нижний пиксель?
А как левый верхний пиксель? Пробовал так - не получилось:
Код:
all_tex[i].TransparentColor:=all_tex[i].Canvas.Pixels[0,0];
Не подскажете?
Slin вне форума Ответить с цитированием
Старый 28.09.2012, 16:03   #15
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Slin Посмотреть сообщение
как указать, какой цвет будет прозрачным у битмапа?
Код:
<...>
var
   AnimPers:array[1..8,1..1200] of Tbitmap;
<...>
    AnimPers[DirectionCount,VariationCount].TransparentColor:= ClBlack;
    AnimPers[DirectionCount,VariationCount].Transparent:=true
<...>
Для выводимых спрайтов прозрачность использую, на данный момент, в таком виде. Все спрайты имеют только оттенки черного, а черный цвет используется как фон для спрайта.
EridorBlade вне форума Ответить с цитированием
Старый 28.09.2012, 16:33   #16
EridorBlade
CAE Engineer
Пользователь
 
Аватар для EridorBlade
 
Регистрация: 10.03.2011
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Slin Посмотреть сообщение
Не подскажете?
У вас ошибки где-то в другом месте. Я тут по быстрому наваял используя ваш метод и у меня все заработало. Эта команда действительно берет левый верхний пиксель.
1prj.zip
Там по кнопкам посмотрите. Один вариант простая отрисовка. Другой вариант с использованием прозрачности по левому верхнему пикселю.
Чтобы было понятно, я создал массив, похожий на ваш. Если что-то непонятно, то задавайте вопросы. Тупо скопированный код пользы не принесет.

Единственный момент, что в моем коде небольшой недочет. Если нажимать в первую очередь на кнопку DrawWithTransparent, то из-за того что Transparent:=True;, вторая кнопка Draw нарисует тоже с прозрачностью. Поэтому для наглядности сначала нажимайте кнопку Draw, потом DrawWithTransparent. Но главный ответ на вопросы в коде

Последний раз редактировалось EridorBlade; 28.09.2012 в 16:41.
EridorBlade вне форума Ответить с цитированием
Старый 28.09.2012, 16:45   #17
Slin
Пользователь
 
Регистрация: 06.09.2012
Сообщений: 14
По умолчанию

EridorBlade, спасибо за содействие. Оказалось, это из-за меня прозрачность не работала!
После этого:
Код:
  all_tex[1].TransparentColor:=all_tex[1].Canvas.Pixels[0,0];
Я не писал это:
Код:
all_tex[1].Transparent:=True;
Все, спасибо, вопрос решен!
Slin вне форума Ответить с цитированием
Старый 04.10.2012, 22:08   #18
Slin
Пользователь
 
Регистрация: 06.09.2012
Сообщений: 14
По умолчанию

Доброе время суток, дорогие форумчане!
У меня опять возник небольшой вопрос, как можно реализовать чтение из txt файла? Т.е. имеется поле 16*16, при размещении на него какого-либо объекта, n-ной ячейке в текстовом документе присваивается номер объекта, пустые ячейки соответственно заполняются 0, записать - записал, а прочитать и подгрузить из файла не могу, в голову мысли не лезут. Вот пример текстового файла:
Код:
1 0 0 0 0 21 0 0 1 0 0 0 0 27 0 0 
0 0 0 0 21 0 0 0 0 0 0 0 0 0 0 0 
0 0 27 0 0 21 0 0 27 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 27 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 26 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 27 0 21 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
27 0 0 0 26 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 14 14 14 14 14 14 14 
0 27 0 0 0 26 0 0 0 14 14 14 14 14 14 14 
0 0 0 0 21 0 0 0 0 0 0 27 0 0 0 0 
0 0 0 0 0 21 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 21 0 0 0 0 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Помогите, пожалуйста!
Slin вне форума Ответить с цитированием
Старый 04.10.2012, 23:28   #19
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

В виде байтов не проще писать и читать будет ? или надо пока что без редактора, исправлять всё в текстовом виде ?
Если именно текстовый, то можно читать в строковую переменную посимвольно, а когда найден пробел/конец строки, преобразовывать полученное в число и записывать в массив для карты в памяти программы.
phomm вне форума Ответить с цитированием
Старый 05.10.2012, 15:07   #20
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

Следует использовать тип File Of Byte. Просматривать данные можно в Hex Editor. Вначале лучше изучить работу потоков, ...потом, создав MemoryStream просто заливаешь в него файл, и работаешь с ним в потоке, считывая по одному байту. Можно так же перегнать из потока в динамический массив и гонять в произвольном режиме доступа.

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра "Змейка" на 2 персоны [Dethklok] Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 07.06.2011 14:24
Assembler.Игра "змейка". Пупкин Помощь студентам 0 27.05.2010 00:08
Игра "Змейка" program123 Общие вопросы Delphi 2 08.03.2009 23:49
Игра "Змейка" spamer Общие вопросы Delphi 1 09.01.2009 04:22
Ещё одна игра "Змейка" Simply-Art Софт 17 05.07.2007 04:10