есть одна 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]) - считывание координат
графики:
скриншот карты:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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
ага, там изначально вся инфа
А как же проверка на самолётик? Её тоже лучше булевым флагом хранить.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.