-Рубрики

 -Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в seamanmur

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 14.04.2006
Записей:
Комментариев:
Написано: 120


блог на zoxt

Воскресенье, 19 Февраля 2012 г. 22:46 + в цитатник

На блоге я уже давненько выложил цикл уроков по управлению персонажем в Юнити.

С тех пор прошло много времени. У нас на работе кардинальные изменения. Объединили с местным оператором связи. Почти половина из старого коллектива уволились. Здание в котором работали продается. Всех раскидали по разным местам. В-общем изменения большие.

Но вроде сейчас все успокаивается. Так что можно вернуться к нашим баранам.

Рубрики:  misk

LiveInternet меня достал

Четверг, 16 Июня 2011 г. 22:53 + в цитатник

Именно.

Мало того что он нормально не поддерживает теги, так он сегодня еще жутко глючит. Не могу уже минут сорок сообщение отредактировать!

В общем я ушел сюда:

Журнал


Метки:  

UDK vs Unity3d

Воскресенье, 12 Июня 2011 г. 22:40 + в цитатник
Полугодичный перерыв!
Я весь в этом. Загорюсь, вспыхну - потухну...

Ну - это лирика. А дело в том, что US меня достал окончательно. В результате я перешел в Unity3D.
Он, конечно, дает менее красивую картинку. Однако - огромный плюс - там стандартный C#! Программировать в нем - одно удовольствие. Конечно нужно изучить API, но в остальном в нем лучше.

PS: попробую все же тут пописывать, не забрасывать так надолго...

Метки:  

Итератор

Вторник, 14 Декабря 2010 г. 11:22 + в цитатник

Сколько ж ограничений в UnrealScript!

Вот, оказывается  свой итератор нельзя объявить.  Функция-итератор должна быть нативной. Нативную функцию можно объявить только в нативном классе. А нативный класс просто нельзя объявлять...

Но я это обошел.

Создаем функцию, подобную итератору, например:

function RPGInvActor(class<Inventory> BaseClass, out Inventory Inv)

Она подобна итератору:

native final iterator function InventoryActors( class<Inventory> BaseClass, out Inventory Inv );

из класса  InventoryManager. Единственное условие - в Inv должна вернуть None, если не нашла.

Теперь вместо foreach используем:

do
{
 ...
} until( Inv != None);

 

Естестсвенно RPGInvActor должна при каждом вызове возвращать следующее значение. Этого можно достичь введя переменную в классе, которая сохраняет предыдущее найденное значение:

var Inventory        InvCash;            //Для итератора

И использовать ее для нахождения следующего айтема в списке для поиска...

Для чего мне все это понадобилось? Для своей реализации инвентаря.

Инвентарь у Эпиков представляет собой обычный односвязный список. Естественно поиск в нем не быстр, естественно Инвентаря в нем много хранить нельзя (Эпики об этом прямо пишут). Более того, хоть это и возможно принципиально, но у Эпиков в инвентарь нельзя добавлять одинаковые предметы.

Ну а в ролевых играх в рюкзаке у героя очень много предметов, очень много одинаковых...

Как это реализовать? - сделать свою структуру для инвентаря. Я сделал комбинированную.

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

 

Рубрики:  3ds/UDK

Метки:  

Тултипсы

Пятница, 10 Декабря 2010 г. 14:40 + в цитатник

Сделал тултипсы к объектам. Появляются, когда ГГ смотрит на объект. Работают на всех типах объектов.

Работы еще много - главное на данный момент вывести его не где попало а чуть выше объекта. К сожалению разные типы имеют разные переменные высоты. К тому же у скелеталмешей почему-то боундинг в одном измерении значительно больше самого предмета... Вроде я алгорите придумал не зависящий от всего этого, 

но нужно проверять еще...

good (393x505, 28 Kb)
Рубрики:  3ds/UDK
MyGame

Метки:  

Камеры в УДК

Вторник, 07 Декабря 2010 г. 11:15 + в цитатник

В УДК есть две основные ветки классов камер:

Camera -> GamePlayerCamera -> ВашаКамера

GameCameraBase ->  GameThirdPersonCamera/GameFixedCamera -> Ваши реализации камер от третьего лица и фиксированной.

и одна дополнительная:

 GameThirdPersonCameraMode -> GameThirdPersonCameraMode_Default -> Ваша камера. В них просто уточняются характеристики камеры.

Есть еще класс CameraActor, представляющий физическое воплощение камеры в мире.

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

Где происходит перемещение камеры, настройка фокуса и т.п.

В GamePlayerCamera есть функция UpdateViewTarget. Там кроме прочего вызывается CurrentCamera.UpdateCamera. CurrentCamera изначально GameThirdPersonCamera (или Fixed).

Функция UpdateCamera в нем кроме прочего вызывает PlayerUpdateCamera. В GameThirdPersonCamera PlayerUpdateCamera пустая.Также UpdateCamera вызывает Pawn.CalcCamera. При использовании UTPawn все рассчеты производятся именно там. Что не очень удобно.

Какой нормальный процесс. Создаем класс производный от GameThirdPersonCamera (RPGTPS). В нем определяем UpdateCamera. Там просто переписываем все из GameThirdPersonCamera для вызова нашей PlayerUpdateCamera, которую тоже определяем в RPGTPS. Так приходится делать, т.к. UpdateCamera не виртуальная (можно попробовать переписать GameThirdPersonCamera - сделать UpdateCamera виртуальной, тогда ее не нужно будет снова писать  в нашем классе. Тогда придется и в GameCameraBase). В PlayerUpdateCamera производим все нужные нам рассчеты.

Однако все рассчеты удобнее проводить не в RPGTPS, а в классе производном от GamePlayerCamera. Почему? Потому что там есть многие нужные для рассчета переменные, которые, конечно можно достать и в RPGTPS, но это куча лишних вызовов... Поэтому в RPGTPS делаем простую "затычку", типа:
protected function PlayerUpdateCamera(Pawn P, GamePlayerCamera CameraAct, float DeltaTime, out TViewTarget OutVT)
{
    RPGPlayerCamera(PlayerCamera).UpdateThirdPCamera(P, CameraAct, DeltaTime, OutVT);
}

PlayerCamera - типа GamePlayerCamera, поэтому приходится преобразовывать к нашему типу. UpdateThirdPCamera - функция в RPGPlayerCamera, в которой и проводим все расчеты...

Внимание!

В  GamePlayerCamera есть ошибка. В:

protected function GameCameraBase FindBestCameraType(Actor CameraTarget)

нужно вместо:

    if (CameraStyle == 'default')

Сделать

    if (CameraStyle != 'default')
Иначе она будет возвращать None...


 


Без заголовка

Вторник, 23 Ноября 2010 г. 09:25 + в цитатник

Взаимодействие AS и US.
1. Как вызвать функцию US из AS.
В том кадре в котором это надо (если надо в нескольких кадрах, то во всех) в начале скрипта вставляем строку:
    import flash.external.ExternalInterface;
Тем самым мы подключаем библиотеку для работы с внешними приложениями.
Сам вызов производится так:
    ExternalInterface.call("OnPressNewGameButton");
В кавычках - имя функции, которая есть в US.
Например при нажатии на кнопку AS "New Game" будет вызываться функция US "OnPressNewGameButton", которая загружает начальный уровень игры консольной командой:
    function OnPressNewGameButton(GFxClikWidget.EventData ev)
    {
        PC.Player.Actor.ConsoleCommand("open Terra1", false);
    }

Ну, естественно в AS нужно на кнопку "New Game" повесить слушателя и связать его с функцией...
"Полный" код AS:
    import gfx.controls.ButtonGroup;
    import flash.external.ExternalInterface;
    function SendNewGameCommand() {
        ExternalInterface.call("OnPressNewGameButton");   
    }
    btn_NewGame.addEventListener("click", this, "SendNewGameCommand");
    stop();

Аналогично добавляем для остальных кнопок меню...
2. Как передать данные из AS в US.
Для начала добавляем на главное меню слой, в котором будем хранить все переменные.
Добавляем в первый кадр скрипт с переменными. Опции лучше всего сделать так:
    if (!options) {
        var options:Object = {};
    }

    var defScreen:Number = 2;
    var defBrightness:Number = 5;
    var defContrast:Number = 5;
    var defGamma:Number = 5;

    var defSpeak:Number = 5;
    var defMusik:Number = 5;
    var defSFX:Number = 5;
    var defAmbient:Number = 5;

    options.selectedScreen = (options.selectedScreen) ? options.selectedScreen : defaultScreen;
    options.Brightness = (options.Brightness) ? options.Brightness : defBrightness;
    options.Contrast = (options.Contrast) ? options.Contrast : defContrast;
    options.Gamma = (options.Gamma) ? options.Gamma : defGamma;

    options.Speak = (options.Speak) ? options.Speak : defSpeak;
    options.Musik = (options.Musik) ? options.Musik : defMusik;
    options.SFX = (options.SFX) ? options.SFX : defSFX;
    options.Ambient = (options.Ambient) ? options.Ambient : defAmbient;

тут мы сначала определили переменную - массив объектов (если ее еще не было). Далее заполнили массив начальными значениями (опять таки если их не было, то дефолтными)...

Выбор разрешения экрана у меня - это степпер CLIK-а, яркость и все остальное - слайдеры.
В кадре где выводится меня выбора опций в акциях добавляем в скрипт:
    stp_Screen.dataProvider = ["800*600", "1024*768", "1280*768", "1280*1024"];
    stp_Screen.selectedIndex = (options.selectedScreen) ? options.selectedScreen : defScreen;

    sld_Brightness.value = (options.Brightness) ? options.Brightness : defBrightness;
    sld_Contrast.value = (options.Contrast) ? options.Contrast : defContrast;
    sld_Gamma.value = (options.Gamma) ? options.Gamma : defGamma;

Здесь определяем набор разрешений экрана (текст, который будет выводиться на степпере) и задаем начальные значения.
Далее на каждую опцию соответствующую функцию:
    function SendBrightness() {
        options.Brightness = sld_Brightness.value;
        ExternalInterface.call("OnChangeGraphic");
    }

Меняем данные, которые может получить US и вызываем функцию US, которая собственно получает эти данные.
Ну и слушатели для каждой опции:
    sld_Brightness.addEventListener("change", this, "SendBrightness");
Разрешение экрана лучше не менять на лету, а менять только при выходе из меню. Т.е. для него функция слегка другая:
    function SendChangeScreen() {
        options.selectedScreen = stp_Screen.selectedIndex;
    }

Нужно еще две функции:
    function SetDefault() {
        stp_Screen.selectedIndex = defScreen;
    -----
        options.Gamma = defGamma;
        ExternalInterface.call("OnChangeGraphic");
    }

Установка опций по умолчанию. И:
    function ReturnToOptionsMenu2() {
        options.selectedScreen = stp_Screen.selectedIndex;
        options.Brightness = sld_Brightness.value + 0.001;
        options.Contrast = sld_Contrast.value + 0.001;
        options.Gamma = sld_Gamma.value + 0.001;
        gotoAndPlay("optionsmenu");
    }

Возврат в главное меню. Тут мы просто устанавливаем данные для получения в US и переходим в главное меню... Почему прибавляем  + 0.001 - не помню уже, но оно надо...
Чтобы в конце US мог получить эти данные при выходе из меню нужно вызвать спецфункцию:
    import flash.external.ExternalInterface;
    ExternalInterface.call("OnCloseAnimationComplete");
    stop();

Это в последнем кадре меню...
Теперь все это нужно в US получить...
Делаем функции:
    function OnChangeGraphic()
    {
        Brightness = 2.f - MainMC.outer.GetVariableNumber("options.Brightness") / 5.f;
        Contrast = 1.05f - MainMC.outer.GetVariableNumber("options.Contrast") / 10.f;
        Gamma = MainMC.outer.GetVariableNumber("options.Gamma") / 10.f;
        ChangeDisplayOption();
    }
    function ChangeDisplayOption()
    {
        local Player PP;
   
        PP = GetLP();
   
        PP.PP_HighlightsMultiplier = PC.PostProcessPresets[0].Highlights * Contrast * Brightness * 2.f;
        PP.PP_MidTonesMultiplier = PC.PostProcessPresets[0].MidTones * Brightness;
        PP.PP_ShadowsMultiplier = PC.PostProcessPresets[0].Shadows * ( 1.f - Contrast ) * Brightness * 2.f;
        PC.SetGamma(Gamma);
    }

.outer.GetVariableNumber - получает число от AS. MainMC - это GFxObject, который мы получили в функции Start так:
    MainMC = GetVariableObject("_root");
Яркость воздействует сразу на все тона картинки, контраст только на светлые тона и тени, увеличивая "расстояние" между ними.
Для громкости:
    function OnChangeAudio()
    {
        SoundSpeak = MainMC.outer.GetVariableNumber("options.Speak") / 10.f;
        SoundMusik = MainMC.outer.GetVariableNumber("options.Musik") / 10.f;
        SoundSFX = MainMC.outer.GetVariableNumber("options.SFX") / 10.f;
        SoundAmbient = MainMC.outer.GetVariableNumber("options.Ambient") / 10.f;
        ChangeAudioOption();
    }
    function ChangeAudioOption()
    {
        PC.SetAudioGroupVolume( 'SFX', SoundSFX );
        PC.SetAudioGroupVolume( 'Dialog', SoundSpeak );
        PC.SetAudioGroupVolume( 'Announcer', SoundSpeak );
        PC.SetAudioGroupVolume( 'Music', SoundMusik );
        PC.SetAudioGroupVolume( 'Ambient', SoundAmbient );
    }

 / 10.f - т.к. значения слайдера меняются от 0 до 10, а в US от 0 до 1.
PC - это UTPlayerController :
    var UTPlayerController PC;
    function bool Start()
    {
    ...
    PC = UTPlayerController(GetPC());
    ...
    }

Ну и разрешение экрана:
    function OnCloseAnimationComplete()
    {
        ScreenRes = MainMC.outer.GetVariableNumber("options.selectedScreen");
        switch(ScreenRes)
        {
            case 0:
                UT_ConsoleCommand("setres 800x600x32xw", true);
                break;
            case 1:
                UT_ConsoleCommand("setres 1024x768x32xw", true);
                break;
            case 2:
                UT_ConsoleCommand("setres 1280x768x32xw", true);
                break;
            case 3:
                UT_ConsoleCommand("setres 1280x1024x32xw", true);
                break;
            default:
                break;
        }
        UTGFxHudWrapper(GetPC().MyHUD).CompletePauseMenuClose();
    }


Передать в AS данные аналогично, только SetVariableNumber. Подробно пока писать не буду - закопался в DataProvider... Если кто видел нормальные уроки/описания по нему - укажите плиз...

Также еще один вопрос - по звукам в GFx меню. Как привязать звуки к нему я нашел:
Нужно просто в defaultproperties указать:
    SoundThemes(0)=(ThemeName=default,Theme=UISoundTheme'UDKFrontEnd.Sound.SoundTheme')
Тут я использовал стандартные звуки УДК, но можно создать свою тему.

3. Где все это прописывать

В UTGFxHudWrapper есть функция TogglePauseMenu - там прописано создание нового объекта класса меню
    PauseMenuMovie = new class'GFxUI_PauseMenu';

И установка его свойств. Там напрямую прописан клип, который вызывается по команде ShowMenu, забинденной на клавишу Esc.
Наследуешься от этого класса, прописываешь свой клип (Ну или просто в нем исправляешь на свой). После чего он будет вызываться при нажатии Esc. Ну а зная все это можно вызвать клип и любом другом случае...
Соответственно там прекрасно видно как обращаться с классом GFxUI_PauseMenu...
Вот в этом самом GFxUI_PauseMenu и прописаны все функции взаимодействия с AS, про которые я писал.

А вообще класс GFxMoviePlayer очень хорошо описан тут:
UDN
Там же ниже написано как вызывать функции AS из US и наоборот...

А вот как заставить УДК в меню воспроизводить музыку/ амбиент звуки/речь. Я найти не могу. Простое добавление:
    PC.ClientPlaySound(MenuMusic);
в лучшем случае включает музыку после выхода из меню. В самом меню музыки нет. Поэтому меняешь громкость музыки "на глазок". Она меняется, но насколько можно узнать, только выйдя из меню. Это ненормально!

На УДН по ссылке выше есть код для вызова звука из AS:

    if( _global.gfxProcessSound )
    {
         _global.gfxProcessSound(this, "SoundThemeName", "SoundEventName");
    }

Однако у меня это не работает - звук начинает проигрываться только после выхода из меню (GFxMoviePlayer)...
Кто сможет решить эту проблему?!?

Рубрики:  3ds/UDK

Метки:  

Великий Мо (триптих).

Вторник, 16 Ноября 2010 г. 08:30 + в цитатник

1. Не буди лихо…

Всем известно, что наша команда лучшая в королевстве. Поэтому когда нам заказали скипетр Великого Мо, никто не был удивлен. Да, конечно, он охраняется на славу, но нам по силам и не такие задачи. Подготовка заняла несколько дней. Все оказалось банально просто. Нужно было найти старого, выжившего из ума каменщика, который в молодости ремонтировал канализацию святилища и купить у него планы подземных ходов. Хоть он и не соображал почти ничего, но работу свою до сих пор помнил.
Скрытый ход вел прямо в самое сердце святилища. И вот мы с Сидом на месте. Скипетр лежал на постаменте в центре зала с высоким куполом. Кровь и пепел! Нас не предупредили, что он будет разобран. Четыре части – центральная палка, два крыла и набалдашник. Не люблю, когда заняты обе руки, мало ли что, вдруг придется драться… Так, это крыло вставляется сюда, это сюда…

- Прекрати сейчас же!

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

- Не-е-ет!!!

Посмотреть бы какой я стал со стороны! Я глянул на себя в зеркальную стену святилища. Что такое! Я своего обычного роста, только парю в воздухе, держась за медленно взмывающий к куполу зала жезл. От неожиданности я выпустил скипетр и тут же рухнул на пол с высоты метра два. Жрецы, не обращая на меня внимания, пытались достать жезл. В одной из дверей, с выпученными от страха глазами, кричал дряхлый старикашка:

- Не скипетр! Держите вора!!!

Ну, объяснять мне, когда пора делать ноги не нужно. Я метнулся к лазу. За портьерой, остолбенев, стоял Сид, повторяя как заведенный:

- Нет, нет, нет…

Я буквально внес его в потайной ход. Сзади орали, но, заглушая крики, поднимался какой-то вой. Мы не спустились, а просто упали в канализацию.

- Нужно закрыть крышку.
- Да пес с ней, уносим ноги.

Вой нарастал. Сверху показался один из жрецов с перекошенным лицом.

- Стой!...

Что-то с ним происходит странное. То ли от пережитого у меня в глазах все плывет, то ли его лицо на самом деле как-то поплыло… От воя закладывает уши. Теперь у нас обоих, похоже, ноги приросли к земле. Жрец исчез, его мантия летит на нас сверху. Падая, она зацепилась за крышку люка. Бац – люк захлопнулся. Мы погрузились в кромешную тьму. Сразу стало как-то на удивление тихо.

- Что это было?
- Какая разница. Пошли отсюда. Мне страшно. – У Сида от страха зуб на зуб не попадал. У меня тоже тряслись руки. Фонарь я зажег только с третьего раза.
- Что мы скажем нанимателю? – нервно спросил Сид.
- Ничего. Он должен был нас предупредить, что скипетр не просто безделушка, а нечто страшное.

* * *

Из катакомб мы вышли в другом месте – вблизи башни Солнца. Мое правило – никогда не возвращаться тем же путем.

- Что-то мне здесь не нравится.
- Да ладно, денег у нас много – можно и в столицу податься. – Сид попытался рассмеяться.
- Да нет, здесь, на улице, что-то не то. – Интуиция меня подвела только раз, когда я взялся за эту работу. Действительно на улице было необычайно тихо. Лишь издали, с ратушной площади, доносились странные хлюпающие звуки. Странно, на море не похоже, да и море в другой стороне.
- Никого…
- Что?
- Никого нет. Где все люди!? - По улице были разбросаны странные кучи тряпья, валялось оружие, перевернутая телега без лошади... Сида снова начало трясти.

На входе в башню Солнца валялись пустые доспехи стражников.

- Посмотрим на город сверху, с башни. Да и на саму башню я с удовольствием взгляну, когда еще представится такой случай – нет стражи. Говорят она изнутри вся из золота.

Враки все это. Да внутри красиво, но золота ни грамма.
Мы вышли на самый верх. Здесь странные звуки намного слышнее.

- Что это? Что это за гадость!? – голос Сида сорвался на писк.

На ратушной площади было нечто. Нечто огромное, аморфное, кроваво-красное. Оно постоянно меняло форму, выпускало какие-то отростки. По поверхности пробегали волны. В какой-то момент времени показалось, что поверхность приобрела форму жуткого перекошенного лица, с которого свисали кровавые ошметки. Рожа раззявила рот и растворилась в бесформенной каше.
Сида рвало.
Я начал понимать, куда все делись. Это нечто поглотило их.
Конечно, у нее не было ног, но впечатление было такое, как будто Тварь в нерешительности топталась на месте. Ищет новые жертвы?!

- Уходим, быстрее!

Сид не двигался с места. – Что это!!!

- Конец света…

2. Хранители Зиса.

В столицу мы притащились едва дыша. Денег не было. Какие там деньги, какой тайник! Ноги бы унести. Услышанные по дороге новости приводили в ужас. Все западное графство поглотил мрак. Оттуда не было никаких известий. Никто не приходил оттуда. Мы, конечно, не афишировали тот факт, что мы то смогли оттуда смыться. Иначе, прежде чем мы попали бы к дознавателям короля, нас разорвала жаждущая хоть каких-нибудь вестей толпа.
Не удивительно, что я не послушал свой внутренний голос, и взялся за первую же работу, хоть и не лежала у меня к ней душа. Итак, драгоценности Хранителей Зиса. Никто уже не помнил кто такой этот Зис, что охраняют Хранители? Они жили в своей башне, практически не общаясь с внешним миром. Драгоценности, так драгоценности. Я долго пытал нанимателя – нет ли в ничего волшебного, так что он начал посматривать на нас искоса.
Проникнуть в башню не составило никакого труда. Она и не охранялась вовсе. Вот и круглый зал, в котором нужно искать эти сокровища. Три статуи в нишах, три двери между ними. Мы, естественно, вошли не в дверь, а в окно. Где же эти сокровища?..
Странно, как-то становится светло. Опять!? Нет! Не хотел я идти сюда, - все проклятое безденежье.
Статуи светились голубоватым светом. Едва слышный шелест сложился в тихие слова.

- Ты пришел. Мы ждали тебя.

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

- Ты нужен Зис-сс-у. Только ты можешь спасти Зис-с-с.

Распахнулись двери. Яркий свет залил зал. Шелест исчез, сияние тоже. Нас окружили служители в голубых балахонах. Сид плакал лежа на полу.
Вперед выступил самый старый жрец.

- Ты собрал скипетр Великого Мо. Только ты можешь теперь разобрать его!
- Нет! Вы не заставите меня возвращаться в этот ужас!

Жрецы набросили на нас сеть. Спустя минуту мы были спеленаты по рукам и ногам.

- Какое Вам дело до этого Мо! Отпустите меня! Сидели сотни лет в своей башне – сидите дальше!
- Мы – Хранители Зиса. Мы обязаны его защищать.
- Кто вообще такой этот Ваш Зис?
- Зис – так называлась великая империя, на обломках которой возникли Ваши мелкие королевства. Вы все, хоть и жалкие, никчемные людишки, но Вы все – потомки великих людей Зиса. Мы – каста жрецов существуем тысячи лет, и все это время мы охраняли Ваш покой, не давая разгореться большим войнам, не давая возможности демонам войти в наш мир. Ты впустил сюда Великого Мо. Мы должны сделать все, чтобы изгнать его назад.
- Но хватит разговоров. Нужно торопиться, пока хоть кто-то остался цел. Твой долг – разобрать скипетр.

Назад, в западное графство… Ну почему я, за что мне все это…

3. Долг превыше всего.

Путь назад занял гораздо меньше времени. Ну оно и понятно – мы шли пешком, прячась по кустам при малейшем шорохе, а эти голубоплащники неслись на конях во весь опор, не смотря на мои мольбы прятаться от этого ужасного Мо. Сид остался в столице. Он не вынес всего этого. Когда я его видел, он выглядел полностью невменяемым.
И вот на горизонте показалась вершина башни Солнца. Скоро все закончится. Я уже смирился с мыслью о том, что мне суждено умереть. Не хочется только становиться кусочком страшной твари, хочется быть сожженным, как все нормальные люди, чтобы дым моего тела мог достичь небесного чертога.
Мы спешились. Насколько быстро мы двигались до сих пор, настолько медленно и осторожно шли теперь. Мо нигде не было видно, но моя интуиция говорила мне, что расслабляться рано. Он может появиться в любой момент.
В катакомбы мы вошли далеко за чертой города в развалинах старой крепости. Долгий путь в полутьме подошел к концу. Я снова стоял под той крышкой канализации, откуда вел проход в святилище. Вперед пошел один из жрецов. Теперь они берегли меня – ведь только я могу разобрать скипетр.

- Все чисто. Мо нет. – послышался сверху шепот.

Разгром в святилище поражал. Половины крыши не было, постамент перевернут, везде кучи щебня, стекла. И груды тряпья, когда-то бывшего одеждой…
Но посредине помещения, практически под самым куполом, висел в воздухе, медленно вращаясь, скипетр. В потоке поднимающегося теплого воздуха казалось, что он машет крылышками.

- Ну и как я туда доберусь, - прошептал я.

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

- Лезь! - приказал мне старший жрец.

Пот заливал мне лицо, руки не слушались. Боги, помогите мне, пусть Мо не придет, пожалуйста…
Я наверху. Нужно еще дотянуться до скипетра. Привяжу себя, чтобы освободить обе руки. Он еще и вращается, чтоб его… Все он у меня в руках. Немного передохну и…

- Быстрее!!!

Свет померк. Над крышей показался огромный бесформенный силуэт. Жрецы запели какие-то песнопения. У Мо открылся один жуткий, почему-то ярко-зеленый, глаз. Из него лился ядовитый мертвенно-бледный свет. Я оцепенел. Снова послышался тот же самый вой. Очертания жрецов стали расплываться.
С огромным трудом я все-таки сумел сбросить с себя наваждение. Где же эти проклятые крылья? Вот первый! Есть! Сверху раздался оглушительный рев, потекла кровь. Снизу вверх тоже поднималась кровь и ошметки мяса. Моя кровь! Я почему-то не чувствовал боли, но видел, как моя правая нога становится все тоньше и тоньше, а из под штанины вверх к Мо устремляется струйка крови.
Скорее!!! Второе крыло! Я торжествующе швырнул его вниз. Сверху кровь лилась сплошным потоком. Падали куски мяса, какая-то вонючая жижа. От непереносимой вони кружилась голова.
Набалдашник. Нет!!! Я не заметил, но моя левая рука практически исчезла! Я не смогу снять набалдашник – просто нечем! Есть – зубы! Взревев, я зубами впился в набалдашник. У меня не хватает сил!.. Здоровенный кусок мяса ударил меня по правой руке, выбив скипетр. Я торжествовал – набалдашник остался у меня в зубах.
Тотчас же меня пронзила несказанная боль. Остатки ноги и руки, казалось, горели пламенем. Сверху хлынуло все, что оставалось от Мо. Жрецы, или то, что от них осталось, давно были затоплены кровью и жижей. Я был весь в крови с ног до головы. Но я пока был жив! А Мо нет!!! Правда, как долго мне еще жить? Без руки, без ноги смогу ли я спуститься вниз? Как мне преодолеть озеро крови? Я выполнил свой долг. Люди спасены. Свет померк в моих глазах.
Это конец…

Рубрики:  misk

Метки:  

Терра, карты высот...

Понедельник, 15 Ноября 2010 г. 08:40 + в цитатник

В общем перенес я карту высот из Макса в УДК. Есть такой урок на unreal-level. Там все ОК, только не работает...

Там предлагают изменять оси развертки приналожении материала: UV, VW, UW. Так вот это у меня не работает и никогда не работало. Обходится достаточно просто. Накладывются две развертки в двух разных каналах. В 1-м канале как указано в уроке - Planar по z. Это для Render to Texture. Во 2-м канале Planar по y - это для наложения материала. В материале не забыть указать именно второй канал развертки.

Все остальное по уроку...

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

Поэтому я плюнул - взял меш терры, про который писал в предыдущей записи и подогнал терру УДК по ней. Все отлично получилось. Уже начал расставлять домики. Картинки на выложу - дома оставил

 

Возникла пара вопросов.

Во первых. Все объекты, перегнанные из Готики приблизительно в 2 раза больше чем надо (ориентируюсь по дверным проемам и стандартному персу УДК). Так вот вопрос - перс у нас все-равно будет другой - может лучше его подогнать под размеры остальных объектов, а не уменьшать все расставляемое на уровне в 2 раза?...

Во вторых. Не нравится мне расположение Ардеи. Ну что это задеревня рыбаков, которая находится за километр от моря? Она должна быть намного ближе к морю. Может переместить ее? Тогда куда поместить Лестера?

Рубрики:  3ds/UDK

Метки:  

Терра

Четверг, 11 Ноября 2010 г. 16:20 + в цитатник

Перенес я в УДК утес на котором стоит Ардея. Он по полигонажу не такой и большой - всего 45к трисов. Правда по размерам великоват. Вот он в Максе:

Там где голубые дырки стоят дом Ардеи.

Так вот УДК при просчете света на нем повесился...

Буду думать как это перенести в карту высот - может с родной террой УДК нормально работать будет...

Рубрики:  3ds/UDK

Метки:  

Глюки с развертками

Четверг, 11 Ноября 2010 г. 13:50 + в цитатник

В процессе работы выявились некоторые глюки с развертками.

 

УДК обязательно нужно или в 0-м слое UVW нормальную развертку, помещающуюся в квадрат 0-1 и без взаимных наложений частей, или специальный слой (обычно 1-й) с такими параметрами.

 

В Готике на всех предметах аж по 4 развертки, и ни одна не подходит под нужные параметры. Поэтому пришлось добавлять пункт 15 в сообщении ниже.

 

Однако из-за этого пункта на некоторых объектах появляется глюк в УДК - дополнительный материал, которго вроде нет в Максе. Т.е., например в Максе у нас на объекте мультиматериал из 2-х материалов. Переносим в УДК и видим там не 2, а 3 материала. Самое интересное, что это происходит не со всеми предметами. Убрать этот лишний материал вообще почти невозможно.

 

Я долго думал из-за чего такое возникает и обнаружил, что из-за UVWMapping. Вот буквально сейчас, наконец-то увидел этот лишний материал в Максе:

UnwrapChecker не должно быть. Его я не накладывал. Появляется он при наложении UVWMapping. Исчезает при сворачивании стека.

Сейчас попробую импортировать в УДК - отпишусь...

А вот и пофиг - после сворачивания стека все равно в УДК 3 материала!

Единственное решение - полностью создать объект с нуля. Слава богу таких объектов мало. У меня их пока 3 из сотни...

 

Рубрики:  3ds/UDK

Метки:  

Мысли по моей игре...

Вторник, 09 Ноября 2010 г. 15:10 + в цитатник

Не воспринимайте это как диздок, это просто идеи.
---------------------------------------------------------------------------------------------------------
Сразу скажу – я собираюсь описывать обычную РПГ, а не ММО. Возможно в будущем ее можно будет переделать в ММО, но я это не рассматриваю.

 

Одно из главных отличий игры – она сделана по известному миру, что привлечет фанатов. Они купят игру даже если она не удастся, хотя бы просто для коллекции.
Второе отличие – игрок до конца игры не прокачивается достаточно чтобы справляться с полчищами врагов в одиночку. Чтобы выполнить миссию игроку придется договариваться с НПС, образовывать с ними команды, и при этом не просто убивать всех подряд, а (возможно) красть нужные вещи, действовать хитростью…
Третье отличие – в игре не приветствуется убийство обычных НПС. Воровство вообще вполне возможно, хотя и сложно, а вот убийство должно быть практически невозможно. Для этого в каждом поселении есть охрана, некий род милиции, которая пресекает такие попытки на корню.

 

Место и время.
Полностью брать сюжет известной книги совершенно неинтересно. Вести какую-то параллельную линию очень сложно и не понравится почитателям книги. Поэтому действие будет происходить задолго до времени, описанном в книге.
Действие игры происходит в мире Роберта Джордана «Колесо Времени». Время действия – конец троллоковых войн, во время падения Манетерена. Подробно расписывать мир не буду – кому интересно, лучше прочитайте книги. Для незнакомых с миром далее в скобках буду указывать распространенные в иных мирах аналоги.
Начало игры (1 глава) – возле Кеймлина, который во времена Троллоковых войн не был столицей и назывался Хай Кеймлин.
Вторая глава – Тар Валлон. Третья глава – пограничье. Четвертая глава – пока не скажу.
Очень хочется после первой главы разветвление – вторая глава не просто в Тар Валоне, а в зависимости от конца первой главы в Тар Валоне или в Хай Кеймлине или в Тире. Соответственно этому разветвлению третья глава или в пограничье или в Аридоле (Шадар Логот) или в Майнелле (затем Танчико). Это, конечно, очень большая работа, поэтому пока будем говорить только о первой главе.

 

Цель.
Как и во многих РПГ цель игрока – «спасти мир». Однако здесь это несколько опосредовано. Известно, что последняя битва будет в самом конце эпопеи Джордана, так что убить темного нашему герою ну никак не удастся. Закончить Троллоковы войны напрямую тоже. Он просто должен убрать причину этих войн. Какую – пока раскрывать не буду – играть будет не так интересно. Заодно он создаст предпосылку победы в будущей Последней битве.

 

Главный герой.
Одно из затруднений создателей РПГ является то, что игрок совершенно не знаком с миром, в котором он очутился, и это нужно как-то логично объяснить в игре. Часто это решается тем, что герой – заключенный силой заброшенный в незнакомую провинцию (Готика, Морровинд). У нас герой - лудильщик (для тех кто не знаком с миром – аналог наших цыган). Он по понятным причинам не знаком ни с кем из живущих в округе. На его табор нападают троллоки (аналог орков и т.п.) и убивают всех родственников. Героя лечит Айз Седай (колдунья) и в оплату лечения просит доставить письмо в Тар Валон.

 

Первая Глава.
Местность в которой находится герой в начале игры оказывается отрезанной от окружающего мира. На самом деле идти можно куда угодно, но в округе бродит масса троллоков и других монстров, с которыми, исповедующий Путь Листа (Толстовское «непротивление злу насилием») и, естественно, не владеющий из-за этого оружием, лудильщик справиться не может. Можно уплыть на корабле, но его, естественно, просто так на борт не берут…
Значит задача первой главы выбраться из этой местности. Если игрок решит выполнить просьбу Айз Седай – то в Тар Валон. Для этого нужно или приобрести сильных друзей, способных пройти мимо орд троллоков, или как-то уговорить капитана корабля, или найти какой-нибудь иной путь…

 

Враги.
Поскольку в этом мире не так много рас, единственная возможность разнообразить врагов – разнообразие троллоков. Троллоки – козлы, троллоки – свиньи, троллоки – медведи… Плюс - мурдраалы. Плюс – «друзья темного». Плюс просто бандиты. Звери тоже «враги». Даже волки – хоть они и против темного, но герой с ними разговаривать не умеет, значит волки о нем ничего не знают, и когда хотят есть – могут на него напасть. Драгкар слишком сильная скотина, возможно их появление в последних главах. Есть еще Гончая тьмы. Она тоже сильна, и тоже будет в последних главах.
Можно вставить несколько тварей запустения, но немного, т.к. нигде не упоминается, что они выходили из запустения, даже в троллоковы войны. Вот здесь полный простор для фантазии. Также можно ввести тварей, которые водятся у Шончан – гролм.
Примеры троллоков (все рисунки не мои):


Мурдраал:


Драгкар:


Гролм:


Друзья темного – это люди, которые служат злу. Они самые обычные люди и ими может оказаться кто угодно вплоть до Айз Седай.

 

Друзья.
Здесь только две расы: люди и огир (не путать с орками).
С людьми все понятно.
Огир – древопевцы и строители. По этим показателям они аналоги эльфов. Но по внешнему виду на эльфов совершенно не похожи.


Боевая система.
Бои подобны Готике. Если найдется хороший аниматор, то желательно чуток сложнее движения. Упор нужно сделать не на сильную броню и оружие, а на овладение боевой системой (блоки, комбоудары и т.п.).

 

Прокачка.
У учителей узнается не просто новый уровень овладения оружием, а некий новый удар, блок или просто какой-то навык (например знахарство). При этом герой просто узнает о его существовании, но применить его может нормально с очень маленькой долей вероятности. Вероятность удачного применения навыка увеличивается при его применении – чем больше пытаешься применить удар, тем больше вероятность, что он удастся. Одновременно прибавляются некие очки опыта, которые можно потратить на изучение нового навыка. При выполнении квестов прибавляются другие очки опыта, которые можно потратить на увеличение силы, ловкости, харизмы…

 

Магия.
Наш герой не лжедракон, поэтому магия в полном объеме ему недоступна. Это, конечно обедняет игру, но тут ничего не поделаешь. Единственно, что может использовать герой – тер'андриалы (волшебные амулеты). Никто не запрещает использовать их и тем, кто не умеет направлять. В книге вроде такого нет, но это не означает, что такого нет вообще. Тер'андриалов должно быть немного, но они должны быть достаточно разнообразны. Зато у героя будут спутники – женщины, которые вполне могут быть Айз-седай.

 

Характеристики героя.
Уровень. Жизнь. Сила. Ловкость. Выносливость. Ум/мудрость. Харизма. Сила воли. Удача. Скорость.
У меня есть по всем параметрам некие мысли. Если кому интересно могу выложить.

 

Единственно скажу, что многие характеристики могут уменьшаться – это еще одно отличие от других игр, где уменьшаться может только здоровье.

 

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

 

Единственно по предметам. Очень мне не нравится во многих играх, что можно нести бесконечное число предметов. Здесь такого не будет. Будет ограничение как по числу предметов (которое можно немного обойти с помощью сумок и т.п.), так и по весу предметов (которое можно немного обойти с помощью вьючных животных).
--------------------------------------------------------------------------------------------------------------
Ну вот пока все. У кого появятся вопросы многое можно уточнить, расширить. Если кто заинтересуется, можно будет попробовать диздок написать хотя бы для первой главы.

 

Рубрики:  MyGame

Метки:  

Понравилось: 1 пользователю

Работа идет

Вторник, 09 Ноября 2010 г. 11:08 + в цитатник

Несмотря на некоторые выплывшие в процессе переноса тонкости работа продолжается. Всего перенесено 6 домов и 84 предмета. У всех настроены коллизии. Частично предметы не из Готики (сделанные мной).
Какие выявились тонкости:
Если есть на объекте прозрачность, то по краям могут появиться нежелательные полоски - артефакты. Они убираются установкой в текстуре не TA_Wrap, а TA_Clamp. Тогда текстура обрезается по границам квадрата 0-1, а не повторяется за его пределами. При этом необходимо, чтобы UV-развертка лежала в пределах этого квадрата. А в Готике она расположена "как левая нога захочет". Приходится слегка переделывать развертку.
На некоторых объектах почему-то риппер взял развертку явно со второго канала, где обычно лежит LightMap. У них приходится полностью переделывать развертку.
У дома на картинке ниже балки развернуты тяп-ляп. Просто наложен UVWMap с Box-ом. А балки сломанные. На изломах текстура сильно потянута получается. В игре, возможно, это незаметно, но мне режет глаза - пришлось переделывать...

 (640x582, 29Kb)

Рубрики:  3ds/UDK

Метки:  

Как переносим - 2...

Вторник, 02 Ноября 2010 г. 10:42 + в цитатник

Некоторые тонкости...
Все это, если на объекте один материал. Если же на объекте их несколько, то Риппер их разбивает на подобъекты по количеству материалов. Для каждого подобъекта проделываем все манипуляции с 1 по 14. Далее:
1. Выделяем все полигоны подобъекта. Назначаем id материала 2. У следующего 3 и т.д. У нас должны получится куча объектов с id от 1 до n.
2. Выбираем первый. Attach List. Выбираем все подобъекты. Соглашаемся с установками по умолчанию. (Match Material id to Material, Condense Material and Ids)
Далее делаем все начиная с 15 пункта...
 (640x480, 34Kb)

Рубрики:  3ds/UDK

Метки:  

Как переносим?

Вторник, 02 Ноября 2010 г. 10:28 + в цитатник

У Готики 3 так и не появилось модкита. Поэтому оттуда можно нормально выдрать только текстуры. Все меши приходится выдирать с использованием 3dRipper-а. Анимации выдрать вообще нельзя.

Итак - последовательность действий.
1. Запускаем через 3dripper готику. Приближаемся к интересующему нас предмету. Нажимаем F12. Рип сохраняется, после чего игра вылетает :(
Повторяем для всех нужных объектов...
2. Запускаем Макс. Находим рип. Загружаем. Удаляем все ненужное (прям как скульптор). Остается предмет, на котором невесть какие материалы.
3. Пипеткой берем материал с предмета. Это Multi/Sub-object материал. Ищем в нем подходящий материал для диффуза и нормалки. Они раскиданы по разным подматериалам. Обычно 3-4 сверху. Изредка бывает еще один подматериал для спекуляра.
4. Ищем в рипах текстур нужные текстуры диффуза и нормала - переносим их в свою папку контента игры.
5. С помощью компрессонатора от АТИ преобразуем их в tga, т.к. dds УДК не понимает. Если фотошоп понимает dds, то можно не преобразовывать, а просто в фотошопе сохранять в tga. У меня фотошоп 64х битный, и плагин от Нвидиа не подходит, поэтому приходится сначала преобразовывать в tga...
6. Если нашли спекулар - объединяем его с диффузом в фотошопе. Засовываем его в альфа канал.
7. В готике текстуры нормалей "упакованные". Отличие видно сразу - они зеленые, а не синие. Это, как я понимаю сделано для уменьшения занимаемого объема. Чтобы преобразовать их в нормальный вид переносим канал альфа в канал красного, а синий канал заливаем белым цветом. Если хочется, можно увеличить рельеф копированием слоя с наложением "перекрытие"...
8. В максе преобразуем предмет в EditPoly (Мне просто с ним удобнее работать). Велдим все вершины с Threshhold 0.001, чтобы получить нормальный меш.
9. Переносим Pivot в центр объекта.
10. Выравниваем объект по координатным осям.
11. Переносим его в начало координат.
12. Utils - ResetXform - Reset Selected. Сворачиваем стек модификаторов.
13. Еще раз переносим Pivot в центр объекта. И тут же сдвигаем в "точку крепления". Обычно это низ предмета. Так проще будет в УДК выставить его по вертикали.
14. Настраиваем группы сглаживания. Обычно достаточно нажать "AutoSmooth". Но нужно проконтролировать как лучше выглядит и, возможно оставить одну группу сглаживания...
15. Накладываем Unwrap UVW - меняем MapCannel на 2 - Edit. Выделяем все полигоны - Mapping - Flatten Mapping - OK. Это нужно для расчета карт освещенности в УДК.
16. Делаем простой объект, который заключает в себя наш. Чем проще, тем лучше. Что нужно избегать? - открытых ребер. Проверить можно модификатором STL Check. Этот простой объект будет коллизией. Для простых предметов - ящиков и т.п. его можно не делать. Называем этот объект UCX_имяпредмета. Например предмет - якорь с именем Anchor, тогда имя коллизии UCX_Anchor.
17. Сохраняем максовский файл на всякий случай, вдруг что переделать нужно будет.
18. Экспортируем предмет в ASE. Галочки должны стоять у:
Mesh Definition, Materials, Geometric, Mesh Normals, Mapping Coordinates
19. Заходим в УДК. Импортируем подготовленные текстуры. Импортируем меш.
20. Из текстур делаем материал. Накладываем материал на меш.
Наслаждаемся...
 (640x480, 25Kb)

Рубрики:  3ds/UDK

Метки:  

UDK

Вторник, 02 Ноября 2010 г. 09:14 + в цитатник
Долго я шел к этому. Все выбирал движки, даже начал писать свой. Ни один не удовлетворял полностью. У кого то графика отстой, у кого то цена сумасшедшая. Какой-то ну совсем не подходит. И вот месяца 3 назад все же выбрал...

Конечно, УДК тоже не совсем мне подходит. Он все же заточен на ФПС. Но его в принципе можно переделать. Самое главное - очень хорошая графика, потрясающие инструменты и первоначальная бесплатность.

Что я собираюсь делать?

Конечный итог - однопользовательская РПГ по своему сюжету, но по известному в литературе миру. Сюжет в общих чертах есть. Общая концепция игры смахивает на Готику...

Однако очень много времени уходит на изучение УДК, переделку его под РПГ. А еще ведь нужно сделать свой контент в огромном количестве...

Поэтому было принято решение - пока отложить свою игру в сторону. Чтобы ускорить хоть какой-то результат буду делать следующее:

Перенесу контент из Готики 3 в УДК. Сделаю небольшой кусок мира - Ардею. На этом контенте буду отлаживать скрипты, UI, диалоги и все остальное. Когда все это заработает так как я хочу - кину клич на форумах по привлечению людей в команду. Тогда начнем делать собственно мою игру.
Рубрики:  3ds/UDK

Метки:  

Поиск сообщений в seamanmur
Страницы: [1] Календарь