книги хакеры / журнал хакер / 152_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
модель, хранящуюся в переменной model. В начале этого метода путем перемножения матрицы сдвига и матрицы вращения создается целевая матрица перемещения объекта. После этого в цикле foreach перебираем все меши объекта, чтобы затем во вложенном цикле через умножение матрицы текущего меша на полученную на предыдущем шаге матрицу получить мировую матрицу. Все эти трансформации нужны для корректного отображения объекта в пространстве. Объект класса BasicEffect кроме собственно пространственной матрицы содержит многие другие свойства: текстурные координаты, альфа-составляющую материала, параметры для освещения, видовую матрицу, матрицу проекции и многое другое. Вообще, этот объект предоставляет возможности такого механизма, который раньше в DirectX назывался фиксированным конвейером визуализации. Но, начиная с DX 10, его напрочь удалили, оставив только программируемый конвейер. Для того чтобы с его помощью визуализировать хоть что-то, надо писать свои шейдеры. Конечно, это позволяет добиться наилучших результатов, однако иногда вполне подходят стандартные механизмы. В XNA тоже имеется программируемый конвейер, но мы его рассматривать сегодня не будем. Последняя операция метода DrawObj (также находящаяся в цикле foreach) выводит меш в задний буфер. Единственное действие, выполняемое методом UpdateState, — это обновление позиции объекта в пространстве путем скалярного умножения вектора направления вперед матрицы rotMat-объекта и переданного в параметре значения. Последний метод класса SetupEffects вызывается лишь единожды — при инициализации. В него передаются матрицы проекции и вида, которые впоследствии присваиваются эффекту каждого меша модели. Также, для каждого меша включается стандартное освещение. Результат операции присваивается переменной — члену trans, которая участвует в построении объекта (в процессе метода DrawObj (см. выше). Преждечемзапускатьпостроениепроекта, надовнестиизменения вклассGame1, которыйгенерируетсяавтоматоминаследуетсяот
Microsoft.Xna.Framework.Game, перегружаянекоторыеегометоды. И
сноваисходниксдискатебевпомощь, здесьжекраткорасскажу, что тамкчему. ВначалеклассаGame1 объявляемвсеглобальныепеременные— так, например, объектклассаObject — Object car1 = new Object(20); передаваясмещениепараметром, здесьженаходятся объявленияматрицвидаипроекции, онибудутинициализированы позже. Конструкторклассаужерассмотрен. Вфункцииинициализациипроизводимматрицы:
projectionMatrix = Matrix.CreatePerspectiveFieldOfView (MathHelper.ToRadians(45.0f),aspectRatio,1.0f,100.0f);
viewMatrix = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);
Длясозданияматрицыпроекциипередаем: полевидимостипо осиY врадианах, соотношениесторонэкрана(объявленоранее), расстояниедоближнейидальнейплоскостиотсечения. В созданиивидовойматрицыучаствуюттакиезначения: позиция камеры(объявленаранее— триплетзначений, представляющий координатыX,Y,Z), направлениевидакамерыивекторобзо-
равверх, относительнотекущемувиду. ВметодеLoadContent происходитзагрузкаресурсов, такмодельдляобъектанашегоклассазагружаетсятакойстрочкой: car1.model = Content.
Load<Model>("Models/Hotrod"); Сразупослезагрузкивызывается методобъектадляустановкипреобразованиймешеймодели:
car1.SetupEffects(projectionMatrix, viewMatrix);, длякоторого передаютсяранеесозданныематрицы. ВметодеUpdate, который подобнометодуDraw вызываетсяприперерисовкикаждогокадра, осуществляетсятрансформациянашихобъектовклассаObject.
ДополнительновнемвызываетсяфункцияUpdateInput, которая детектитнажатиелевойклавишимыши, иврезультатеувеличиваетскоростьвращенияиперемещенияобъектов, инкрементируя значенияпеременных. ПоследнийметодDraw выводитвсена
XÀÊÅÐ 09 /152/ 2011
экран. Сначалаоночищает— закрашиваетзаднийбуферсплошнымцветом, затемвыводиттекстуруидваобъектаклассаObject. Последняястрочкаметодаbase.Draw(gameTime); меняетположенияпервичногоизаднегобуферов. Витогевсе, чтовизуализировалосьтам, теперьнанашемэкране.
Сейчассамоевремяоткомпилироватьипротестироватьпроект. В томслучае, есливсесделаноправильно, тыувидишьтакуюдемонстрацию3D надисплееэмулятора(рис. 3).
Звуки
Напоследокдобавимзвук. Возьмикакой-нибудь*.wav-файл(напри- мер, сдиска) изагрузиеговконтентпайплайн. Объявитрипеременных: однудлязагрузкизвука, вторую— дляосуществленияконтрола надпроигрыванием, ипоследнюю— длясостоянияпроигрывания:
SoundEffect sound; //звук
SoundEffectInstance soundControl; //управление звуком bool isPlay = false; //индикатор проигрывания музыки
ЗатемвфункцииLoadContent загрузизвук, создайобъектдляуправлениязагруженнымзвуком, зациклиеговоспроизведениеиначни проигрывать:
sound= Content.Load<SoundEffect>("Music/jets014"); soundControl = sound.CreateInstance(); soundControl.IsLooped = true;
soundControl.Play(); isPlay = true;
ТеперьвфункциюUpdateInput добавькоддляостановкиивоспроизведениямузыкипонажатиюнакнопкуBack эмулятора:
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) {
if (isPlay) { soundControl.Pause(); isPlay = false;
}else { soundControl.Play(); isPlay = true;
}
}
Послеэтогоможешьпротестироватьсвойэкземпляр. Теперьдолжна проигрыватьсявыбраннаямелодия. Да, подготовленныймнойзвук, конечно, вообщеневтему, затобесплатно:)!
Итоги
Впроцессенаписаниястатьияпостаралсярассказатьтебеоб основахпрограммированиядляWP 7.1 и, главнымобразом, о созданииприложенийсдинамическойтрехмернойграфикой. Не рассмотреннымиосталисьмногиепримечательныемеханизмы, присущиеэтойплатформе: взаимодействиесразнымидатчиками, сервисамиидругимиаппаратнымисредствами. Приэтомянеставилпередсобойтакойцели, ялишьхотелсделатьвводныйтуториал овозможностяхпрограммированияигрдляWindows Phone 7.1. К сожалению, рамкистатьинепозволилимнерассказатьоразработкеполностьюзаконченнойигры, протестироватьеенареальном устройстве(ктомуже, впериоднаписаниястатьиустройствас WP7.1 ещенесуществоваловприроде:)) ивыложитьеенаWindows Phone Marketplace (отмечу, чтозаправоторговатьвмагазиненадо приобрестилицензиюнагодза2900 рублей). Однакояужеработаю надэтойигрой, ивследующийразпостараюсьдетальноописатьее разработку, чтобыутебябылнеисчерпаемыйбагажзнаний!
Удачиввыводеденег— ведьпользователиWindows Phone привыкли платитьзаполезныеикачественныеприложения! z
109
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|||
P |
|
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
|
w Click |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
o |
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
CODING
Александр Эккерт (stannic.man@gmail.com)
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
РУТКИТ В СЕТЕВУХЕ
Фантазии системного программиста о создании непобедимого руткита
Представь себе фантасмагорию: твоя сетевая карта (или процессор, или видеокарта) живет отдельной жизнью
шизофреника. И дружит она (или все эти компьютерные потроха сразу) против тебя. Возможно ли такое восстание машин, инициированное силами хакеров или, скажем, производителей железа? Давай пофантазируем!
110 |
XÀÊÅÐ 09 /152/ 2011 |