DiNGS – программирование игр в домашних условиях. Часть 14
АрхивПрограммазм (архив)Устранение ошибок в игре. Отладка.
Даже гениальные программисты совершают ошибки. Благодаря DiNGS программист избавлен от необходимости ломать голову, почему некий фрагмент кода не освободил после себя память, а компьютер намертво виснет. Создавая на DiNGS мы программируем именно игру, а не ненужные технические детали. Всем известна Майкрософтовская библиотека для разработки игр – DirectX. Она искусно скрывает детали программирования, но все же она достаточно (и часто неоправданно) сложна. Программируя на DirectX вы можете допустить множество ошибок – на DiNGS только связанные с логикой игры! Можно рассматривать DiNGS, как более удобную надстройку над DirectX (что является правдой). Ведь и неказистому DOS вы предпочитаете более понятный интуитивно Windows. Т.к. мы, используя DiNGS, к счастью избавлены от множества ошибок технического характера (не освобождение памяти, вывод не на те сурфейсы и т.д.), то поговорим о логических ошибках и их нахождении.
Программируя игру Ping Pong GOLD я часто сталкивался с ситуациями, когда после введения нового алгоритма игра должна была действовать сообразно с моим замыслом, но в реальности все выходило иначе. Например, при столкновении летающего черепа с мячом отбитым игроком должен был вылетать приз создаваемый случайным образом и лететь в сторону игрока. При подборе игроком приз производил некие действия и срикошетив исчезал плавно растворяясь. В реальности приз вылетал, доходил до биты игрока и благополучно продолжал путь сквозь нее. Было ясно, что в код вкралась ошибка, но какая и как это выяснить? В игре для данной ситуации использовались несколько переменных: priz – могла быть 1 или 0, сообщала, есть ли на экране в данный момент приз. collision_priz – могла быть 1 или 0, сообщала, есть ли столкновение биты и приза.
ident – показывала, что за приз отобразить на экране, была числом от 1 до 12. Например: 1 – приз Iceball, 2 – приз Armor, 3 – приз Energy UP и т.д. Все мои действия свелись к добавлению в код лишь нескольких строчек для отладки:
PRINT “сollision priz = “+collision_priz, 100,100 PRINT “ident for priz = “+ident, 100,130 PRINT “priz = “+ priz, 100,160
Запустив игру, я смог наблюдать за значениями переменных. На экране горели надписи:
collision priz = 0 ident for priz = 0 priz = 0
Череп столкнулся с мячом и тут же я увидел:
collision priz = 0 ident for priz = 3 priz = 1
На экране из черепа выскочил приз Energy UP, как и было задумано. Переменная collision_priz оставалась равной 0, т.к. пока никакого столкновения биты и приза не произошло. Приз столкнулся с битой, но collision_priz остался равным 0. Очевидно, что ошибка в участке кода обрабатывающего столкновение и присваивающего значения переменной collision_priz. Переместившись на данный участок кода (нажатие Ctrl+F вызывает меню поиска, куда вводим название интересующей переменной collision_priz и нажимаем Enter) я увидел, что перепутал в обработчике столкновений название переменной и вместо присвоения 1 переменной collision_priz , он присваивал это значение мифической переменной Сollision_priz.
Да, DiNGS хоть и имеет синтаксис BASIC – на самом деле чистый С, где названия набранные с разным регистром различны (т.е. priz, Priz и pRiZ – три совершенно разные переменные). К подобному приему отладки приходится прибегать достаточно часто. И даже не из-за того, что была ошибка. Иногда просто требуется удостоверится, что все действительно так как надо. Например, генератор случайных чисел присваивает переменной generator случайное число, после некоторой обработки это значение присваивается переменной ident. Но действительно ли все так, как кажется, уж слишком часто выпадает приз Energy UP.
Выводим на экран 2 переменные:
PRINT generator, 200,100 PRINT ident, 200,130
И… Видим, как все время выпадает одно и тоже значение у ident, хотя в генераторе действительно разные числа.
По Ctrl+F вводим поиск переменной ident и видим неожиданно, что у нас есть 2 такие переменные, одна из которых все время присваивает себе двойку. Как вы поступите дальше, переименуете переменную или примените другие действия, целиком зависит от вас – главное проблема обнаружена.
Программируя плавное движение биты я хотел просто убедится в работе данного алгоритма, т.к. алгоритм, применявшийся для этих целей ранее был тоже достаточно хорош и визуально не отличим. Отличия сказались, когда я ввел призы SpeedUP для увеличения скорости биты и SpeedDown для уменьшения. Я вывел на экран интересующую меня переменную velocity и увидел, что значения действительно меняются, т.е. все работает замечательно. Подробнее об этом алгоритме смотрите в части 18.
Надеюсь теперь, если и возникали у вас проблемы в игре, вы их успешно сможете исправить.
(Продолжение следует)