<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF100-101%3A%D0%A1%D1%82%D1%80%D0%B5%D0%BB%D1%8F%D0%BB%D0%BA%D0%B0</id>
		<title>LXF100-101:Стрелялка - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF100-101%3A%D0%A1%D1%82%D1%80%D0%B5%D0%BB%D1%8F%D0%BB%D0%BA%D0%B0"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF100-101:%D0%A1%D1%82%D1%80%D0%B5%D0%BB%D1%8F%D0%BB%D0%BA%D0%B0&amp;action=history"/>
		<updated>2026-05-13T04:20:37Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF100-101:%D0%A1%D1%82%D1%80%D0%B5%D0%BB%D1%8F%D0%BB%D0%BA%D0%B0&amp;diff=6923&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Стрелялка}} == Стрелялка за выходные == : ''ЧАСТЬ 2 Сегодня '''Александр Супрунов''' расскажет о столк...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF100-101:%D0%A1%D1%82%D1%80%D0%B5%D0%BB%D1%8F%D0%BB%D0%BA%D0%B0&amp;diff=6923&amp;oldid=prev"/>
				<updated>2009-02-14T19:01:10Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Стрелялка}} == Стрелялка за выходные == : &amp;#039;&amp;#039;ЧАСТЬ 2 Сегодня &amp;#039;&amp;#039;&amp;#039;Александр Супрунов&amp;#039;&amp;#039;&amp;#039; расскажет о столк...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Стрелялка}}&lt;br /&gt;
== Стрелялка за выходные ==&lt;br /&gt;
: ''ЧАСТЬ 2 Сегодня '''Александр Супрунов''' расскажет о столкновении объектов, анимации, звуке фоновом и нефоновом – в общем, обо всем том, без чего немыслима красивая игра. Время завершать начатое!''&lt;br /&gt;
&lt;br /&gt;
Летел корабль в пустоте. Вдруг – трах, бах!!! Шальной метеорит врезался в борт. Вот это безобразие и называется коллизией. А представьте, если бы ее не было! И метеорит бы&lt;br /&gt;
мимо пролетел, и... Впрочем, и мы бы провалились сквозь землю. И&lt;br /&gt;
если в реальной жизни коллизии (столкновения объектов) происходят&lt;br /&gt;
сплошь и рядом, то и в играх о них нельзя забывать, а значит, потребуется написать хорошую функцию, способную их отследить. Конечно,&lt;br /&gt;
такая функция в нашей библиотеке уже есть – называется она box().&lt;br /&gt;
Вовсе, кстати, не потому, что похожа на одноименный вид спорта (и&lt;br /&gt;
Патрик, хоть он и..., здесь тоже ни при чем), а из-за метода определения столкновения: берется квадрат (бокс) спрайта и проверяется, не&lt;br /&gt;
пересекается ли он с таким же квадратом другого спрайта. Данная процедура называется «проверка по боксу». Еще бывает попиксельная, но&lt;br /&gt;
это уж на крайний случай – слишком много она потребляет ресурсов.&lt;br /&gt;
Синтаксис вызова box() таков:&lt;br /&gt;
&lt;br /&gt;
box(номер первого спрайта, x-координата первого спрайта, y-координата первого спрайта, номер второго спрайта, x-координата второго&lt;br /&gt;
спрайта, y-координата второго спрайта);&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Скорая помощь&lt;br /&gt;
|Содержание=Обратите внимание,&lt;br /&gt;
что вы можете&lt;br /&gt;
выводить на экран&lt;br /&gt;
надписи и цифры с&lt;br /&gt;
помощью функции&lt;br /&gt;
print().&lt;br /&gt;
|Ширина=150px}}&lt;br /&gt;
Функция возвращает 1, если столкновение произошло и 0 – в противном случае. Вот как можно применить ее на практике:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include “ingame.h”&lt;br /&gt;
int main(int n, char **s)&lt;br /&gt;
{&lt;br /&gt;
int asteroid_x=100;&lt;br /&gt;
int asteroid_y=150;&lt;br /&gt;
x=250; y=650;&lt;br /&gt;
screen(500, 700);&lt;br /&gt;
loadsprite(1, “ship.bmp”);&lt;br /&gt;
loadsprite(2, “asteroid.bmp”);&lt;br /&gt;
while (GAME) {&lt;br /&gt;
sprite(1,x,y);&lt;br /&gt;
sprite(2, asteroid_x, asteroid_y);&lt;br /&gt;
if (LEFT){x=x-2;}&lt;br /&gt;
if (RIGHT){x=x+2;}&lt;br /&gt;
if (UP){y=y-2;}&lt;br /&gt;
if (DOWN){y=y+2;}&lt;br /&gt;
if (box (1, x, y, 2, asteroid_x, asteroid_y)) {&lt;br /&gt;
print (“BOOM”,200,300);&lt;br /&gt;
}&lt;br /&gt;
fx();&lt;br /&gt;
}&lt;br /&gt;
return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Изображение:Img 100-101 105 1.png|thumb|(Рис. 1) Ага, долетался!]]&lt;br /&gt;
Здесь мы устанавливаем разрешение 500x700 (как вы, надеюсь,&lt;br /&gt;
помните, вызов screen() должен быть первым в вашей программе),&lt;br /&gt;
загружаем спрайты ship.bmp (корабль) и asteriod.bmp (астероид) в слоты 1 и 2, соответственно, затем, в цикле, отрисовываем их на экране,&lt;br /&gt;
позволяя изменять координаты корабля клавишами управления курсором, и печатаем громкое “BOOM”, если столкновение имеет место.&lt;br /&gt;
Выход из игры, как и раньше, происходит по нажатию Esc. Напомню,&lt;br /&gt;
что переменные x и y – встроенные, определять их заново не нужно.&lt;br /&gt;
Результат работы программы можно видеть на рисунке.&lt;br /&gt;
&lt;br /&gt;
Если вы пытались уклониться от астероида чересчур активно (он,&lt;br /&gt;
конечно, неподвижен, но, как утверждал сперва Галилей, а потом&lt;br /&gt;
Эйнштейн, все относительно), то не могли не заметить, что наша игра&lt;br /&gt;
обладает одним маленьким недостатком – корабль легко исчезает за&lt;br /&gt;
пределы видимости. Так происходит потому, что со временем значения координат x и y становится слишком большими и выходят за рамки отведенных 500 х 700 пикселей. Чтобы исправить ошибку, можно,&lt;br /&gt;
например, добавить сразу после блока инструкций if следующий код:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;if (x&amp;lt;=0){x=0;}&lt;br /&gt;
if (x&amp;gt;=500){x=500;}&lt;br /&gt;
if (y&amp;lt;=0){y=0;}&lt;br /&gt;
if (y&amp;gt;=700){y=700;}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Происки врагов ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Скорая помощь&lt;br /&gt;
|Содержание=Если вам&lt;br /&gt;
понадобится&lt;br /&gt;
вывести на&lt;br /&gt;
экране несколько&lt;br /&gt;
одинаковых&lt;br /&gt;
спрайтов, не&lt;br /&gt;
вздумайте загружать&lt;br /&gt;
их в разные слоты!&lt;br /&gt;
Функция sprite()&lt;br /&gt;
вполне справляется&lt;br /&gt;
с отображением&lt;br /&gt;
одной и той&lt;br /&gt;
же картинки в&lt;br /&gt;
точках с разными&lt;br /&gt;
координатами.&lt;br /&gt;
|Ширина=150px}}&lt;br /&gt;
Инопланетные захватчики – это не мирные астероиды, и у кораблей,&lt;br /&gt;
которые будут нас атаковать, возможны различные траектории движения. Какие именно – зависит от вас. Например, большой бомбардировщик может медленно перемещаться по диагонали экрана, методично&lt;br /&gt;
сбрасывая смертельно опасные, но неповоротливые бомбы, а легкие&lt;br /&gt;
истребители будут выделывать петли. Иными словами, траектории движения удобно связать с типом противника.&lt;br /&gt;
&lt;br /&gt;
Здесь, конечно, не помешает учебник математики, но особо усердствовать не стоит: если в знаменитой Galaga траектории достаточно&lt;br /&gt;
сложны, это еще не значит, что существует прямая зависимость между&lt;br /&gt;
их хитроумностью и увлекательностью игры. Попробуйте, для начала, ограничиться теми элементами, которые будут отвлекать вас на&lt;br /&gt;
дополнительные действия. Например: вы увидели вражеский корабль&lt;br /&gt;
и начинаете палить по нему из всех орудий. Если бы все было так просто, то секунду спустя его обломки уже затерялись бы в безбрежных&lt;br /&gt;
просторах мирового эфира. Но вражеский корабль – крепкий орешек:&lt;br /&gt;
он тоже делает выстрелы, и вам приходится уворачиваться от летящих&lt;br /&gt;
снарядов, а тут еще этот шальной метеор, вынырнувший неизвестно&lt;br /&gt;
откуда – и вот вам Game Over, которого никто не ждал. А сколько я там&lt;br /&gt;
очков набрал? 4100? О, уже больше, чем в прошлый раз. А смогу больше? Собственно, это и называется «увлекательный геймплэй».&lt;br /&gt;
&lt;br /&gt;
Приведем несколько стандартных траекторий движения вражеских&lt;br /&gt;
объектов для игр, подобных нашей.&lt;br /&gt;
&lt;br /&gt;
1 Сверху вниз по прямой:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;sprite(10, evil_x, evil_y);&lt;br /&gt;
evil_y++;&amp;lt;/source&amp;gt;&lt;br /&gt;
2 По диагонали слева направо (или наоборот – замените в последней&lt;br /&gt;
строке знак «плюс» на «минус»).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;sprite(10, evil_x, evil_y);&lt;br /&gt;
evil_y++; evil_x++;&amp;lt;/source&amp;gt;&lt;br /&gt;
Попробуйте также изменять приращения evil_y и evil_x (например:&lt;br /&gt;
evil_y+=3;). Интересной траектории можно добиться, добавив сюда&lt;br /&gt;
фактор случайности (evil_x+=rand() %3;), а также внезапную смену&lt;br /&gt;
направления движения.&lt;br /&gt;
&lt;br /&gt;
3 Движение по кругу. Это более сложный случай, но, в целом, формулы для координат имеют следующий вид: &amp;lt;math&amp;gt;x=r \cos(\alpha)+x_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y=r \sin(\alpha)+y_0&amp;lt;/math&amp;gt;,&lt;br /&gt;
где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; – радиус окружности, &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; – угол в радианах. Для использования&lt;br /&gt;
тригонометрических функций (&amp;lt;math&amp;gt;\cos()&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sin()&amp;lt;/math&amp;gt;) необходимо подключить&lt;br /&gt;
заголовочный файл math.h и задействовать библиотеку libm (добавьте&lt;br /&gt;
-lm к командной строке gcc).&lt;br /&gt;
&lt;br /&gt;
Попробуйте угадать, как будет двигаться объект в этом примере:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;float evil_x=300;&lt;br /&gt;
float evil_y=0;&lt;br /&gt;
float radius=150;&lt;br /&gt;
float a;&lt;br /&gt;
while (GAME) {&lt;br /&gt;
sprite(1, radius*sin(a)+evil_x,radius*cos(a)+evil_y);&lt;br /&gt;
a=a+0.01;&lt;br /&gt;
if (a&amp;gt;=3.14){a=0.;}&lt;br /&gt;
evil_y+=0.5;&lt;br /&gt;
fx();&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Вражеский пилот явно ас: его корабль движется практически случайным образом. Да, поразить такую цель будет непросто... А если вас&lt;br /&gt;
смущает загадочное число 3,14 – то это просто примерное значение&lt;br /&gt;
«пи» или число радиан, соответствующее 180 градусам. Обратите внимание на то, что увеличивать координаты можно не только на 1, 2 и так&lt;br /&gt;
далее, но и на дробные числа – например на 0,5, как в этом примере.&lt;br /&gt;
&lt;br /&gt;
=== Что за штука... велосити? ===&lt;br /&gt;
Велосити (англ. velocity – скорость) – вероятно, один из самых чудесных способов сделать управление более реалистичным. Что мы имеем&lt;br /&gt;
сейчас? Нажимаем клавишу – корабль движется, отпускаем – останавливается. Но в реальном мире тела обладают инерционностью, и, как&lt;br /&gt;
с детства учат нас правила безопасного поведения на дорогах, ни одна&lt;br /&gt;
машина не может затормозить мгновенно. Это тем более верно для&lt;br /&gt;
космического корабля, на который не действуют силы трения, но... мы&lt;br /&gt;
отвлеклись.&lt;br /&gt;
&lt;br /&gt;
Реализовать такое поведение в игре достаточно просто. В момент&lt;br /&gt;
нажатия клавиши в функции изменения координат необходимо увеличить и значение велосити, а при отпускании клавиши – уменьшить его.&lt;br /&gt;
Например, так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;int dir=1;&lt;br /&gt;
if (LEFT){velocity=4.5; dir=1; x-=3;}&lt;br /&gt;
if (RIGHT){velocity=4.5; dir=-1; x+=3;}&lt;br /&gt;
if (velocity&amp;gt;0) {&lt;br /&gt;
velocity-=0.1;&lt;br /&gt;
} else {&lt;br /&gt;
velocity=0;dir=0;&lt;br /&gt;
}&lt;br /&gt;
x=x-velocity*dir;&amp;lt;/source&amp;gt;&lt;br /&gt;
Переменная dir просто задает направление движения: +1 – налево,&lt;br /&gt;
-1 – направо.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание на последнюю строчку – именно она обеспечивает «тормозной путь» после отпускания клавиши, а заодно и&lt;br /&gt;
меняет знак приращения в зависимости от значения dir. Физическая&lt;br /&gt;
модель заключена в блоке if () {...} else {}: если мы не поддерживаем&lt;br /&gt;
нужную скорость, удерживая клавишу нажатой, она (за счет действия&lt;br /&gt;
сил трения, надо думать) постепенно уменьшается. Поскольку трение в космосе не слишком велико, коэффициент затухания можно&lt;br /&gt;
выбрать малым – подберите его опытным путем, чтобы играть было&lt;br /&gt;
интересно.&lt;br /&gt;
&lt;br /&gt;
=== Оживляем персонажей ===&lt;br /&gt;
Анимация – один из ключевых аспектов, на который нужно обратить&lt;br /&gt;
самое пристальное внимание. Конечно, можно создать игру, где будут&lt;br /&gt;
только статические персонажи – но ведь это же несерьезно!&lt;br /&gt;
&lt;br /&gt;
Эффект анимации, как известно, создается последовательным&lt;br /&gt;
отображением незначительно отличающихся друг от друга кадров.&lt;br /&gt;
Таким образом мы можем украсить игру роскошными взрывами. Если&lt;br /&gt;
вы внимательно читали предыдущие номера LXF, то надеюсь, не пропустили руководство по работе с 3D-редактором Blender (см. [[LXF87-88:Blender|LXF87/88-LXF91]]) – здесь он окажет вам неоценимую помощь.&lt;br /&gt;
&lt;br /&gt;
Ниже представлен пример, демонстрирующий основы анимации. В&lt;br /&gt;
данном случае ролик формируется из четырех кадров:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include “ingame.h”&lt;br /&gt;
int main(int n, char **s) {&lt;br /&gt;
screen(640,480);&lt;br /&gt;
loadsprite (10,”01.png”);&lt;br /&gt;
loadsprite (11,”02.png”);&lt;br /&gt;
loadsprite (12,”03.png”);&lt;br /&gt;
loadsprite (13,”04.png”);&lt;br /&gt;
int i=10;&lt;br /&gt;
while (GAME){&lt;br /&gt;
sprite(i, 200 , 200);&lt;br /&gt;
i++;&lt;br /&gt;
if (i==14){i=10;}&lt;br /&gt;
fx();&lt;br /&gt;
}&lt;br /&gt;
return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Кадры занимают слоты с 10 по 13. Эффект достигается циклической сменой номера текущего спрайта, хранящегося в переменной i. Но&lt;br /&gt;
попробуйте запустить пример – и вы увидите одну неприятную деталь:&lt;br /&gt;
кадры сменяют друг друга слишком быстро. Избавиться от нее можно&lt;br /&gt;
одним способом – введя искусственную задержку. В простейшем случае это достигается так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;int anim=10;&lt;br /&gt;
int c=0;&lt;br /&gt;
while (GAME){&lt;br /&gt;
c++;&lt;br /&gt;
if (c==20){anim++; c=0;}&lt;br /&gt;
if (anim==14){anim=10;}&lt;br /&gt;
sprite(anim, 200 , 200);&lt;br /&gt;
fx();&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь номер текущего спрайта хранится в anim, а c – это счетчик для замедления. Кадр не меняется до тех пор, пока c не достигнет определенного значения – в нашем примере, 20. Изменяя данный&lt;br /&gt;
порог, можно управлять скоростью анимации, но она будет аппаратнозависимой: при переходе на более мощный компьютер «человечки на&lt;br /&gt;
экране начнут смешно махать руками» (если вы когда-либо играли в&lt;br /&gt;
Диггера на 80386DX-2, вы меня поймете). Более правильным способом&lt;br /&gt;
будет привязать задержку к абсолютному интервалу времени – скажем,&lt;br /&gt;
менять кадр каждую 1/24 секунды. Этого можно добиться с помощью&lt;br /&gt;
функции SDL_GetTicks(), возвращающей число миллисекунд, прошедших с момента инициализации библиотеки, и я оставляю данный вопрос вам на самостоятельное изучение.&lt;br /&gt;
&lt;br /&gt;
=== Трели летнего утра ===&lt;br /&gt;
До сих пор наш игровой процесс протекал на равномерно закрашенном черном фоне. Для космической стрелялки это, может, и не плохо,&lt;br /&gt;
но для большинства других игр не подходит. Поэтому в файле ingame.&lt;br /&gt;
h определена функция colorfon(), принимающая три параметра: значения красной (R), зеленой (G) и синей (B) составляющей цвета фона.&lt;br /&gt;
Подсмотреть значения RGB для интересующего вас цвета можно в&lt;br /&gt;
палитре любого графического редактора, будь то KPaint или GIMP.&lt;br /&gt;
&lt;br /&gt;
Если в качестве фонового рисунка разместить полупрозрачный&lt;br /&gt;
спрайт, совпадающий по размерам с окном игры, то, динамически&lt;br /&gt;
меняя цвет фона, можно добиться интересных эффектов: вечерней&lt;br /&gt;
зари или рассвета. Главное здесь – ваша фантазия. Видели голубую&lt;br /&gt;
пыль в космическом облаке в StarFighter на LXFDVD? Она получается&lt;br /&gt;
именно так.&lt;br /&gt;
&lt;br /&gt;
Не меньшее значение, чем красивый фон, имеет и звуковое оформление. Для этих целей предусмотрена функция loadsound(имя_файла,&lt;br /&gt;
номер_слота), загружающая любой звук в формате wav в один из 500&lt;br /&gt;
доступных слотов. Воспроизвести звук можно функцией sound(), принимающей единственный аргумент – номер слота. Давайте добавим к&lt;br /&gt;
игре рев идущих на форсаж моторов и грохот выстрелов (кстати, а вы&lt;br /&gt;
знали, что в безвоздушном пространстве звук не передается? Да? Ну&lt;br /&gt;
тогда считайте все это «литературным приемом»).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include “ingame.h”&lt;br /&gt;
int main(int n, char **s)&lt;br /&gt;
{&lt;br /&gt;
screen(1024, 768);&lt;br /&gt;
loadsound(“boom.wav”,15)&lt;br /&gt;
while (GAME) {&lt;br /&gt;
if (LEFT) {sound(15);}&lt;br /&gt;
fx();&lt;br /&gt;
}&lt;br /&gt;
return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Подобным образом вы можете озвучить все действия в игре. А как&lt;br /&gt;
же обстоит дело с фоновой музыкой? И на этом фронте у нас все в&lt;br /&gt;
порядке. Функция loadmusic(название_файла, номер_слота) загружает&lt;br /&gt;
мелодию в память. Поддерживаются форматы mid, mod, xm, it, s3m,&lt;br /&gt;
wav и другие. Функция music(номер_слота) воспроизводит загруженную ранее мелодию, но имейте в виду – вызывать ее необходимо вне&lt;br /&gt;
главного цикла, примерно так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;#include “ingame.h”&lt;br /&gt;
int main(int n, char **s)&lt;br /&gt;
{&lt;br /&gt;
screen(1024, 768);&lt;br /&gt;
loadmusic(“level1.mod”,1)&lt;br /&gt;
music(1);&lt;br /&gt;
while (GAME) {&lt;br /&gt;
fx();&lt;br /&gt;
}&lt;br /&gt;
return 0;&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Все вместе ===&lt;br /&gt;
Вот мы и подошли к тому моменту, когда осталось только одно – сесть&lt;br /&gt;
и написать игру. Никакие отговорки, как вы понимаете, теперь не помогут. В ваших силах создать программу с отличным звуком и графикой.&lt;br /&gt;
Файл ingame.h, который мы использовали во всех наших примерах,&lt;br /&gt;
был написана автором специально для статей этой серии и распространяется на условиях GPLv2. Все входящие в него функции ([[LXF98:Стрелялка|LXF98]])&lt;br /&gt;
абсолютно прозрачны и доступны для редактирования и изменения.&lt;br /&gt;
&lt;br /&gt;
В ingame.h не предусмотрена обработка ошибок. Это сделано по&lt;br /&gt;
следующим причинам: во-первых, дополнительные проверки сделали бы код более громоздким и менее понятным, что для обучающего материала неприемлемо. На мой взгляд, проще потом внести пару&lt;br /&gt;
собственных строчек. Во-вторых, игровая программа не сможет быть&lt;br /&gt;
запущена, если какие-либо файлы, входящие в комплект, повреждены&lt;br /&gt;
или отсутствуют. Но, положив руку на сердце, скажите, действительно&lt;br /&gt;
ли вы хотите, чтобы кто-то запустил вашу игру с поврежденной или&lt;br /&gt;
недостающей графикой?&lt;br /&gt;
&lt;br /&gt;
Я также могу предположить, что у особенно заинтересовавшегося&lt;br /&gt;
читателя возникнет желание разобрать файл ingame.h на кусочки, дабы&lt;br /&gt;
понять, как же все устроено. Тогда вам придется углубиться в таинства&lt;br /&gt;
библиотеки SDL – а это настолько же большая тема, насколько коротка&lt;br /&gt;
наша серия. И сейчас, думаю, пришло время подумать о создании игр&lt;br /&gt;
и других вещах: о башмаках и сургуче, капусте, королях, и почему, как&lt;br /&gt;
суп в котле, кипит вода в морях. Да, не забывайте присылать ссылки&lt;br /&gt;
на сделанные вами игры на letters@linuxformat.ru – возможно, мы даже&lt;br /&gt;
разместим наиболее удачные экземпляры на одном из LXFDVD!&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>