Хотелось бы до января выложить бету, в которой присутствует 1 компания - земля, но работает весь запланированный функционал. На данный момент надо сделать финального босса, еще 2 вида оружия и 2 давнгрейда, а также подсказки по управлению и доделать меню опций и статистики.
Изменил(а) Hellmapper, 03.12.2013 22:08:49
За 2 недели с моего предыдущего поста в игрушке произошли следующие изменения:
Исправлены незначительные баги в меню.
Исправлен баг, который позволял стрелять после смерти игрока.
Добавлены сообщения для уникальных уровней, которые в компании выводят цель миссии, а в бесконечных уровнях так же пишут номер уровня и доп. информацию.
Добавлен враг - Carrier. Это корабль Остеклителей, который занимается транспортировкой блоков стекла. Его можно встретить как в волнах, так и на уникальном уровне Змейка. В первой волне и гравитации их нельзя уничтожить - они лишь доставляются блоки, но вот волне от уровня Змейка вам придется встретиться с ним лицом к лицу. Во время этой волны, корабль-транспортировщик с 4 блоками (их тип зависит от того, сколько кораблей-транспортировщиков вы убили за текущую волну) и 300ХП перемещается по направлению к вам. С каждым ударом по кораблю его скорость перемещения возрастает, а полученный урон перераспределяется по всем блокам. но так же этот транспортировщик можно уничтожить разбив все блоки, которые он тащит и быстро нанести 3 удара.
Скриншот с уровня змейка:
Hellmapper присоединил изображение:
Новый NPC - Carrier - выполняет функции транспортировщика блоков. Он не раз будет мешать по пути к финальному боссу. В данный момент реализовано 2/3 его предназначений. В следующем видео будут продемонстрированы все 3, а так же переработка первой волны. YouTube Video
Изменил(а) Hellmapper, 06.01.2014 00:28:29
Есть одно замечание. Серьезное замечание.
Игра одолжна развертыватся именно в папке "игры" ане в корне приложений.
Как сделать?
В файле WMAppManifest.xml добавить стрчку Genre="Apps.Games"
---
Так очень понравилось, теперь уже глаза не бегают с целью определить каким цветом выстрелит корабль. очень информативно. И побокам подсветка текущего цвета очень помагает соринтироватся.
К текущему управлению привыкнуть сложно. можно но сложно.
Сейчас два варианта:
1. При нажатии одним тапом.
Если нажатие находится в пределах коробля, то происходит выстрел.
Если нажатие за пределами корабля то идет перемещения коробля в точку тапа и происходит выстрел.
2. перетаскивание коробля путем удержания нажатия на коробле и перетаскивание в точку.
Метод два интунтивно понятный.
Но с первым методом происходят непонятки.
Что вот как я игрок который первый раз запустил игру.
Думаю что нужно переместить корабль, и сделать выстрел.
Собственно тапаю в сторону перемещения. корабль послушно перемещается. и неожиданно для меня происходит автоматический выстрел! Пытаюсь понять что происходит. и тут выстрел попадает в блок не того цвета. я ведь решил просто передвинуть корабль а не стрелять. и собсвенно идет отражение моего выстрела. я незнамо что делать. опять перетаскиваю карабль. корабль перемещается и снова выстрел. паника.
Собсвтенно я очем.
Для меня, интуитивно понятно былоб такое управелние
1. нажатие на тап за пределы карабля - только перемещение коробля
2. нажатие на тап в пределах коробля - выстрел
3. нажатие и удерживание на коробле с перемещением - перемещение коробля
4. нажатие на стеклянные блоки - перемещение и выстрел корабля на указанный блок. при этом. блок который будет обстеливатся както подсвечивать. чтобы понятно было что мы стреляем именно по этому блоку. Далее когда он двигается. и мы еще раз нажали в другую сторону. происходит отмена движения и стрельбы.
както так.
Хотя повторюсь. это только мое мнение.
----
Еще одно предложение, для кросоты игры. Добавь паралакс. Например, ввиде облаков. Рисуй обалка, с полупрозрачностью, но с более высокой скоростью. Думаю, с таким эффектом игра будет еще красившей.
Спасибо за тест и за отзыв! Управление будет изменено на предложенное, ну может кроме подсветки блока, хотя как пойдет. + в настройках, до которых у меня надеюсь дойдут руки после сессии, можно будет включить автоматический огонь после перемещения нажатием. Параллакс будет, как и 3D вращение земли на уровнях 5+.
Вчера увеличил производительность, а так же добавил новые пути в WaveSnake. Следующая обнова будет выложена, когда допилю оставшийся тип npc_carrier'а.
Изменил(а) Hellmapper, 09.01.2014 17:42:15
Начал тут еще лепить небольшой комикс, описывающий начало событий игры. Несколько кадров из него. (В игрушке все будет приправлено передвижульками и эффектами):
Осталось нарисовать кадры с земли: кто-то указывает на корабли остеклителей, следующий кадр: первый корабль с 3-го кадра сбивают и захватывают и последний: он отправляется в бой. Это самые трудные кадры, т.к простыми деформациями не удастся получить объемный корабль вблизи и придется рисовать с 0.
Изменил(а) Hellmapper, 09.01.2014 23:11:31
Потом выясняется, что остеклители какбы и не захватывают планету. а специально защищают ее от радиоционного фона близпролетающей каметы. Путем выстраивания защиты из особого стекла.
И когда выясняются истеныне мотивы инопланетян... становится очень поздно!
--
видео прикольное
Изменил(а) Yozka, 17.01.2014 19:11:27
Yozka написал:
Потом выясняется, что остеклители какбы и не захватывают планету. а специально защищают ее от радиоционного фона близпролетающей каметы. Путем выстраивания защиты из особого стекла.
И когда выясняются истеныне мотивы инопланетян... становится очень поздно!
--
видео прикольное
Рывки при записи и в эмуле (хз почему). На девайсе все стабильно ползет. Вот http://sdrv.ms/1b... можно скачать и посмотреть в живую. Без отрисовки корабля карта Test.
Изменил(а) Hellmapper, 17.01.2014 19:54:34
Немного о том, какие награды дают звездочки при прохождении компании.
5 уровень на 3 звезды - открывается режим Snake на онлайн счет.
10 уровень на 3 звезды - открывается режим Gravity на онлайн счет.
1 - 4 уровень на 3 звезды - можно выбрать в меню другой бэкграунд (из 1-5 уровней). Аналогично с интервалами уровней 6-9 и 11-14
Все уровни на 3 звезды и убитый босс - открывают героический уровень сложности босса, на онлайн время. А так же новый корабль, тот что был у босса с возможностью создавать блок взрывчатки и направлять ее к другим блокам.
При скролле есть небольшая проблема: когда высота текстуры не делится целиком на приращение Y скролла, то появляется черная полоска. Кто-нибудь знает как это исправить?
Еще 1 бэкграунд. В данный момент он еще шлифуется. Возможно стоит добавить на полярные шапки блоки стекла. YouTube Video
UPD:
На уровнях c этим фоном фпс стало проседать местами до 27.11. Наверно надо будет уменьшить кол-во полигонов в сфере и все текстуры Дня/ночи/Маска. Закинуть в 1 атлас и сжать DXT. Саму маску стоит ужать до 1280*1, а потом просто растягивать по высоте основной карты. Сейчас гуглил про оптимизацию, и оказывается зря я вводил виртуальные методы почти в каждый класс и делал кучу наследований.
Изменил(а) Hellmapper, 24.01.2014 01:57:21
public class SoundManager
{
private class Sound
{
/// <summary>
/// Количество существующих копий данного звука.
/// </summary>
public int count;
/// <summary>
/// Звук для создания его независимых копий
/// </summary>
private SoundEffect effect;
/// <summary>
/// Список с независимыми копиями
/// </summary>
private List<SoundEffectInstance> effect_copies;
/// <summary>
/// Тип звука. Используется enum, чтобы при поиске избегать пересоздания строк.
/// </summary>
public SoundType Type;
/// <summary>
/// Максимальное число копий данного звука - выбрано с учетом того,
/// что максимальное число одновременно проигрываемых звуков на Windows Phone - 64,
/// а игрок не может создать за короткий промежуток времени больше 16 выстрелов
/// или разбить больше 16 блоков.
/// Большое количество взрывов просто "смазывается" во времени и становится
/// незаметным, что некоторые звуки не проигрались.
/// </summary>
const int MaxSoundCopies = 16;
/// <summary>
/// Инициализация
/// </summary>
/// <param name="_type">Тип звука</param>
/// <param name="_effect">Ссылка на SoundEffect</param>
public Sound(SoundType _type, SoundEffect _effect)
{
Type = _type;
//Задаем Capacity, чтобы тратить время на расширение списока при добавлении.
effect_copies = new List<SoundEffectInstance>(MaxSoundCopies);
effect = _effect;
}
/// <summary>
/// Проигрывание звука.
/// </summary>
/// <param name="volume">Громкость</param>
/// <param name="looped">Повторять звук</param>
/// <returns>Возвращает ссылку на копию SoundEffectInstance,
/// чтобы можно было остановить именно её а не все копии данного звука.</returns>
public SoundEffectInstance Play(float volume, bool looped)
{
if (count < MaxSoundCopies)
{
SoundEffectInstance instance = effect.CreateInstance();
instance.Volume = volume;
instance.IsLooped = looped;
effect_copies.Add(instance);
effect_copies[count].Play();
count++;
return instance;
}
return null;
}
/// <summary>
/// Остановка всех копий данного звука.
/// </summary>
/// <param name="only_looped">Остановка только зацикленных звуков</param>
public void Stop(bool only_looped)
{
if (only_looped)
{
for (int i = 0; i < count; i++)
{
if (effect_copies[i].IsLooped)
{
effect_copies[i].Stop();
effect_copies.RemoveAt(i);
count--;
i--;
}
}
}
else
{
for (int i = 0; i < count; i++)
{
effect_copies[i].Stop();
}
effect_copies.Clear();
}
}
public void Update(GameTime gameTime)
{
for (int i = 0; i < count; i++)
{
//Если звук проигрался убираем его из списка
if (effect_copies[i].State == SoundState.Stopped)
{
effect_copies.RemoveAt(i);
count--;
i--;
}
}
}
}
/// <summary>
/// Список со всеми звуками.
/// </summary>
private List<Sound> sounds;
/// <summary>
/// Инициализация
/// </summary>
public SoundManager()
{
}
/// <summary>
/// Проиграть определенный звук.
/// </summary>
/// <param name="type">Тип звука</param>
/// <param name="volume">Громкость</param>
/// <returns>Возвращает ссылку на текущий звук</returns>
public SoundEffectInstance Play(SoundType type, float volume)
{
for (int i = 0; i < sounds.Count; i++)
{
if (sounds[i].Type == type)
{
return sounds[i].Play(volume, false);
}
}
return null;
}
/// <summary>
/// Проиграть определенный звук.
/// </summary>
/// <param name="type">Тип звука</param>
/// <param name="volume">Громкость</param>
/// <param name="looped">Зацикленный</param>
/// <returns>Возвращает ссылку на текущий звук</returns>
public SoundEffectInstance PlayInstance(SoundType type, float volume, bool looped)
{
for (int i = 0; i < sounds.Count; i++)
{
if (sounds[i].Type == type)
{
return sounds[i].Play(volume, looped);
}
}
return null;
}
public void Update(GameTime gameTime)
{
for (int i = 0; i < sounds.Count; i++)
{
sounds[i].Update(gameTime);
}
}
}
}
1 вопрос: может стоит сделать этот класс статичным? Как это повлияет на производительность?
2 вопрос: Может в классе Sound избавиться от добавления\удаления звука в список, а сразу создать массив из 16 звуков, а при вызове Play искать первое вхождение звука у которого State == Stopped изменять его параметры и проигрывать. Тот же вопрос с производительностью.
Изменил(а) Hellmapper, 27.01.2014 15:37:27
Реализовал второй пункт. Работать стало шустрее. Но есть минус - метод Dispose() нельзя вызывать, если планируется в дальнейшем использовать данный звук - крашнет игру.
GeSHi: C#
privateclass Sound
{
privatestruct SoundInstance
{
public SoundEffectInstance SoundEffectInstance;
publicbool Activated;
public SoundInstance(SoundEffectInstance soundEffect, bool played)
{
SoundEffectInstance = soundEffect;
Activated = played;
}
}
/// <summary>
/// Количество существующих копий данного звука.
/// </summary>
publicint count;
/// <summary>
/// Звук для создания его независимых копий
/// </summary>
private SoundEffect effect;
/// <summary>
/// Массив с независимыми копиями
/// </summary>
private SoundInstance[] effect_copies;
/// <summary>
/// Стек с доступными номерами звуков.
/// </summary>
private Stack<int> unused_sounds_stack;
/// <summary>
/// Тип звука. Используется enum, чтобы при поиске избегать пересоздания строк.
/// </summary>
public SoundType Type;
/// <summary>
/// Максимальное число копий данного звука - выбрано с учетом того,
/// что максимальное число одновременно проигрываемых звуков на Windows Phone - 64.
/// </summary>
privateint MaxSoundCopies =16;
/// <summary>
/// Инициализация
/// </summary>
/// <param name="_type">Тип звука</param>
/// <param name="_effect">Ссылка на SoundEffect</param>
public Sound(SoundType _type, SoundEffect _effect)
{
Initialize(_type, _effect, 16);
}
/// <summary>
/// Инициализация c возможностью задать максимальное число копий данного звука
/// </summary>
/// <param name="_type">Тип звука</param>
/// <param name="_effect">Ссылка на SoundEffect</param>
/// <param name="maxSoundCopies">Максимальное число копий данного звука</param>
public Sound(SoundType _type, SoundEffect _effect, int maxSoundCopies)
{
Initialize(_type, _effect, maxSoundCopies);
}
privatevoid Initialize(SoundType _type, SoundEffect _effect, int maxSoundCopies)
Никак не могу избавится от микрофриза при первом выстреле. Ума не приложу что может делать приложение при выстреле.
Вот измеренное время на каждый вызов выстрела (мс):
26,2422
0,2485
0,0805
0,0548
0,101
0,0859
Полный путь от вызова Fire(), где начинается измерение через все методы. Может вы заметите, что-то неладное