Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Полигон
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  04:36[Войти] | [Зарегистрироваться]

Обсуждение материала
Клетчатые игры
Полный текст материала


Другие публикации автора: Антон Григорьев

Цитата или краткий комментарий:

«... Существует много игр, полем для которых является прямоугольная доска, расчерченная на клетки. При программировании таких игр выполняется целый ряд однотипных действий, связанных с отображением доски и фигур на ней. Предлагаемый в статье компонент берёт на себя эти низкоуровниевые действия, позволяя разработчику оперировать высокоуровневыми абстракциями фигур. Поддерживается анимация фигур и графических объектов, не являющихся фигурами. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.




Смотрите также материалы по темам:
[Мерцание при перерисовке] [Создание собственных компонент] [Скорость отображения графики] [Программирование игр.] [Анимация] [Растры, BMP]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 53

24-10-2013 10:58
сообщение от автора материала
Конечно, моджифицируйте, как хотите, для этого исходный код и выложен. Можно даже распространять модифицированную версию при условии безвозмездности распространения и наличия ссылки на первоисточник.


24-10-2013 09:20
Очередное спасибо за компонент. Он настолько удобен в использовании, что я планирую породить наследника, вытащив наружу обработку клавиатуры, и сделать сетку-табло в стиле вокзальных табло бленкерного типа «ВизИнформ». Ну и заодно оторвать ММ-таймер, заменив его стандартным, бо мне большего не требуется. Настоящим прошу разрешения на модификацию компонента.


12-10-2012 06:48
Ещё раз спасибо за компонент! Пульт работает, программа пишется. Хотелось бы попросить разрешения на модификацию компонента в целях оптимизации прорисовки. Необходимо событие, аналогичное OnDrawBackground, но после прорисовки фона всех ячеек (надо разместить отметки, которые могут приходиться и на стык ячеек). Модификация не сложная, думаю - справлюсь сам. Ну или жду от автора улучшенной версии!


12-12-2011 10:35
сообщение от автора материала
Елизавета, движение без WaitMovement происходит один раз потому, что новое движение в этом случае создаётся ещё до того, как объект переместится в новую клетку. Точнее, вы параллельно создаёте девять движений, которые затем выполняются одновременно, но восемь из них перемещают пустое место из одной клетки в другую, поэтому они не видны. Вам надо создавать новое движение только после того, как старое завершится. Чтобы при этом не блокировать действия пользователя, вместо WaitMovement надо использовать класс TMovemtnsManager и его событие OnMovementFinished - новое движение должно срабатывать только после того, как старое завершится.

Кстати, TCellMovement умеет передвигать фигуры не только между соседними клетками, так что ваш цикл можно заменить одной строкой:

ManMovement:=TCellMovement.Create(Board.Layers[1],9,1,9,1,18);




11-12-2011 11:57
Здравствуйте!
Сначала хотелось бы Вас поблагодарить за библиотеку Клетчатые игры и задать один вопрос. Хочу сразу предупредить, что я не профессиональный программист!

Мы с детьми хотим сделать один проект и решили использовать для этого Вашу библиотеку.
Вопрос такой: как сделать движение, которое будет перемещать объект из одной клетки в другую и при этом не ждет завершение выполнения движения и позволяет пользователю выполнять какие-либо действия.
Например, выполнять движение врага из одного конца доски в другой. Если сделать вот так, то все приостанавливается:


For x:=9 downto 1 do
      begin
        ManMovement:=TCellMovement.Create(Board.Layers[1],x,1,x-1,1,2);
        Board.WaitMovement(ManMovement,False);
      end;


Если убрать WaitMovement, то движение происходит только один раз.
Помогите, пожалуйста, разобраться, ребят настроила игру делать и сама закопалась :(

Заранее спасибо за ответ и всего доброго!
Елизавета.


23-08-2011 23:30
>>> Объясните, пожалуйста, что может быть причиной задержки?
Я играю в десятую Кваку. Объясните, почему у меня в какой-то момент времени FPS падает до пяти? :D
Если одна программа тормозит, смотрите, на какую другую программу уходят ресурсы процессора. Или у вас всегда идет торможение на четвертом уровне?
 Geo


23-08-2011 08:21
Вот играю я в Sokoban (4-й уровень).
Жму на кнопки - грузчик бежит работать. Но через короткое время начинает проявляться задержка: жму на кнопки, а грузчик никуда не бежит.
Объясните, пожалуйста, что может быть причиной задержки?


20-08-2011 02:11
Полезный и нужный компонент, огромное спасибо. Долго искал нечто подобное. Использую для игрового симулятора диспетчерского пульта управления железнодорожной станцией. При размерах пульта 180х30 субблоков (ячеек) 16х16 пикселей (конфигурация на два монитора) и таймере в 100мс имеет место пожирание ресурсов до 50%. Вставка Sleep(1) снизила этот показатель наполовину. Таймер необходим для автоматического запуска итерации обсчёта перемещений подвижного состава и модели систем автоматики. При применении стандартного TTimer ресурсопожирание происходит только во время перерисовки пульта (согласен, он большой, и это я ещё второй слой не прикрутил). Как предложение - сделать возможность не выполнять анимацию доски при срабатывании таймера, а также (как в DelphiX) париостановку таймера при неактивности приложения. А в остальном - огромное спасибо!


29-09-2010 03:22
сообщение от автора материала
АндрейКо:

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

как вывести банки изображений за исполняемый файл?

Храните нужные изображения в отдельных файлах. На форму помещаете TBitmapCellBank, но в design-time никаких картинок в него не загружаете. Где-нибудь в начале программы (например, в OnCreate главной формы) загружаете требуемые рисунки из файла вручную с помощью методов TBitmapCellBank.Add<XXX>. По своим действиям эти методы аналогичны кнопкам редактора компонента, думаю, вы легко разберётесь, какие из них потребуются в вашем случае.

Кстати, в этом случае вы можете существенно сократить общий объём, сохраняя картинки на диске в виде PNG, а не BMP. Но тогда вам придётся при их загрузке написать код для конвертирования TPNGImage в TBitmap. Делается это очень просто, я думаю, вы легко найдёте в сети примеры.


18-09-2010 15:13
Илья Шафранов: СПАСИБО! попробовал - получилось.
Антону Григорьеву (от ЧАЙНИКА!): Теперь вопрос в другом: при значительных размерах объектов TCELLBANK (уже 5 МВ!) как вывести банки изображений за исполняемый файл? И.Г. - прошу учесть, я - чайник!


16-08-2010 04:35
...их количество ограничено только объемом памяти компьютера
Это здорово, а отображение и перемещение видимой части доски по желанию юзера?


16-08-2010 04:31
Клетки размером 32х32, строки и столбцы добавляются динамически
Так, так! А поподробнее, пжалста, для чайника...


06-08-2010 10:40
Да нет, не просто доску большого размера, а доску с большим количеством полей Cells, эдак 180х100 и размером 32х32 пикселя.
Как раз сейчас пишу такую игрушку (крестики-нолики). Клетки размером 32х32, строки и столбцы добавляются динамически, и их количество ограничено только объемом памяти компьютера. Успешно работает.


06-08-2010 02:07
Доску большого размера сделать очень просто: кинуть на форму объект TScrollBox нужного размера, а уже на него доску

Да нет, не просто доску большого размера, а доску с большим количеством полей Cells, эдак 180х100 и размером 32х32 пикселя.


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


05-08-2010 06:28
Доску большого размера сделать очень просто: кинуть на форму объект TScrollBox нужного размера, а уже на него доску (если я правильно понял вопрос).
Я не понял другое. Допустим, размер клетки 32х32 пикселя. У клетки граница толщиной 1. Этот 1 пиксел входит в число тех 32. Теперь рисуем в это клетке картинку (примитивной командой TCellGameBoard.Layers[0].Cells[Col, Row].State := что-то). Картинка рисуется начиная с левого верхнего угла клетки, перетирая часть границы. Как сделать, чтобы картинка рисовалась не поверх границы, а внутри нее?


10-07-2010 01:18
Как сделать доску большого размера с выводом только какой-то ее части на экран? Да, и размер компонента - в зависимости от видимой части?


24-03-2010 02:14
>>> Например вот так
Э-э-э... Предлагается переписать все компоненты из VCL и использовать модифицированные варианты? ;-)

>>> Если нужно полностью визуально, то есть в Samples компонент TSpinEdit, который поддерживает контроль вводимых границ (MinValue, MaxValue)
В том-то и фишка, что MinValue был выставлен (только не TSpinEdit, а TUpDown). Но его значение не соответствовало размерности массива, из которого брался элемент в зависимости от выбранного значения. И вот эту синхронизацию надо отслеживать руками.
 Geo


24-03-2010 01:22
А так приходится вручную следить за синхронизацией констант и свойств
Ну а что мешает значения свойств, которые важны отслеживать при присвоении?
Например вот так:


const
  MIN_DATA_VALUE = 2;

type
  TA = class(TObject)
  private
    Fdata: integer;
    procedure Set_data(const Value: integer);
  published
    property data: integer read Fdata write Set_data;
  end;

{ TA }

procedure TA.Set_data(const Value: integer);
begin
  if Value < MIN_DATA_VALUE then
    Fdata := MIN_DATA_VALUE
  else
    Fdata := Value;
end;


Или это называется "вручную"?
Такое свойство будет корректно обновляться, хоть из dfm, хоть при вводе в дизайнтайме, хоть при назначении из кода.
Если нужно полностью визуально, то есть в Samples компонент TSpinEdit, который поддерживает контроль вводимых границ (MinValue, MaxValue)


14-02-2010 13:12
сообщение от автора материала
Geo:

Это явная ошибка в назначении свойств. При двух цветах игра становится настолько лёгкой, что теряет всякий смысл, минимум должен быть, конечно же, равен трём. Вообще, очень не хватает возможности назначать в design-time свойствам не точные значения, а константы, объявленные обычным образом - тогда бы изменение константы в тексте меняло бы и значение из dfm-файла. А так приходится вручную следить за синхронизацией констант и свойств, рано или поздно где-нибудь да ошибёшься. Вообще, в таких случаях правильнее было бы отказаться от назначения свойств в DFM и, раз константы объявлены, присваивать их значения свойствам где-нибудь в OnCreate. Но от этого всегда удерживает мысль: "А зачем тогда вообще визуальное проектирование?"


06-02-2010 17:41
Нашел баг в игре CrashDown.

Массив стоимостей очков и штрафов индексируется с значения 3, но пользователь может выбрать и два цвета. При условии, что RangeCheck в опциях компилятора выключена, то программа позволяет начать играть и с двумя различными цветами. Но очень быстро происходит... Прикольно, но возникает Integer Overflow. перед массивом, видимо попадает не самое маленькое целое число, потому как счет в этой ситуации очень быстро начинает идти миллионами.
 Geo


26-06-2009 09:39
2 Ins:
Я как то ковырял паскалевские исходники от http://www.aggpas.org, но привыкнуть к идеологии этой библиотеки так и не смог:)

Да простят мне модераторы за оффтоп:)


По теме: огромный труд. Ужасно огромный.
Я в свое время долго бился чтобы задержки между тиками были равномерными и лучше, чем WaitForSingleObject(INVALID_HANDLE_VALUE, WaitTime) не нашел. А уж мультимедийные таймеры - это для меня что-то заоблачное:)


26-06-2009 07:40
Ужас стока работы и все через GDI

Вроде еще и GDI+ :-D Кстати, пользуясь случаем поинтересуюсь (надеюсь, Антон не будет сильно возражать)... Кто-нибудь библиотеку AGG (Anti-Grain Geometry) не пробовал использовать в Delphi?
 Ins


26-06-2009 01:07
>>> надо было делать хоть через какой нить враппер над ДХ или ОГЛ
А смысл? Если все работает и так, то зачем нужны ДХ и ОГЛ? Если уж на то пошло. то можно еще больще сказать: "Надо было взять какой-то готовый движок" :)
 Geo


25-06-2009 15:25
Ужас стока работы и все через GDI
:)
надо было делать хоть через какой нить враппер над ДХ или ОГЛ
 nLc


04-06-2009 14:16
сообщение от автора материала
может имеет смысл покопаться в свойствах инициализации, по крайней мере, для начала проверить, совместимя ли icq и другие известные программы друг с другом...

Когда исследовал вопрос, то в одной статье про мультимедийные таймеры встретил утверждение, что разработчики игр называют ICQ убийцей FPS, потому что из-за особенностей работы этого клиента с мультимедийным таймером FPS не может оставаться стабильным, он скачет туда-сюда в больших пределах даже при неизменном изображении в игре, так что совместимости явно нет.


04-06-2009 07:12
Так как мне никогда суперточность не нужна была поэтому я вобщем не в курсе. А искать информацию об этом лень.  :)
 riff


04-06-2009 06:49
CreateWaitableTimer

А чем он лучше остальных с точки зрения дискретности срабатывания? ;-)
 Ins


04-06-2009 05:44
Я смотрю вы здесь говорите про таймеры, я вобщем не в курсе, просто как предложение: а такой таймер не подойдёт? - CreateWaitableTimer
у меня есть таймер на этой "основе"
type
  TWaitTimer = class(TThread)
...
если надо могу прислать.
 riff


04-06-2009 03:57
>>> предлагаю автору в следующей версии перейти на DirectX
Вот помедитировал я на предмет "Сапера" на DirectX и пробило меня на "ха-ха". Собственно, у таких вот качественных универсальных библиотек есть один, скажем условно, недостаток. Точнее, не недостаток, конечно. У каждого инструмента есть своя область применимости. Если инструмент применяется для решения задач за пределами области применимости инструмента, то недостаток, конечно же, не в инструменте, а генах у разработчика.
 Geo


04-06-2009 03:45
С пониманием этого огромного труда, предлагаю автору в следующей версии перейти на DirectX, тогда анимацию можно будет делать с помощью формирования в памяти последовательных фреймов, а сама прорисовка будет с помощью функций видеопроцессоров видеокарт прямого доступа к памяти, где хранятся фреймы.

Насчет глюков медиатаймера - может имеет смысл покопаться в свойствах инициализации, по крайней мере, для начала проверить, совместимя ли icq и другие известные программы друг с другом...


03-06-2009 13:01
сообщение от автора материала
Мухтар:

Я же не предлагаю мерять время с помощью Sleep :-))) Я лишь предлагаю ее использовать в потоке для ограничения загруженности процессора.

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

Все равно (!!!) поток будет периодически прерываться на время, большее чем 1мс для осуществления многозадачности.

Особенность работы мультимедйных таймеров в том, что они изменяют время, которое планировщик задач отдаёт другому приложению. И если мультимедйный таймер настроен на 1 мс, а других, более приоритетных процессов нет, то приложение и будет получать свой квант времени каждую миллисекунду.

Давайте вы немного подучите матчасть, а потом уже будете давать советы, ладно?

Python:

Сразу же всплыли несколько замечаний по Саперу: поле не ставит знаки вопроса (отметки о "потенциальных" минах) и к тому же - первый клик может привести к подрыву.

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

Geo:

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

Такую анимацию, когда анимируется что-то конкретное с заданной наперёд скоростью, легко можно и на обычном таймере сделать. У меня была другая задача - плавная регулировка скорости. Поставил человек, например, интервал 12 мс, посмотрел - слишком быстро. Попробовал 14 мс - медленно. А вот 13 - в самый раз. При такой постановке задачи требования к таймеру существенно возрастают.


03-06-2009 09:31
"02-06-2009 07:43
.
.
.
Обновил архив, сейчас он там есть, в папке Units лежит.
Антон Григорьев"
//================================

Спасибо, Антон, сейчас всё устанавливается. Правда программу с Вашими компонентами делать ещё не пробовал, но вставить в проект их уже возможно :)


03-06-2009 07:11
>>> Я уже понял, что мультимедийный таймер - штука глючная
Это, наверное, самая ценная информация в статье ;-) Я уже давно на мультимедийный таймер облизываюсь, но теперь, похоже, буду искать другие решения.

Статью детально не изучал пока. На работе не могу вдумчиво изучать большие материалы, а дома проблемы с компом. Так что пока просмотрел по диагонали. Смысл примерно ясен. Заметил одну вещь, которая существующей библиотекой, вроде бы, не реализуется. Правда, я токлм не знаю, надо ли это вообще. А если надо, то как это сделать в рамках унивесральной библиотеки. Суть вот в чем. У меня в одной клетчатой игре при смене положения мышки (переходе на другую клетку) на поляне рисовались вспомогательные рисунки (ну, там всякие подсказки о разрешенных клетках, запрещенных клетках, "интересных" клетках и т.п., все это в зависимости от клетки, над которой стоит мышь). Так как все это должно было перерисовываться по движению мышки, то для скорости WM_PAINT не использовалось. Была быстрая функция рисования "хинтов" на канве через XOR, которая вызывалось прямо из обработчика движений мыши. Цели я достиг, всевозможные "хинты" и "гайдлайны" перерисовывались при смене положения мыши очень быстро. А вот можно ли это реализовать в рамках библиотеки (и нужно ли?), я пока не знаю.


>>> смысл должен был быть таким: я присваиваю новое значение свойству и начинается анимация переворота. Это отслеживает отдельный поток, который
Примерно так я делал для перемещения спрайтов. При нажатии, допустим, стрелки влево в специальном стеке команд помещались определенные данные, после чего "параллельный поток" (на самом деле, использовалось событие Application.OnIdle) занимался последовательным попиксельным перемещением спрайта в нужном направлении требуемой число раз (размер клетки). После того, как движок был доработан, программировать логику было очень просто.

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

>>> Но это не мешает указывать ему Sleep(1)
Ну, в таймере тоже можно установить интервал в 1 миллисекунду, а что толку? Кстати, если у Sleep действиетльно лискретность порядка 10 мс, то нет смысла использовать параллельный поток и Sleep. Проще использовать тот же самый системный таймер, у которого примерно та же дискретность.
 Geo


03-06-2009 06:57
>>>Таких программ было в свое время до и больше... у меня даже стояла одна.. не помню сейчас названия.
Вообще-то здесь нужно обсуждать программы Антона :-)
Конкретно эта была написана в 2005 году, для внутренних целей...


03-06-2009 05:36
>>> Кстати, вы натолкнули меня на хорошую мысль:
Я с этим долго думал... смысл должен был быть таким: я присваиваю новое значение свойству и начинается анимация переворота. Это отслеживает отдельный поток, который регулярно отправляет сообщение основному окну о перерисовке - как в Таймер, который не подведет - на мой взгляд, это самый разумный способ реализации анимации, остальные можно посмотреть в книге Краснова "Графика в проектах Delphi. OpenGL" (таймер, мультимедийный таймер). При этом программа продолжает работать, пользователь может кликнуть десять карт сразу, чтобы они одновременно переворачивались. Вот до анимации движения из клетки в клетку я не додумался. Рву на себе волосы от горя... Кстати, у меня была не матрица, а просто вызов функции типа PaintCell(Rectangle:TRectangle; Original,Destination:TFigure;Phase:integer); Для каждой клетки я намеревался хранить три вещи: "старая" фигура, "новая" фигура, фаза перехода. Хотел даже вопрос выложить на Круглый стол, если появится сервис, как я предлагал в »сообщение 70«:2383 про свои микроблоги, то я это сделаю, а так выкладывать задумку, когда я хочу "то, не знаю что" считаю нецелесообразным.
>>> Надо получать с заданной периодичностью
Не надо, честное слово! Пусть на моей машине программа дает 1 кадр в секунду, а на соседней - 100, но все двигается с одинаковой скоростью. Грубо говоря, пусть скорость анимации - 20 фаз в секунду, работает поток (почему я к ним неровно дышу), который получил управление... через 200 миллисекунд с последнего вызова... ОПАЧКИ! значит ЭТА фаза должна "прокрутиться" не на 1, на на 200*20/1000=4! Да, анимация будет "дерганой", но главное - чтобы ничего не тормозило. Дергания я как-нибудь преживу... а вот тормоза - никогда. Для меня главным достижением в Windows 7 стало: когда я нажимаю Ctrl-Alt-Del ВСЕ процессы моментально лишаются последних крох последнего времени, которые сразу же забирает Диспетчер задач. Если я сказал - надо, значит надо. Чтобы нить не грузила процессор потребуется сделать WaitForSingleObject, который будет ждать сообщение о появлении нового запроса на анимацию (или Sleep+флаг) с таймаутом 1/самая_быстрая_анимация. То есть в случае 20 фаз в секунду - 1000/20=50 миллисекунд. Все, что свыше из-за непроизводительного процессора приведет к дерганьям.
>>> Только двумерная графика
Интересно, как представляете Вы себе трехмерную доску с клетками? А-а-а, повернутая в изометрию... как Diablo II. Блин, крутая идея. Замутить бы такое...
>>> Потому что дискретность работы Sleep - 10 мс
Но это не мешает указывать ему Sleep(1);
>>> пришлю на почту экзешник, который ограничивает загруженность процессора
Таких программ было в свое время до и больше... у меня даже стояла одна.. не помню сейчас названия. И зачем они нужны по Вашему? Подобные вещи вообще то должны делаться средствами ОС. А эту кривость уже ничем не исправишь. Даже под Vista "зависающий" во время подгрузки уровня Сталкер не возволяет моментально вызвать Диспетчер задач. Только в Windows 7 этот глюк был исправлен.
Дал твои игрушки поиграть своей сотруднице. Сразу же всплыли несколько замечаний по Саперу: поле не ставит знаки вопроса (отметки о "потенциальных" минах) и к тому же - первый клик может привести к подрыву. В стандартном Сапере поле генерируется случайно при первом клике, причем первый клик не может упасть на бомбу.


02-06-2009 12:49
Еще к списку конфликтирующих программ добавлю AIMP2: при запуске любого из примеров и пример, и проигрыватель виснут намертво. По отдельности все работают нормально.


02-06-2009 08:55
У кого проблемы с загрузкой 100%, можете потестить этой прогой
http://slil.ru/27718533


02-06-2009 08:50
Потому что дискретность работы Sleep - 10 мс
Причем тут дискретность вообще? Я же не предлагаю мерять время с помощью Sleep :-))) Я лишь предлагаю ее использовать в потоке для ограничения загруженности процессора. Все равно (!!!) поток будет периодически прерываться на время, большее чем 1мс для осуществления многозадачности. Если хотите - пришлю на почту экзешник, который ограничивает загруженность процессора даже для DirectX игрушек, причем даже под Vista, и не требует админских привилегий.


02-06-2009 08:32
сообщение от автора материала
но почему нельзя использовать вставки Sleep(1)?

Потому что дискретность работы Sleep - 10 мс (а в Win 9x - вообще 55 мс).


02-06-2009 08:26
А если использовать простой измеритель малых интервалов, то для этого надо делать нить, которая будет его постоянно проверять и, следовательно, грузить процессор на 100%
Я не смотрел код, но почему нельзя использовать вставки Sleep(1)? Скорее всего это отмазка, и настоящая причина в том, что Антон не был в курсе каких-то нюансов мультимедийного таймера (как впрочем и я).


02-06-2009 07:43
сообщение от автора материала
Действительно, забыл вложить в архив BitmapBankEditorDlg.dfm :-[

Обновил архив, сейчас он там есть, в папке Units лежит.


02-06-2009 03:57
Delphi 7 при установке компонентов DGameBoard7.dpk не находит файл - File not found: 'BitmapBankEditorDlg.dfm'
его собственно там и нет нигде. Что делать?


01-06-2009 14:54
Спасибо Автору!
Именно этот 2D Delphi Game SDK является образцом "шаблона проектирования".
Именно на материале такого качества должны строится серьезные программы по обучению ООП на Delphi.
Супер!


01-06-2009 12:52
сообщение от автора материала
Мухтар:

Насчет мультимедийного таймера, то можно ведь вполне обойтись real time clock или функцией, показывающей сверхточное время с момента старта системы.

К сожалению, просто точного измерения малых интервалов тут недостаточно. Надо получать с заданной периодичностью уведомления. А если использовать простой измеритель малых интервалов, то для этого надо делать нить, которая будет его постоянно проверять и, следовательно, грузить процессор на 100%. Конечно, ей можно поставить самый низкий приоритет, и тогда она не будет мешать остальным приложениям, но мне такое решение как-то не нравится.

ivak:

а можно ли с помощью вашей библиотеки выводить двумерное поле в трёхмерном виде

Нет, нельзя. Только двумерная графика.

Python:

Долго думал, как бы сделать такое поле, чтобы программист "модели" не заморачивался по поводу того, как "это" сделано в "виде" - просто присвоил значение элементу массива - и все, никаких запаров. Очень надеюсь, что материалы этой статьи помогут мне разработать желаемое.

Простым присваиванием обойтись не удастся. Сначала нужно присвоить состоянию клетки значение -1, чтобы фигура в ней исчезла. Затем создать экземпляр TCellAnimationMovement, который прокрутит нужную последовательность рисунков, дождаться его окончания, и присвоить клетке нужное новое значение.

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


01-06-2009 07:53
Во время разработки своей статьи столкнулся с проблемой, что требуется сделать анимацию клеток (они должны были "переворачиваться" как настоящие карты). Долго думал, как бы сделать такое поле, чтобы программист "модели" не заморачивался по поводу того, как "это" сделано в "виде" - просто присвоил значение элементу массива - и все, никаких запаров. Очень надеюсь, что материалы этой статьи помогут мне разработать желаемое.
PS: пока еще статью прочитать до конца не успел.


31-05-2009 15:35
а можно ли с помощью вашей библиотеки выводить двумерное поле в трёхмерном виде
примерно, как здесь - http://www.doodoo.ru/games/5413-light-bot.html
кстати помогите пройти 10й уровень
 ivak


31-05-2009 13:36
Оформление и фотки нехилые. Сам я не люблю разрабатывать интерфейсы, но люблю пользоваться красивыми программами.

Насчет мультимедийного таймера, то можно ведь вполне обойтись real time clock или функцией, показывающей сверхточное время с момента старта системы.

На сайте много качественных материалов. хорошо оформленных и пригодных к практическому заимствованию кода в свои программы.

Сам прекрасно знаю, насколько нужно иметь силу воли, чтобы творить такое...


31-05-2009 13:11
сообщение от автора материала
Я уже понял, что мультимедийный таймер - штука глючная. Написал в самой статье и повторю здесь - если кто-нибудь сможет предложить ему альтернативу, сравнимую по точности измерения интервала без бесконечного цикла со 100%-ой загрузкой процессора, буду весьма благодарен.


31-05-2009 13:06
Процессор: AMD Athlon XP 1800+ (1.5 Ггц).
Методом тыка установлено: конфликт происходит с двумя приложениями (независимо друг от друга):
1) Opera 9.51
2) QIP 2005 (8092)
когда эти приложения запущены, а игра нет загрузка процессора 0%.
 TAX


31-05-2009 12:49
сообщение от автора материала
@lex:

Мой довольно слабенький по нынешним временам 1.8ГГц Celeron эти игры грузят совсем мало. Если быть точным, Drops грузит процентов на 10, остальные из вашего списка - на 1-2%, т.е. вообще никак.

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

А какой у вас процессор?


31-05-2009 12:36
Такой вопрос: так и задумывалось что игры из примера Sokoban, Drops, Bunch, Bugs грузят процессор на 100% или это это только у меня так?
 TAX


31-05-2009 11:48
сообщение от автора материала
В статье очень много внутренних ссылок, особенно в справочном разделе. Проверить их все просто не было возможности. Так что если кто-то наткнётся на некорректную ссылку - не стесняйтесь, пишите, я исправлю.


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жили у бабуси два веселых гуся. Один белый, другой КАКОЙ?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования