Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Вы достигли битвы с финальным боссом. Уровень 10. Финальный шаг в нашем грандиозном приключении - это отполировать нашу игру. Чтобы развить её из технического демо в реальную, законченную, играбельную игру, которая имеет начало, середину и конец.
Orion45
30.06.14 в 18:03
|
|
Финальные шаги в жизненном цикле разработки нашей игры могут занять большую часть времени и усилий. Хорошие новости это то, что вы уже вооружены всеми навыками, которые требуются чтобы выполнить это. Мы не должны учить ничего радикально нового: с этого момента, главный вызов это совершение, чтобы качество и время, которое это заняло, закончили работу.
Orion45
01.07.14 в 01:37
|
|
Полировка - это трудоёмкая работа. Ничего из этого в отдельности не сложно, но это всё складывается. Поэтому не ожидайте, что этот финальный рывок в проекте будет лёгким: это займёт больше времнеи чем выожидаете. Почему? Полировка и проверка качества это то, где истинная душа игры принимает форму. Это то, где вы разрабатываете уровни, битвы с боссами, меню и подправляете игровую механику.
Orion45
02.07.14 в 03:15
|
|
Вы могли бы решать разогнать движение игрока или попросить друзей сыграть в образец уровня и реагировать на их отзывы. Вы можете захотеть создать больше контента или пересмотреть старый контент. Вы можете потратить недели на полировку, добавление новых артов, подправляя систему частиц, добавляя больше эффектов и сочиняя музыку. Этот процесс может продолжаться вечно, так что это хорошая идея позволить себе обрезать характеристики также часто как вы добаляете новые.
Orion45
02.07.14 в 03:23
|
|
В этой финальной главе вы закончим пример аркадной стрелялки "ад пуль", которую мы разрабатываем. Так как есть много работы, которая могла бы быть сделана в области артов или в программировании игры, которые очень базовые и необязательно связаны со Stage3D, мы приукрасим несколько разделов вместо того, чтобы перечислять всё. Вы близки к тому, чтобы продолжить приключение по своему усмотрению.
Orion45
02.07.14 в 03:36
|
|
Наш финальный квест. Для того, чтобы закончить игру, требуется несколько базовых механизмов. Мы хотим своего рода заглавный экран, например, с логотипом и стартовой кнопкой. Мы также хотим способность разрушать все виды врагов. Наши игроки также должны быть способны наносить урон кораблю игрока и, после достаточного урона, мы хотим чтобы отображался экран "ИГРА ОКОНЧЕНА".
Orion45
02.07.14 в 03:44
|
|
В доплнение к в началу (заглавный экран) и к концу (конец игры) мы хотим, чтобы там был игро, стоящий игры: полностью проработанный уровень. Поэтому вместе с базовыми элементами геймплея и GUI экранами мы должны разработать огромный уровень, заполненный врагами. Наконец, небольшие штрихи должны быть добавлены повсюду. Мы обсудим некоторые простые техники для улучшения производительности игры и способы добавить небольшие дополнения, которые нужны, чтобы заполнить её действиями.
Orion45
02.07.14 в 03:58
|
|
Вот как будет выглядеть наш финальный образец игры: Если вы не хотите печатать код и предпочли бы просто следовать вместе с текущими обсуждениями после скачивания полного исходного кода финальной игры, вы можете получить его по следующему URL: http://www.packtpub.com/adobe-flash11-stage3d-molehill-gameprogramming-beginners-guide/book Вы можете сыграть в игру здесь: http://www.mcfunkypants.com/molehill/chapter_10_demo/
Orion45
02.07.14 в 04:08
|
|
Добираемся до последней черты. Это фаза в о многих проектах, которая, кажется, может занять вечность. Хорошие новости то, что этот последний квест в нашем приключении может также быть и самым весёлым! Учитывая, что программирование ядра движка, наконец, позади, мы свободны позволиь разыграться нашему изображению. Эксперементировать с новыми игровыми режимами, фантастическим новым оружием, писанием диалогов, планов и персонажей, плюс создание всех видов прекрасных артов.
Orion45
02.07.14 в 05:10
|
|
Эта фаза, на которой вы захотите начатьь показывать игру вашим друзьям. Игровое тестирование это ключ к созанию великолепной игры. Не делайте безумные штрихи на последней черте и не ожидайте того, что ваше создание будет большим хитом пока вы не потратите потом какое-то время, чтобы заставить людей протестировать игру, получите отзывы, найдёте ошибки, что даст вам свежее представление или идеи для новых характеристик.
Orion45
02.07.14 в 05:31
|
|
Для целей примера shoot-em-up игры "ад пуль" с космическими кораблями, которая является проектом примера использованном в курсе этой книги, первое в повесте дня это создать больше артов. Спроектируйте больше крутых кораблей, эффектов частиц, астероидов, космисеских станций и декораций, чтобы конкретизировать вашу игру. Используйте класс GameLevelParser, созданный в главе 9, чтобы реализовать сложный уровень, заполненный врагами и взрывающимися предметами.
Orion45
02.07.14 в 05:43
|
|
Так как мы уже показывали как добавить новые модели в нашу игру, вместо объяснений, что в точности было сделано в приемере игры, использкуйте ваше воображение. На этом этапе вы можете посходить с ума и создать все виды интересных моделей и текстур. Вам больше не нужны пошаговые инструкции о том, как поместить их в вашу игру.
Orion45
02.07.14 в 05:51
|
|
Отдельно от активов новых артов, полировка нашей стрелялки должна быть относительно просты процессом. Есть несколько характеристик, удобных в играх, которые мы должны добавить. Некоторые из финальных кусков полировки и геймплея, которые нам нужно реализовать, включают: Реализацию заглавного экрана Обновление движения игрока и удерживание игрока в пределах границ. Обновление нашего GUI Встраивание наших новых арт-активов. Обновление нашего кода инициализации. Определение новых типов действующих лиц и поведения. Создание игрового уровня. Улучшение цикла рендеринга. Реализация игровых событий (начало, конец, урон). Обновление управления игрока. Обновление функции пошаговой симуляции. Публикация... распостранение... выгода!
Orion45
02.07.14 в 06:01
|
|
Как только игровой движок "сделан", финальный шаг вполне мог бы занять месяцы, если вы решили добавить сотни уровней и глубокий сюжет! Для целей этого гайда примера игры для начинающих, мы сохраним её простой.Мы сфокусируемся на улучшении движка и запуске, но давайте предположим, что игра, которую мы делаем, не богата чертами, как будет ваш оригинальный шедевр.
Orion45
02.07.14 в 07:06
|
|
Выстовить вашу игру на волю публики, конечно, очень вероятно будет самой большой работой. Тут полно неосязаемых шагов "проверки качества", которые могут продолжаться некоторое время пока вы не будете полностью удовлетворены вашей игрой. Маркетинг, работа с социальными сетями и монетизация остаётся как упражение для читателя.
Orion45
02.07.14 в 07:14
|
|
По этой причине, этот самый последний финальный шаг полировки будет украшен в то время как основа проекта, повторно используемый Flash 11 3D игровой движок будет нашей главной целью. Имея это виду, давайте погрузимся!
Orion45
02.07.14 в 07:19
|
|
Время для действий - рисуем заглавный экран. Для того, чтобы заставить заглавный экран работать в нашей игре, всё, что нам нужно сделать, это разработать привлекательное изображение используя Photoshop или любой другой редактор изображений. Во многом также как в предыдущих главах где мы создали внутриигровой HUD(наложенное изображение heads-up-display), который был сохранен как ббольшой прозрачный .PNG файл, сделайт е то же самое дляя заглавного экрана. Например:
Orion45
02.07.14 в 07:33
|
|
Когда ваше полноразмерное изображение готово к наложению в самом начале, просто встройте его в ваш SWF тем же способом, как вы встраивали другие графические активы - либо через flex тег [embed], используя палитру библиотеки Flash .
Orion45
02.07.14 в 07:37
|
|
Как только мы добавим заглавный экран на сцену в нашу функцию initGUI, он будет отображаться когда игра начинается. Единственная проблема сейчас то, что он остаётся видимым во время геймплея, который сам начинается немедленно после загрузки игры. Что нам действительно нужно, так это отследживать "состояние" игры и ставить её на паузу пока игрок не готов начать.
Orion45
02.07.14 в 07:43
|
|
Время для действий - импортируем требуемые классы. Для остатка этой главы все листинги кода есть для Stage3dGame.as, главного файла в нашем проекте. Начнём с того, что сделаем несколько изменений в врехней части файла, чтобы посчитать классы, которые мы создали в предыдущей главе плюс некоторую дополнительную функциональность Flash, которую мы собираемся использовать. package { [SWF(width="640", height="480", frameRate="60", backgroundColor="#FFFFFF")] import com.adobe.utils.*; import flash.events.*; import flash.geom.*; import flash.utils.*; import flash.text.*; import flash.filters.GlowFilter; import flash.media.Sound; import flash.media.SoundChannel; import flash.system.System; import flash.system.Capabilities; import flash.system.ApplicationDomain; import flash.display.*; import flash.display3D.*; import flash.display3D.textures.*; import flash.net.*; import GameActor; import GameActorpool; import GameInput; import GameLevelParser; import GameParticlesystem; import GameTimer; import Stage3dEntity; import Stage3dParticle;
Orion45
02.07.14 в 07:52
|
|
Что же произошло? Предыдущий код просто импортирует функциональность, которая нужна для нашего игрового движка - есть просто несколько новых строк, чтобы добавить фантастические текстовые эффекты, также как наши недавно реализованные классы. Теперь обновите переменные вашего класса, чтобы учесть наш заглавный экран, textFields и прочее.
Orion45
02.07.14 в 07:56
|
|
Добавляем новые переменные в нашу игру. Несколько следующих резделов включают добавление многочисленных переменных требующихся для финальной функциональности в нашей игре.
Orion45
02.07.14 в 07:58
|
|
Время для действий - отслеживаем состояние игры. Мы добавим массу новых переменных в нашу игру в следующем разделе "врмя для действий". Чтобы начать, мы реализуем возможность отслеживать состояние игры, таким образом мы сможем иметь заглавный экран , который отображется когда ещё не началась. Отредактируйте свойства нашего класса Stage3dGame следующим образом. public class Stage3dGame extends Sprite { private const VERSION_STRING:String = "Version: 1.10"; //текущее состояние игры (0 = заглавный экран) private const STATE_TITLESCREEN:int = 0; private const STATE_PLAYING:int = 1; private var gameState:int = STATE_TITLESCREEN; private var titlescreenTf:TextField;
Orion45
02.07.14 в 08:23
|
|
Что же произошло? Нам нужно определить переменные "состояния" для нашего игрового движка, который помнит в каком режиме игра. Возможно мы можем установить это таким образмо, что ноль означает, что игра находится на заглавном экране и ждёт, когда пользователь кликнет, чтобы играть. В вашей игре вы можете захотеть включить другие состояния, как такое, которое используется между уровнями или режим битвы с боссом или кинематографические события, такие как ролик. В нашем примере игры мы используем только два состояния: одно для момента, когда мы находимся на заглавном экране, и другое для момента когда игра идёт.
Orion45
02.07.14 в 08:39
|
|
Время для действий - добавляем переменные для событий основанных на таймере. Продолжим добавлять в наш игровой класс. Мы будем запускать различные события и отслеживать время и нам нужны переменные, чтобы сохранять все эти метки и сам таймер. //отслеживаем время прошедешее в игре private var gametimer:GameTimer; //используеся с таймерами чтобы события private var introOverlayEndTime:int = 0; private var nextShootTime:uint = 0; private var shootDelay:uint = 200; private var invulnerabilityTimeLeft:int = 0; private var invulnerabilityMsWhenHit:int = 3000; private var screenShakes:int = 0; private var screenShakeCameraAngle:Number = 0;
Orion45
02.07.14 в 08:48
|
|
Что же произошло? Мы собираемся запустить связанные со временем игровые события, такие как контроль как чсто вы можете стрелять, тряска экрана когда вы подбиты, делание игрока неуязвимы на какой-то период времени, после получения урона и простой "вводный кинематограф" где первые несколько секунд игры меняется угол камеры . Эти переменные будут использованы, чтобы сохранить метки для отслеживания когда что-то должно быть запущено.
Orion45
02.07.14 в 09:09
|
|
Когда пользователь нажимет кнопку стрельбы (пробел и т.д.) мы хотим стрелять пулями вперёд. Мы не хотим, однако, чтобы пули генерировались каждый отдельный кадр, а, вместо этого, после особого счётчика времени. Время стрельбы и переменные задержки в предыдущем когде учтены для этого.
Orion45
02.07.14 в 09:14
|
|
Когда мы получаем урон от врага , распостранённый игровой обычай то, что игрок не может быть подбит небольшой промежуток времени пока они возвращают себе контроль и двигается прочь независимо от того, какая угроза только что ранила их. Маленькое окно веремени где игрок неуязвим звучит как интересная игровая механика.
Orion45
02.07.14 в 09:21
|
|
Время для действий - добавляем переменные, связанные с движением. //обработчики ввода клавиатуры и мыши private var gameinput:GameInput; //хорошо скрытая преследующая камера private var chaseCameraXangle:Number = -5; private var chaseCameraDistance:Number = 4;
Orion45
02.07.14 в 09:24
|
|
private var chaseCameraHeight:Number = 2; // как быстро мы движемся в единицах в мс. private var flySpeed:Number = 1; //как быстро мы движемся вверх/вниз/влево/вправо мс. private var moveSpeed:Number = 0.02; // медленная орбита астеройдов в градусах в мс. private var asteroidRotationSpeed:Number = 0.002; // заставляем корабль оставаться в пределах границ (0 = нет ограничений) private var playerMaxx:Number = 32; private var playerMaxy:Number = 32; private var playerMaxz:Number = 0; private var playerMinx:Number = -32; private var playerMiny:Number = 0.1; private var playerMinz:Number = 0; private var levelCompletePlayerMinz:Boolean = true;
Orion45
02.07.14 в 09:27
|
|
Что же произошло? Предыдущие переменные используются, чтобы хранить клас игрового ввода и влиять на движения корабля игрока. Скорости и позиции максимума и минимума помогают держать игрока вблизи действия и двигаться достаточно быстро, чтобы быть взволнованным.
Orion45
02.07.14 в 09:51
|
|
В этой игре мы хотим, чтобы корабль продолжал двигаться вперёд всё время, так что клавиши стрелок могут быть использованы, чтобы уклоняться от пуль и врагов. Поэтому скорость, с которой мы летим вперёд, также как скорость уклонений клавишами стрелок должны быть определены.
Orion45
02.07.14 в 09:54
|
|
Кроме того, мы не хотим, чтобы игрок зажимал клавиедленно оставлял целый уровень позади, так что мы должны ограничить движение игрока областью, которая заставляет их оставаться вблизи действия. Максимальные и минимальные позиции координат сделают этот трюк. Если уровень завершён Булево значение в предыдущем коде является true, игра "завершается" когда линия финиша была достигнута. Это позиция будет определена размером нашего уровня.
Orion45
02.07.14 в 10:19
|
|
Время для действий - отслеживаем все сущности. Нам нужно отслеживать несколько бассейнов действующих лиц и систем частиц вместе с отдельными игровыми сущностями, которые используются во время игры. //все известные сущности в мире private var chaseCamera:Stage3dEntity private var props:Vector.<Stage3dEntity>; private var player:GameActor; private var enemies:GameActorpool;
Orion45
02.07.14 в 10:24
|
|
private var playerBullets:GameActorpool; private var enemyBullets:GameActorpool; private var explo:Stage3dParticle; private var particleSystem:GameParticlesystem; // мы хотим запонить это для использования в gameStep() private var asteroids1:Stage3dEntity; private var asteroids2:Stage3dEntity; private var asteroids3:Stage3dEntity; private var asteroids4:Stage3dEntity; private var engineGlow:Stage3dEntity; private var sky:Stage3dEntity; // повторно используемая общая сущность (для скорости и избегания GC) private var entity:Stage3dEntity; private var actor:GameActor;
Orion45
02.07.14 в 10:26
|
|
Что же произошло? Списки сущностей в предыдущем коде были модифицированы для использования нашей богатой характеристиками системой бассйна действующих лиц, где это подходит. С этого момента вы хотим отслеживать пули и врагов в бассейне действующих лиц, так что они могут быть анимированы на столкновения.
Orion45
02.07.14 в 10:31
|
|
Время для действий - обновляем HUD. Теперь текстовые элементы GUI , определённые вместе с переменными, используются, чтобы отслеживать значения, которые будут отображаться на экране во время игры как часть HUD. //используется GUI private var fpsLast:uint = getTimer(); private var fpsTicks:uint = 0; private var fpsTf:TextField; private var gpuTf:TextField; private var scoreTf:TextField; private var healthTf:TextField; private var score:uint = 0; private var combo:uint = 0; private var comboBest:uint = 0; private var scenePolycount:uint = 0; // используется для отображения полосы здоровья private var healthText_0:String = ''; private var healthText_1:String = '| | | | |'; private var healthText_2:String = '| | | | | | | | | | |'; private var healthText_3:String = '| | | | | | | | | | | | | | | | | |';
Orion45
02.07.14 в 10:35
|
|
Что же произшло? Интересен "измритель здоровья", который, в примере игры, просто устанавливает светящиееся линии, которые отражают сколько урона было нам нанесено. Кроме того, интересная игровая механика, которая может добавить глубины многим шутерам, это счётчик "комбо". Этот счётчик комбо отслеживает как много врагов было успешно подбито. Игроки с истинным мастерством могут попытаться спамить пулями везде для того, чтобы достичь впечатляющего счётчика комбо.
Orion45
03.07.14 в 10:05
|
|
Время для действий - определляем переменные, используемые Stage3D. Мы будем использовать следующие переменные, которые относятся к Stage3D: //графическое 3d окно на сцене private var context3D:Context3D; // скомпилированный шейдер, использующийся для рендеринга наших мешей private var shaderProgram1:Program3D; // простой шейдер с одним статическим светом private var shaderWithLight:Program3D; // матрицы, которые воздействуют на положение мешей и угол камеры private var projectionmatrix:PerspectiveMatrix3D = new PerspectiveMatrix3D(); private var viewmatrix:Matrix3D = new Matrix3D();
Orion45
03.07.14 в 10:10
|
|
Что же произошло? Предыдущие переменные похожи на те, что использовались в большинстве предыдущих демо в других главах, чтобы отслеживать Context3D, углы камеры и шейдеры. Есть один новый шейдер, который мы реализуем - он относится к свету. Добавляем арты в нашу игру. Следующие несколкьо разделов будут включать встраивание всех арт-активов требующихся в коде для нашей игры.
Orion45
03.07.14 в 10:21
|
|
Время для действий - встраивание новых арт-активов (AS3 версия). Нам нужно встроить все изображения и MP3-файлы, требующихся, чтобы привнести привлекательный вид и звук. Если вы используете Adobe Flash IDE, тогда пропустите этот раздел, так как это применимо только если вы используете FlashDevelop, FlashBuilder, FDT, Flex, haXe и т.д. [Embed (source = "art/player.jpg")] private var playerTextureBitmap:Class;
Orion45
03.07.14 в 10:26
|
|
private var playerTextureData:Bitmap = new playerTextureBitmap(); [Embed (source = "art/terrain_texture.jpg")] private var terrainTextureBitmap:Class; private var terrainTextureData:Bitmap = new terrainTextureBitmap(); [Embed (source = "art/craters.jpg")] private var cratersTextureBitmap:Class; private var cratersTextureData:Bitmap = new cratersTextureBitmap(); [Embed (source = "art/sky.jpg")] private var skyTextureBitmap:Class; private var skyTextureData:Bitmap = new skyTextureBitmap(); [Embed (source = "art/engine.jpg")] private var puffTextureBitmap:Class; private var puffTextureData:Bitmap = new puffTextureBitmap(); [Embed (source = "art/particle1.jpg")] private var particle1data:Class; private var particle1bitmap:Bitmap = new particle1data(); [Embed (source = "art/particle2.jpg")] private var particle2data:Class; private var particle2bitmap:Bitmap = new particle2data(); [Embed (source = "art/particle3.jpg")] private var particle3data:Class; private var particle3bitmap:Bitmap = new particle3data(); [Embed (source = "art/particle4.jpg")] private var particle4data:Class; private var particle4bitmap:Bitmap = new particle4data(); Теперь, когда мы встроили несколкьо новых текстур для использования на врагах и других структурах, таких как космические станции, они появятся в игре. [Embed (source = "art/badguys.jpg")] private var badguyTextureData:Class; private var badguyTextureBitmap:Bitmap = new badguyTextureData(); [Embed (source = "art/hulltech.jpg")] private var techTextureData:Class; private var techTextureBitmap:Bitmap = new techTextureData(); Дополнительные битмапы нужны для GUI: заглавный экран, внутриигровой верхний слой и небольшой вводный экран, где мы инструктируем игрока, что является его "миссией" [Embed (source = "art/title_screen.png")] private var titleScreenData:Class; private var titleScreen:Bitmap = new titleScreenData(); [Embed (source = "art/hud_overlay.png")] private var hudOverlayData:Class; private var hudOverlay:Bitmap = new hudOverlayData();
Orion45
03.07.14 в 10:32
|
|
[Embed (source = "art/intro.png")] private var introOverlayData:Class; private var introOverlay:Bitmap = new introOverlayData(); Теперь, когда мы имеем класс парсинга карты уровней, мы можем встроить ключевое изображение (определяя какие цвета представляют какой тип игровой сущности) и изображение карты (чертёж для нашего игрового мира). [Embed(source = 'art/level_key.gif')] private static const LEVELKEYDATA:Class; private var levelKey:Bitmap = new LEVELKEYDATA(); [Embed(source = 'art/level_00.gif')] private static const LEVELDATA:Class; private var levelData:Bitmap = new LEVELDATA(); Это шрифт, который используется GUI. Мы определяем наборы персонажей, которые нам нужно сделать. в .SWF меньше. [Embed (source = 'art/gui_font.ttf', embedAsCFF = 'false', fontFamily = 'guiFont', mimeType = 'application/x-font-truetype', unicodeRange='U+0020-U+002F, U+0030-U+0039, U+003A-U+0040, U+0041-U+005A, U+005B-U+0060, U+0061-U+007A, U+007B-U+007E')] private const GUI_FONT:Class; Наконец, мы встраиваем звуки и музыку, следующим образом: [Embed (source = "art/sfxmusic.mp3")] public var introMp3:Class; [Embed (source = "art/sfxblast.mp3")] public var blastMp3:Class; [Embed (source = "art/sfxexplode.mp3")] public var explodeMp3:Class; [Embed (source = "art/sfxgun.mp3")] public var gunMp3:Class;
Orion45
03.07.14 в 10:39
|
|
Что же произошло? Работа с артами, требуемая нашим GUI и внутриигровыми текстурами, встроена в точности тем же способом как предыдущих главах. LEVELDATA и LEVELKEYDATA арт-активы, которые требуются нашей игре - чертёжные карты уровня. В предыдущей главе мы написали простой класс GameLevelParser, который берёт крошечное ключевое изображение, чтобы просмотреть RGB значения, плюс изображение "карты" данных уровня, по которой вы нарисовали настоящий уровень.
Orion45
03.07.14 в 10:47
|
|
Вместо использования шрифта textField по умолчанию (который в большинстве случаев уродливый Times New Roman), мы можем встроить фантастические шрифты. В подпапке art нашей директории исходного кода, мы можем включить истинные типы шрифтов, которые мы включим в наш SWF. Параметр unicodeRange инструктирует Flash не включать целый шрифт, а только символы, которые нужны, такие как буквы, цифры и знаки пунктуации, которые сохраняют размер файла, не включая глифы иностранных языков. Наконец, также были встроены MP3-файлы, так что наша игра будет способна выводить звук и музыку.
Orion45
03.07.14 в 11:10
|
|
Время для действий - встраиваем наши новые арт активы (CS5 версия). Следующий код может быть пропущен, если вы использовали предыдущий раздел, но требуется, если вы используете Adobe Flash CS5. Помните, что вместо [embed], нам нужно перетаскивать файлы на палитру библиотеки Flash-редактора и правым кликом на вводе редактировать их свойства. Это также тот же самый способ как в прошлый раз, за исключением того, что мы также добавляем шрифт и звуки.
Orion45
03.07.14 в 11:16
|
|
private var playerTextureData:Bitmap = // player.jpg new Bitmap(new playerTextureBitmapData(256,256)); private var badguyTextureBitmap:Bitmap = // badguys.jpg new Bitmap(new badguyTextureBitmapData(256,256)); private var techTextureBitmap:Bitmap = // hulltech.jpg new Bitmap(new techTextureBitmapData(256,256)); private var terrainTextureData:Bitmap = // terrainTexture.jpg new Bitmap(new terrainTextureBitmapData(512,512)); private var cratersTextureData:Bitmap = // craters.jpg new Bitmap(new cratersTextureBitmapData(512,512)); private var skyTextureData:Bitmap = // sky.jpg new Bitmap(new skyTextureBitmapData(512,512)); private var puffTextureData:Bitmap = // engine.jpg new Bitmap(new engineTextureBitmapData(128,128)); private var particle1bitmap:Bitmap = // particle1.jpg new Bitmap(new particle1BitmapData(128,128)); private var particle2bitmap:Bitmap = // particle2.jpg new Bitmap(new particle2BitmapData(128,128)); private var particle3bitmap:Bitmap = // particle3.jpg new Bitmap(new particle3BitmapData(128,128)); private var particle4bitmap:Bitmap = // particle4.jpg new Bitmap(new particle4BitmapData(128,128)); private var titleScreen:Bitmap = // titleScreen.png new Bitmap(new titlescreenBitmapData(640,480)); private var hudOverlay:Bitmap = // hudOverlay.png new Bitmap(new hudTextureBitmapData(640,480)); private var introOverlay:Bitmap = // intro.png
Orion45
03.07.14 в 11:16
|
|
new Bitmap(new introOverlayBitmapData(640,480)); private var levelKey:Bitmap = // level_key.gif new Bitmap(new levelKeyBitmapData(32,4)); private var levelData:Bitmap = // level_00.gif new Bitmap(new levelDataBitmapData(15,640)); Вот как должна выглядеть ваша палитра библиотеке, когда вы закончите: Что же произошло?Также как до этого, всё, что мы сделали это встроили требующиеся арт активы в наш Flash-файл. Обратите внимание на имена, которые были использованы и помните, что каждое сделано, чтобы быть экспортированным в ActionScript в кадр 1. Время для действий - встраиваем все меши. Последний шаг, требующийся, чтобы включить арты, используемые в нашей игре, это встроить .OBJ файлы, которые определяют всю геометрию меша. Этот шаг одинаков, не важно в какой среде разработке вы работаете. //данные маеше //игрок - 142 полигона
Orion45
03.07.14 в 11:23
|
|
[Embed (source = "art/spaceship_funky.obj", mimeType = "application/octet-stream")] private var myObjData5:Class; // the engine glow - 336 polygons [Embed (source = "art/puff.obj", mimeType = "application/octet-stream")] private var puffObjData:Class; После мешей, используемых космичесаким кораблём игрока, мы встроим различные меши используемые для игровой среды - земля, небо и поле астеройдов. //Данные меша поверхности - 8192 полигона [Embed (source = "art/terrain.obj", mimeType = "application/octet-stream")] private var terrainObjData:Class; // поле астероидов - 3280 полигонов [Embed (source = "art/asteroids.obj", mimeType = "application/octet-stream")] private var asteroidsObjData:Class; // небо - 768 полигонов [Embed (source = "art/sky.obj", mimeType = "application/octet-stream")] private var skyObjData:Class; Теперь мы добавим меши для использования в наших системах частиц и для пуль //начало взрыва - 336 полигонов [Embed (source = "art/explosion1.obj", mimeType = "application/octet-stream")] private var explosion1_data:Class; // конец взрыва - 336 полигонов [Embed (source = "art/explosion2.obj", mimeType = "application/octet-stream")] private var explosion2_data:Class; // "густой" взрыв - 336 полигонов [Embed (source = "art/explosionfat.obj", mimeType = "application/octet-stream")] private var explosionfat_data:Class; // пуля- 8 полигонов [Embed (source = "art/bullet.obj", mimeType = "application/octet-stream")] private var bulletData:Class;
Orion45
03.07.14 в 12:40
|
|
Мы добавим модели для врагов, которые мы хотим разрушить: несколько караульных пушек, топливные баки и огромный кораблю босса для разнообразия. //караульные пушки - все разделяют одну текстуру [Embed (source = "art/sentrygun01.obj", mimeType = "application/octet-stream")] private var sentrygun01_data:Class; [Embed (source = "art/sentrygun02.obj", mimeType = "application/octet-stream")] private var sentrygun02_data:Class; [Embed (source = "art/sentrygun03.obj", mimeType = "application/octet-stream")] private var sentrygun03_data:Class; [Embed (source = "art/sentrygun04.obj", mimeType = "application/octet-stream")] private var sentrygun04_data:Class; // топливные пушки - используют одну текстуру также как караул [Embed (source = "art/fueltank01.obj", mimeType = "application/octet-stream")] private var fueltank01_data:Class; [Embed (source = "art/fueltank02.obj", mimeType = "application/octet-stream")] private var fueltank02_data:Class; // огромный корабль босса [Embed (source = "art/boss.obj", mimeType = "application/octet-stream")] private var bossData:Class; Кроме того, мы хотим, чтобы там была группа астероидов, разбросанных по всему уровню, чтобы игроку нужно было уворачиваться или разрушиться. private var astroTunnelData:Class; // отдельный астероид [Embed (source = "art/asteroid_00.obj", mimeType = "application/octet-stream")] private var asteroid_00_data:Class; [Embed (source = "art/asteroid_01.obj", mimeType = "application/octet-stream")] private var asteroid_01_data:Class; [Embed (source = "art/asteroid_02.obj", mimeType = "application/octet-stream")] private var asteroid_02_data:Class; // огромный плоский "стол" (круглая скала с плоской вершиной) [Embed (source = "art/island.obj", mimeType = "application/octet-stream")] private var islandData:Class;
Orion45
03.07.14 в 14:28
|
|