есть одна 2D карта (по зеленой кнопке)
но код для просчёта коллизий может обработать только 11 юнитов
(если играть всемером - то получится, что можно добавить только 4 доп.юнита на карту)
если сделать 12 или 50 юнитов - то варик просто захлёбывается
(в карте есть счетчик обработки коллизий - максимально 80000 операций в секунду)
есть желающие поковыряться в коде и улучшить его, чтобы он смог обрабатывать 50 юнитов?
коллизии - это столкновение. по X это толкание соседних юнитов вправо влево, по Y это носить на голове или стоять сверху на юните
код карты тут:
EN controlc.com/b12ac4e8
RU controlc.com/dcfc0814
цепочка функций по просчёту коллизий:
main - начало карты
Frame__init - инициализация кадра
Frame__Main - просчет одного кадра (частота 0.02)
Frame__PlayersGroup - просчет группы юнитов
Frame__SquaresMoving - движение юнитов
Frame__MovingY [b==false] - движение по Y
if MushroomMoving_RectCondition "UpWidthOM" + "DownWidthOM"  - сравнение ректов
MushroomMoving_CollisionCheck - проверка на коллизии
set otherx=GetUnitX(OrangeMushroom[j]) + set othery=GetUnitY(OrangeMushroom[j]) - считывание координат
графики:
скриншот карты:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
26
host_pi, насколько я помню Варкрафт просто не умеет в период меньше чем 0.01. На счёт коробок, их вобще по идее не нужно обновлять пер Фрейм. У них должно быть состояние активации и деактивации после применения к ним силы или падения.

У меня была похожая система в проекте. Но там еще была загвоздка с тем, что весь террейн был разрушаемый. По этому при разрушении клетки я искал объект на клетке и активировал ему физику на некоторое время пока он опять не оказывался в состоянии покоя.
14
Jack-of-shadow: Но там еще была загвоздка с тем, что весь террейн был разрушаемый. По этому при разрушении клетки
тут тоже самое, если кодом убрать под собой ландшафт, то все объекты полетят вниз пока не долетят до следующей твёрдой клетки
14
обновлено до версии 1.5
теперь полноценно можно заспавнить 50 коробок и мерять свои фепосы
EN xgm.guru/files/100/315886/comments/520926/OMS_BoxLab_1.5_EN.w3x
RU xgm.guru/files/100/315886/comments/520926/OMS_BoxLab_1.5_RU.w3x
код 1.5 controlc.com/fce08fe1
дальше уже только оптимизация кода для повышения фпс
Загруженные файлы
14
nazarpunk: На каждого юнита вызывается UnitIndex. Тоесть лишний цикл на количество игроков. Можно просто каждому грибу записать его индекс через SetUnitUserData. Будет дешевле
в версии 1.5 не вылечил это место, т.к. через SetUnitUserData и GetUnitUserData можно хранить только 1 значение на каждого юнита
и это значение уже занято в функции Propelly__Main
Propelly__Main
function Propelly__Main takes nothing returns nothing
	local integer i=1
	local integer j=1
	if GetUnitTypeId(GetTriggerUnit())=='orai' then
		loop
			exitwhen Propelly__CompareRect[i]==null
			if GetTriggeringRegion()==Propelly__Rects[i]then
				loop
					exitwhen j>Stage_BoxsCount
					if GetUnitTypeId(OrangeMushroom[PLAYER_MAXINUM+j])=='orai' and GetTriggerUnit()==OrangeMushroom[PLAYER_MAXINUM+j]and GetUnitUserData(GetTriggerUnit())!=i then
						call SetUnitUserData(GetTriggerUnit(),i)
						if Propelly__Angle[i]=="Left" then
							if GravityChanger_State==false then
								call SetUnitAnimation(GetTriggerUnit(),"Stand First")
							else
								call SetUnitAnimation(GetTriggerUnit(),"Stand Second")
							endif
							set LeftArrow[PLAYER_MAXINUM+j]=true
							set RightArrow[PLAYER_MAXINUM+j]=false
						elseif Propelly__Angle[i]=="Right" then
							if GravityChanger_State==false then
								call SetUnitAnimation(GetTriggerUnit(),"Stand Second")
							else
								call SetUnitAnimation(GetTriggerUnit(),"Stand First")
							endif
							set LeftArrow[PLAYER_MAXINUM+j]=false
							set RightArrow[PLAYER_MAXINUM+j]=true
						else
							set LeftArrow[PLAYER_MAXINUM+j]=false
							set RightArrow[PLAYER_MAXINUM+j]=false
						endif
						set gravity[PLAYER_MAXINUM+j]=Propelly__FlyGravity[i]
					endif
					set j=j+1
				endloop
				return
			endif
			set i=i+1
		endloop
	endif
endfunction

function Propelly__SetRect takes trigger t,integer i,rect r,real g,string a returns nothing
	set Propelly__Rects[i]=CreateRegion()
	call RegionAddRect(Propelly__Rects[i],r)
	set Propelly__FlyGravity[i]=g
	set Propelly__CompareRect[i]=r
	set Propelly__Angle[i]=a
	call TriggerRegisterEnterRegion(t,Propelly__Rects[i],null)
endfunction

function Propelly__init takes nothing returns nothing
	local trigger t=CreateTrigger()
	call Propelly__SetRect(t,1,gg_rct_PropellyMove001,10,"none")
	call TriggerAddAction(t,function Propelly__Main)
	set t=null
endfunction
буду искать какими способами можно хранить в юнитах числовую информацию
т.к. на тестах после замены UnitIndex(u) на GetUnitUserData(u) фпс поднялся в разы
например 40 фпс наступает не при -box1 20 , а уже при -box1 37
а если сделать две лесенки: -ladder2 20 + 30 раз -box - итого 50 коробок двумя лесенками - то будет 30 фпс
а в текущей версии на 50 коробках фпс упадёт до 0 из-за UnitIndex
nazarpunk: Очищать глобальную группу G дешевле, чем дрочить создание/удаление локалки.
потестировать это пока не удалось, т.к. коллизии всегда выдавали true и коробки проваливались - наверное неправильно очищал группу через дестрой, покурю ещё это место
Загруженные файлы
30
наверное неправильно очищал группу через дестрой
Глобальная группа очищается через ClearGroup.
14
nazarpunk: Очищать глобальную группу G дешевле, чем дрочить создание/удаление локалки.
Глобальная группа очищается через ClearGroup
исправлено, на фпс не сказалось, но код стал на несколько строк меньше
nazarpunk: На каждого юнита вызывается UnitIndex. Тоесть лишний цикл на количество игроков. Можно просто каждому грибу записать его индекс через SetUnitUserData. Будет дешевле.
после переработки UnitIndex и переноса номера юнита в его хп - количество фпс увеличилось в разы
теперь можно с 30 коробками бегать в 64 фпс
и даже заспавнить 50 коробок двумя лесенками на 30 фпс
подробности на графике
код 1.7 тут controlc.com/4bf12fa3
30
после переработки UnitIndex и переноса номера юнита в его хп - количество фпс увеличилось в разы
Не стал писать в вопросе, но для хранения данных именно на грибах идеально подойдут паралельные массивы по индексу игрока. В каждом отдельном месте выигрыша может быть незначительным, но в совокупности может зарешать.
14
nazarpunk: для хранения данных именно на грибах идеально подойдут паралельные массивы по индексу игрока
ага, там изначально вся инфа (кроме координат) и хранится в таких массивах - направление, нажатые стрелки, ускорение, гравитация, цвет, имя, коды, наблюдение, статус финиша, фон, музыка
30
ага, там изначально вся инфа
А как же проверка на самолётик? Её тоже лучше булевым флагом хранить.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.