Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GameDev лаборатория
DF2 :: ФОРУМЫ > Игровые форумы > Общий игровой форум
Axolotl
Еще одна тема, которую хорошо бы тут иметь. Моддинг одной игры очень часто перерастает в собственный проект. Да и на форуме несколько людей активно занимаются, занимались или хотят создать свою игру.

Чтобы не создавать пустую тему, кину инфу про пару тулзов , которые мне попадались и которые мне показались интересными.

Перове - плагин к фотошопу Pablo the Pixel Art Builder . Предназначен, чтобы облегчить создание изометрической графики. Сам его не пробовал, т.к. не мой путь, но по видео выглядит интересно. И сам способ необычный.

Второй тул - Sprite Delight (который, кстати, успешно собрал финансы на Кикстартере). Делает он такую штуку, как карты нормалей из 2д спрайтов, с возможностью твиканья и всяческих динамических тестов на лету. Нужно это для того, чтобы хоть как-то иметь возможность динамически освещать и применять эффекты для рисованной графики. Опять же, лично мне это не нужно, но для 2дшников польза точно есть.
Вот страница в Стим Гринлайт и вот, если интересно страничка кампании на Кике

И еще одна, встреченная мной штука Ferr2d для unity. Это интересно устроенный редактор уровней для 2д платформеров. Вот видео.
Axolotl
Вот, по поводу выхода Pillars Of Eternity, интересная статья (точнее ее перевод - там внизу есть ссылка на оригинал) - я думаю ей скорее место тут, нежели в теме про игру.

http://rutab.net/blogs/video-games/2014/06...-apdeyt-79.html

P.S. Не совсем я там правда понял про карту глубины - не такая же она должна быть. Из такой карты глубины и Flat Сolor Diffuse (тут это Альбедо называется) не выжать таких вот теней как на Final (или я чего-то недопонимаю), видимо еще должна быть одна карта с глобальной глубиной...хммм
AlexYeCu
Скриптовые мелочи, из тех, что сам использую.

Скрипт для создания базы данных инвентаря, который я написал для своего проекта. Требует для работы bash и
odt2txt. База заполняется в calc из состава Libre/Open Office (это второй фрагмент кода, каждая новая строка — ячейка в calc`овской строке), затем файлик скармливается скрипту и получается третий фрагмент, удобный для использования с движком love2d.

Код
#!/bin/bash
rm inv_db.lua
odt2txt inv_to_db.ods --output=inv.txt --width=-1
sed '/./!d' inv.txt > temp.txt
sed '1,13d' temp.txt > temp2.txt
sed 's/$/,/g' temp2.txt > temp3.txt
sed '1~13s/^/{/g' temp3.txt > temp4.txt
sed '13~13s/.$//' temp4.txt > temp5.txt
sed '13~13s/$/},/g' temp5.txt > temp6.txt
sed -i -e '1 s/^/inventory_ttx={\n/;' temp6.txt
sed -i -e '1 s/^/function inventory_load ()\n/;' temp6.txt
sed '$s/.$//' temp6.txt > temp7.txt
sed -i '$ a \}\' temp7.txt
sed -i '$ a \end\' temp7.txt
cp temp7.txt inventory.lua
rm inv.txt temp.txt temp2.txt temp3.txt temp4.txt temp5.txt temp6.txt temp7.txt
exit 0


Код
id=1
x=0,y=0,w=2,h=6
skill="sword"
class="sword"
subclass="longsword"
classtitle="меч"
subclasstitle="длинный меч"
title="Грубый меч"
a=1,b=4,c=3,atk=0
rt=30,range=7,clip=0
level=1,material=30,price=50,weight=1.2
quest=0,special=0,artifact=0,relic=0
story="Длинный меч, изготовленный по сварной технологии: две полоски дрянного, подверженного коррозии железа и стальная полоса между ними."


Код
function inventory_load ()
inventory_ttx={
{id=1,
x=0,y=0,w=2,h=6,
skill="sword",
class="sword",
subclass="longsword",
classtitle="меч",
subclasstitle="длинный меч",
title="Грубый меч",
a=1,b=4,c=3,atk=0,
rt=30,range=7,clip=0,
level=1,material=30,price=50,weight=1.2,
quest=0,special=0,artifact=0,relic=0,
story="Длинный меч, изготовленный по сварной технологии: две полоски дрянного, подверженного коррозии железа и стальная полоса между ними."}
}
end


Скрипты для вращения камеры в blender`е, для 6-и и 8-и направлений. Для использования необходимо создать объект с названием Rotor, привязать к нему камеру и, если надо, свет, подгрузить и выполнить скрипт. Обратите внимание на углы — они проектоспецифичны. Начальный угол вращения камеры по Z — 60°.

Код
import bpy
import mathutils
from math import radians

if "Rotor" in bpy.data.objects:
    obj = bpy.data.objects["Rotor"]
    obj.rotation_euler.z = obj.rotation_euler.z + radians(60.0)
    bpy.data.scenes[0].render.filepath = '/tmp/1'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(90.0)        
    bpy.data.scenes[0].render.filepath = '/tmp/2'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(120.0)  
    bpy.data.scenes[0].render.filepath = '/tmp/3'
    bpy.ops.render.render(animation=True)    
    obj.rotation_euler.z = obj.rotation_euler.z + radians(240.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/4'
    bpy.ops.render.render(animation=True)  
    obj.rotation_euler.z = obj.rotation_euler.z + radians(270.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/5'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(300.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/6'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = 0


Код
import bpy
import mathutils
from math import radians

if "Rotor" in bpy.data.objects:
    obj = bpy.data.objects["Rotor"]
    obj.rotation_euler.z = obj.rotation_euler.z + radians(60.0)
    bpy.data.scenes[0].render.filepath = '/tmp/1'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(90.0)        
    bpy.data.scenes[0].render.filepath = '/tmp/2'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(120.0)  
    bpy.data.scenes[0].render.filepath = '/tmp/3'
    bpy.ops.render.render(animation=True)    
    obj.rotation_euler.z = obj.rotation_euler.z + radians(240.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/4'
    bpy.ops.render.render(animation=True)  
    obj.rotation_euler.z = obj.rotation_euler.z + radians(270.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/5'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(300.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/6'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(0.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/7'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = obj.rotation_euler.z + radians(180.0)      
    bpy.data.scenes[0].render.filepath = '/tmp/8'
    bpy.ops.render.render(animation=True)
    obj.rotation_euler.z = 0


Скрипт для asymptote, расчерчивающий гексагональное поле.
Вроде бы работают варианты как со сплющённой, так и с обычной гексой, а также горизонтальный и вертикальный (см. закомментированные строки), но проверять лень — писалось давно, уже не помню. Если кто обнаружит неправильную работу — поправлю.

Код
import graph;
import settings;
outformat="png";
unitsize(1bp);
size(1000,1000, IgnoreAspect);
real dx=10;
real dy=40;
real w=64;
real hw=w/2;
real qw=w/4;
//real h=32;
real h=64;
real hh=h/2;
real qh=h/4;
for (int j=0; j <10; ++j){
dy =40 +j*h+j*10;
for (int i=0; i <10; ++i){
dx=10+i*w+i*10;
//vertical
//draw((dx,dy)--(dx+qw,dy+hh)--(dx+qw+hw,dy+hh)--(dx+w,dy)--(dx+qw+hw,dy-hh)--(dx+qw,dy-hh)--cycle);
//horizontal
draw((dx,dy)--(dx+hw,dy-qh)--(dx+w,dy)--(dx+w,dy+hh)--(dx+hw,dy+hh+qh)--(dx,dy+hh)--cycle);
}
}


Ещё один простенький скрипт для asymptote, генерит 2560x2560 портянку, расчерченую 32x32 клеточками.

Код
import graph;
import settings;
outformat="png";
unitsize(1bp);
size(2560,2560, IgnoreAspect);
real startx=0;
real starty=32;
real stepx=32;
real stepy=32;

for (int i=0; i <80; ++i){
draw((0,stepy*i)--(2560,stepy*i));
}
for (int h=0; h <80; ++h){
draw((stepx*h,0)--(stepx*h,2560));
}


Скрипт для ImageMagick, из кучи графических файлов вырезает квадратики 160x160, ресайзит их до 32x32 и склеивает в 6x8 портянку для анимации:

Код
sizew=0
sizeh=0
for file in $(ls)
do
convert $file -monitor -trim $file
convert $file  -background none -gravity Center -extent 160x160 $file
convert $file  -resize 32x32 $file
done
montage  *.png  -background none -tile 6x8  -geometry '32x32+0+0'  result.png
echo "done"
Guevara-chan
http://www.nosoapradio.us/ - очень неплохой сборник стоковой музыки для игр, допускается коммерческое использование.
Axolotl
Вчера вот случайно узнал о существовании такой вот чудной проги. Spine.

Оф.Сайт.

Видео:


Выглядит очень круто конечно. Т.е. это по сути 3D'шный подход обычной костевой/риговой анимации, но только для 2д и с какими-то хитрыми решениями на этот счет. Т.е. из того, что я распарсил по видео - там можно по слоям в глубину делать элементы и навешивать их на кости. Особенно показателен в этом плане момент с крыльями летающего зверя на 3:05. Ну и конечно нормальный риг, IK - все это в распоряжении.
Какая-то хитрая штука, которая эмулирует небольшие !Повороты! как будто это 3д. Та самая штука в видео, где с двумя няшами. Вот тут про это подробнее.

Чего я не понял, так это то, как именно организована штука с подменой элементов спрайтов, например на 2:37, где викинг поднимает-опускает руку. Примерно можно догадаться конечно, но хз.

Что еще супер супер круто, так это то, что итоговый результат можно экспортить не только в виде Спрайтщитов и.т.п, а в хитром формате, где хранятся только кусочки спрайтов и ключи костевой анимации. Т.е. можно вообще не заморачиваясь с итоговым объемом картинок делать длинные, плавные анимации для 2д спрайтов. Как я понял, всякие dll и описание как это все в код воткнуть прилагается.

Я хоть и не 2дшник и то офигел и крайне возбудился воодушевился - каково 2дшникам?

Еще обнаружил аналог (если я правильно понял он попроще в плане чудо фич, чем Spine)- Spriter
Но тоже может с костями, ригом, IK и.т.п

P.S. Кстати и Spine, и Spriter, а также, упомянутая в первом посте Sprite Delight - плоды Кикстартера.
Agar
Ладно, лень было полностью сейчас вникать, но выглядит интересно, да.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.