DOONFOREVER Нужен скрипт для этого.
можно через ACS и через zscript.
ACS легче так что:
Скрытый текст:
#include "zcommon.acs" //обязательно пишем сперва
//Это затенение работает только с одним объектом с тегом 1.
Script "FadeScreen" ENTER { //Скрипт тест-эффект затенения экрана
int limitradius=128.0; //пусть затенение будет когда тот на расстоянии меньше 128 маппикселей...
while(1) {
//алгоритм для нахождения уровня затенения экрана, т.е. чем ближе объект тем темнее экран
int fadeamount = -fdistance(0,1) + limitradius;
if(fadeamount<=0) fadeamount=0; //число (меньше или равно 0) не допустим
else fadeamount = FixedDiv(fadeamount,limitradius); //"превращаем" дистанцию в уровень (от 0 до 1.0)
//теперь у нас есть число(уровень), затеняем им наш экран (можно и в других целях пользоваться)
FadeTo(0,0,0,fadeamount,0); //0,0,0 - Full Black. fadeamount - наше число. 0 - затеняем мгновенно.
Print(f:fadeamount); //можешь это удалить!
Delay(1); //обновление экрана...
}
}
//поле для функции
/*
Взято с zdoomwiki
Эта функция нужна чтобы определять расстояние между объектами (точками)
fdistance(tid1, tid2)
tid1 - Первый ACTOR
tid2 - Второй ACTOR
Функция возвращает расстояние между ними
*/
function int fdistance (int tid1, int tid2)
{
int len;
int y = getactory(tid1) - getactory(tid2);
int x = getactorx(tid1) - getactorx(tid2);
int z = getactorz(tid1) - getactorz(tid2);
int ang = vectorangle(x,y);
if(((ang+0.125)%0.5) > 0.25) len = fixeddiv(y, sin(ang));
else len = fixeddiv(x, cos(ang));
ang = vectorangle(len, z);
if(((ang+0.125)%0.5) > 0.25) len = fixeddiv(z, sin(ang));
else len = fixeddiv(len, cos(ang));
return len;
}
, благодарю , но вот ещё вопрос , можно ли вместо затемнения использовать спрайты (несколько) или хотя б менять цвет с белог на чёрный за 1 тик, такое возможно?
Народ помогите разобраться - вопрос по бессмертию в думе:
В моей модификации есть несколько типов бессмертия, в которых собственно отличия в длительности этого самого бессмертия и то, что его дает игроку. Так вот если, например, игрок подобрал Берсерк сферу - получил бессмертие скажем на 15 секунд, а через 10 секунд подобрал другую сферу бессмертия (например классическую), то происходят чудеса: ПО идее во время взятие повторно бессмертия, второе должно заменить первое, но этого не происходит, более того, ПЕРВО-взятое остается в силе до своего конца, а когда заканчивается, то игрок становится !уязвим! несмотря на то что еще действует другой тип бессмертия (это показывает реверс цветов или иконка). Кто знает в чем дело?
ADD: попытка в стейте PICKUP забрать бессмертие и снова давать новое вообще не дает результата, т.к. A_TakeInventory по какой-то причине не может забрать данный поверап...
Нужна помощь , как сделать револьвер , где после 2х выстрелов , в барабане осталось 2 и заряжаеться 2 , 3 и 3 , и так далее . То есть чтобы заряжалось столько сколько потратилось . Я пытался но что то я не то сделал .
Скрытый текст:
actor revol : Ammo
{
inventory.maxamount 8
inventory.icon "MG34Ammo"
}
Actor RevolAmmo : Ammo 6709
//$Category ammunition
{
SCALE 0.05
inventory.amount 8
inventory.maxamount 200
inventory.pickupsound "pickups/pistolammo"
inventory.pickupmessage "Picked up G36K ammo."
inventory.icon "clipa0"
states
{
Spawn:
MG3M A 1
loop
}
}
Actor Revolver : weapon 7062
//$Category weapons
{
scale 0.07 //0.07
//spawnid 239
Weapon.SlotNumber 2
weapon.kickback 800
weapon.selectionorder 600
weapon.ammotype1 "Revol"
weapon.ammogive1 8
weapon.ammouse 1
weapon.ammotype2 "Revolammo"
weapon.ammogive2 1
obituary "%o ate %k' s Revolver!"
+WEAPON.NOAUTOAIM
-WEAPON.NOALERT
+WEAPON.NOAUTOFIRE
+WEAPON.AMMO_OPTIONAL
+WEAPON.NO_AUTO_SWITCH
//(WRF_ALLOWRELOAD)
states
{
spawn:
MG3S A 1
loop
ready:
REVG A 1 A_weaponready(WRF_ALLOWRELOAD)
null A 0 A_jumpifinventory("revol",0,"reload")
loop
deselect:
REVG A 1 A_lower
loop
select:
REVG A 1 A_raise
loop
fire:
Fire:
TNT1 A 0 A_JumpIfInventory("revol",1,2)
Goto Reload
TNT1 AAAA 0
REVF A 1 A_FireBullets(0.3,0.3,1,random (100,200),0,0,0)
TNT1 A 0 A_takeinventory("revol",1)
REVF BC 1
REVF A 0 A_refire
goto Ready
Reload:
NULL A 0 A_JumpIfInventory("revol", 0, "Ready")
NULL A 0 A_JumpIfInventory("revolAMMO",7,7)
goto ready
REVR ABCDEFGHI 4 //кадры одинаковые до начала зарядки
//здесь кадры соответственно reload1 , reload2 , т д
REVE ABCDEFG 4 //после зарядки
goto reload7
TNT1 A 0 A_jumpifinventory("revol",6,"reload7")
goto reload6
TNT1 A 0 A_jumpifinventory("revol",5,"reload5")
goto reload5
TNT1 A 0 A_jumpifinventory("revol",4,"reload4")
goto reload4
TNT1 A 0 A_jumpifinventory("revol",3,"reload3")
goto reload3
TNT1 A 0 A_jumpifinventory("revol",2,"reload2")
goto reload2
TNT1 A 0 A_jumpifinventory("revol",1,"reload1")
goto reload1
TNT1 A 0 A_jumpifinventory("revol",0,"reload8")
goto reload8
reload7:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",0,1)
goto ready
REVD ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",1)
TNT1 A 0 A_giveinventory("revol",1)
REVE ABCDEFG 2
goto ready
reload6:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",1,2)
goto ready
REVM ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",2)
TNT1 A 0 A_giveinventory("revol",2)
REVE ABCDEFG 2
goto ready
reload5:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",2,3)
goto ready
REVN ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",3)
TNT1 A 0 A_giveinventory("revol",3)
REVE ABCDEFG 2
goto ready
reload4:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",3,4)
goto ready
REVB ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",4)
TNT1 A 0 A_giveinventory("revol",4)
REVE ABCDEFG 2
goto ready
reload3:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",4,5)
goto ready
REVV ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",5)
TNT1 A 0 A_giveinventory("revol",5)
REVE ABCDEFG 2
goto ready
reload2:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",5,6)
goto ready
REVC ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",6)
TNT1 A 0 A_giveinventory("revol",6)
REVE ABCDEFG 2
goto ready
reload1:
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",6,7)
goto ready
REVX ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",7)
TNT1 A 0 A_giveinventory("revol",7)
REVE ABCDEFG 2
goto ready
reload8: //осталось 0
TNT1 A 0 A_JumpIfInventory("revol", 0, "Ready")
TNT1 A 0 A_jumpifinventory("revol",7,8)
goto ready
REVZ ABCDEFGHI 4
TNT1 A 0 A_Takeinventory("revolammo",8)
TNT1 A 0 A_giveinventory("revol",8)
REVE ABCDEFG 2
goto ready
}
}
YURA_111 Всю жизнь так было. В думе поверапы кривоватые. Если ты один и тот же итем юзаешь, тогда время обновляется, а разными — нет. Тут только через зскрипт переделывать, как мне кажется.
Насчёт зскрипта.
Есть ли там какой-нибудь нормальный отладочный вывод, который можно вызвать не из актора, а из какого-то другого класса (то есть, A_Log отпадает)?
В gzdoom.pk3 тоже копался.
Когда ждать полную документацию?
Console.Printf(). Формат такой же, как у сишного принтф-а. Например, Console.Printf("int: %02d", 4).
Подробнее про поддерживаемые форматы https://zdoom.org/wiki/String#Static_methods
ZZYZX Спасибо большое.
Поиск выдаёт 1 результат, немудрено, что сам не заметил. Вот пока не будет документации, каждую минуту кто-нибудь не посвящённый во внутренности разработки GZ, вроде меня, будет задавать дурацкие вопросы
ADD:
Дверь-полиобъект не блокирует звук?
Есть некий способ на сегодняшний день блокировать звук как это делает обычная дверь, который проще, чем описан здесь?:
https://forum.zdoom.org/viewtopic.php?f=18&t=37177
MyNameIs Спасибо, но АЦС не использую вообще. Может быть есть другие варианты?
YURA_111 вроде можно с помощью Line_SetBlocking сделать, чтобы линия звук не пускала.
через ацс проставить тайминги, чтобы совпадало с дверью и должно получиться
YURA_111 Ну, а принципе можно сделать двухслойную кнопку (если кнопка на стене, поставить у линии активатора pass use (вроде так, не помню точно), чтобы за этой линией можно было бы поставить вторую. Чтобы две линии одновременно срабатывали.
И на второй делаешь очень быстрое открытие/закрытие нормальной двери, которая бы находилась внутри полиобъектной.
А почему кстати не используешь ацс? Раз гоззофичи вроде полиобъектов используешь
Есть - пришлось создать "сектора-паразиты" с "Блок-Соунд".
MyNameIs:
А почему кстати не используешь ацс?
"Out of Synchronization" тебе не о чем не говорит?
Моя модификация Мультиплеерная, а скриптинг на основе АЦС очень часто давал вышеописанный лаг, что ооочень бесило (и по началу было даже не понятно из-за чего это происходило).
Что говорить - возьми АЕОД и запусти в мультиплеере - интересно сколько секунд ты успеешь сыграть без разсинхронизации... Мой мод больше чем АЕОД - и данная хрень вылезает не раньше чем раз в месяц (АЦС у меня тоже есть, но только те от которых избавиться не удалось и связанные непосредственно с двумя Мапами).
ZScript - вот это совсем другое дело, но это такой темный лес для меня, что я даже не пытаюсь понять...
Есть класс, в нём динамический массив. При Push(...) пытается записать в NULL и, естественно, вылетает.
Каким образом (видимо, new("Array<...>")) и, главное, когда выделяется память под эти массивы? Нужно это делать вручную? Тогда как, конструктор же в zscript нельзя определить?
Массивы НЕ нужно создавать руками. Если он не создаётся, то либо ты не создал объект к которому обращаешься, либо это баг и зарепорть его.
Или возможно ты пытаешься впихнуть невпихуемое, а движок почему-то ничего не написал. Но тогда это тоже баг.