Сообщения

Сообщения за 2010

2D Физика для игр - Separate Axis Theorem - Вектор сдвига

Изображение
Как и обещал продолжаю перевод серии статей про игровую физику. Сегодня я напишу как получить вектор сдвига и разьединить 2 столкнувшихся многоугольника.


Как было точно подмечено анонимным комментатором метод отделяющей оси работает только для выпуклых многоугольников.


Итак, дано: 2 столкнувшихся многоугольника
Задача: Разьединить 2 многоугольника, причём минимальным сдвигом.


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


2D Физика для игр - Separate Axis Theorem

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

Первая статья будет посвящена Separete Axis Theorem ( теорема о разделяющей оси )- методу проверки столкновений между многоугольниками. Данный метод является наиболее быстрым на данный момент и используется повсеместно во всех 2D физических библиотеках.

Итак, задача: Нам даны два многугольника в виде массива координат вершин. Необходимо проверить их на пересечение.


Vkontakte Merchant API

Сегодня был свободный день и почти всё время провёл дома. Но решил не тратить его попусту и сделать небольшой сайт-магазин для моей игры, попутно немного изучив Vkontakte Merchant API.

В принципе что меня удивило - это простота установки данного API. Сам процесс вставки в сайт кнопки покупки действительно занимает минуты,а большинство времени было потрачено на написание заглушек для Callback-страниц.


RadialBlur HLSL Shader - 3 сэмпла

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


sampler ColorMapSampler : register(s0);

float4 radialBlur(float2 vTex:TEXCOORD0):COLOR
{
    float4 result=float4(1,0,0,1);
    //массив с сэмплами. тут их 3 для производительности
    float samples[3] = {0.05 ,0.03,  0.01};


Убрал баг с Alt-Tab, который возникал в полноэкранном режиме игры. Оказывается теперь XNA сама заботиться об восстановлении графического устройства после его потери. Я же думал что его нужно восстанавливать вручную по событию DeviceLost, что конечно неправильно.

Слава богу существует класс Trace который позволяет сделать быстрый лог того что происходит и значительно упростил отладку и поиск ошибки.

Диплом в Шаге - 12/12

Наконец-то сдал диплом в Шаге на оценку 5+. Процесс защиты длился 12 часов с часовым перерывом, но и студенты и преподаватели выдержали этот экзамен =)
На радостях выкладываю видео дипломного проекта и арканоида. Разработка не прекращается,а продолжается и как я обещал скоро будет новое оформление и релиз.




HLSL шейдеры для чайников

Изображение
Шейдерная графика сейчас наиболее популярна. Большинство игр так и пестрят системными требованиями Shader 2.0, что конечно разочаровывает владельцев стареньких ПК, и радует картинкой современных геймеров. В этой статье я попытаюсь рассказать вкратце о том как писать HLSL шейдеры на XNA и в результате получить шейдер радиальной градиентной заливки.


Итак. Нам понадобяться следующие инструменты:

XNA Game Studio Видеокарта с поддержкой шейдеровИтак для начала мы создадим "Windows Game" проект в студии. Далее нам необходимо создать небольшую текстурку. Неважно её содержимое, сколько само её существование. Поэтому добавляем к Content новый элемент - текстуру 2*2. 
Далее нам необходимо нарисовать её, поэтому добавляем в класс Game переменную Texture2D и загружаем её в LoadContent
Texture2D texture; protected override void LoadContent()
        {
            // Create a new SpriteBatch
            spriteBatch = new SpriteBatch(GraphicsDevice);
            texture = Content.Load("tex&quo…

Cycloid. Новости

Рад сообщить что разработка игры под XNA идёт полным ходом. Почти все предполагаемые фичи реализованы, так что работа переходит в стадию тестирования и допиливания.

Кроме того я договорился с художником о создании оформления для игры. Конечно переоформление займет некоторое время, но оно того стоит. Могу только сказать что предварительные эскизы я уже видел и выглядит всё это очень даже неплохо.

К сожалению бинарников и эскизов показать не могу, и в ближайшем времени их вряд ли кто то увидит. Buissness is buissness.

Farseer Physics и XNA

Решил переделать свой арканоид и вместо собственной физики использовать 2D физический движок Farseer Physics. Это наиболее распространённый физический движок для C# ( в частности под XNA). Подключить был довольно просто - в комплекте идёт готовый пример использования, однако сразу столкнулся с первыми трудностями.

Основная проблема с которой я столкнулся - это появление исключения ArithmeticException в методе вычисления угловой скорости (AngularVelocity). Что самое обидное было - это то, что исключения возникало не сразу, а в процессе игры. Долгие поиски причины не привели к решению проблемы, однако путём тыка ( самый действенный метод ) ошибка была устранена.

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

XNA - продолжая тему диплома

Изображение
Итак.... Я не знаю говорил ли я что я пишу 2 диплома? Если нет то теперь вы знаете.
Один в универе и один в Шаг. Довольно весёлое занятие - попеременно забивать болт то на один, то на другой....

Сегодня я хочу написать о том что у меня получается с Шаговским дипломом. В Шаге я занимаюсь разработкой игры под платформу XNA. В качестве игры я решил переделать стандартную под iPod игру - Vortex. Это аналог арканоида, с отличием в том, что бита движется по кругу,и задача игрока не выпустить мяч за пределы круга.

Собственно первая часть работы - организовать процесс игры, движение шарика и биты. Она у меня прошла довольно гладко.

И вот сейчас я решил взяться за вторую - рефакторинг, организация игрового движка и наконец использования шейдеров.

Небольшой тизер :)



Основной идеей рефакторинга было создание классов для разделения функций между движком и логикой игры.

Т.к игра двумерная я создал классы спрайтов,на основе которых позже создал классы анимированных спрайтов и анимаций.

Краткая диаграмма …

Севастополь. Информатика-2010

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

Как говорится на шару и уксус сладкий.

Update:
Фотоотчёт можно найти на
http://picasaweb.google.com/jack.spektor/DuYLZ?feat=directlink


Наваял гаджет

Изображение
Чтото меня потянуло на гаджеты. Решил сделать небольшой гаджет для души.
Смысл - жмём на кнопку и снизу вылетают воздушные шарики.
Долго мучался с COM регистрацией и вызовом, но слава яйцам всё получилось.

Встречайте - Bubble gadget



https://docs.google.com/leaf?id=0B6h7yaggRA4pYzI3Mjc1OGEtNWYzNy00ZThlLWIwMzAtNWU4ZmJhYTdmYzJk&hl=en

Альтернативная ссылка на загрузку:
http://sites.google.com/site/jackdevolpment/files/gadget.gadget?attredirects=0&d=1

Более подробно о том как это всё было и какие мне встретились проблемы напишу позже. Сейчас спать.

Играемся с iTunes через Javascript

Довольно классна штука - этот айТюнс. И плеер хороший, и подкасты качает и вообще красавец. Ладна, к чему это я? Случайно узнал, что оказывается у него есть API. Работает через COM и позволяет получить полный доступ к функционалу плеера.

Так что например вот такой нехитрый Javascript код

iTunesApp = new ActiveXObject("iTunes.Application");
iTunesApp.NextTrack();

поменяет песню в плеере на следующую, а вот например

var iTunesApp = new ActiveXObject("iTunes.Application");
var currentTrackName=iTunesApp.CurrentTrack.Name;
var currentArtist=iTunesApp.CurrentTrack.Artist;
alert(currentArtist+" - "+currentTrackName);

покажет название текущей песни. У меня это например сейчас "Vampire Weekend - Oxford Comma". Вот такие пироги. Кстати чуть не забыл - вся это красота работает только в случае Internet Explorer. Так что имейте ввиду :)

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

Диплом. Черновик 3D рендера. Java

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

Написал небольшой черновик 3D рисования на Java - думаю внедрить поддержки 3Д визуализации в систему - это даст возможность рисовать графики, которые будут упрощать понимание результатов работы алгоритма на кластере.

В принципе я уже сделал визуализацию в 2Д для фреймворка, но алгоритм, который необходимо реализовать должен будет рисовать поверхность в 3Д, так что приходится разбиратся с 3Д костылями для Джавы. Вот такие пироги.

Java Opengl (использует JOGL)
https://docs.google.com/leaf?id=0B6h7yaggRA4pZGVmMDMyYmMtZTYyYi00NmE1LWI2YjQtM2E4OGRhNWI2OGI1&hl=en

Взлом алгоритма Эль-Гамаль( с помощью алгоритма Шенкса)

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

Реализовывал на Java т.к боялся что числа выйдут за пределы стандартных типов данных, а в Java для этого есть удобный тип данных BigInteger. Такто.

Итак условие:
В следующих задачах зашифрован алгоритмом ЭльГамала текст, написанный на английском языке. Использован следующий алфавит:
"A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z| |,|.|".
Блок "подсказки" расположен в начале криптотекста и является общим для всех его блоков. Его длина считается неизвестной. Найти секретный ключ и расшифровать текст.

"5148154611033774886049492438294008383372872853501067660147906401592062201450665781876473"

Открытый ключ: p=89981741 g=2 h=76976449

Часть первая - решение задачи целочисленного логарифмирования ( поиск секретного ключа a)
На вход подаётся p,g,h

package Shenks;

import java.math.BigInteger;
import java.uti…