Перейти к публикации
  • Сейчас на странице   Всего пользователей: 0   (0 пользователей, 0 гостей)

Rooster

Программирование, т. 7

  

536 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

кстати по-моему все достаточно компактно, читаемо и нету забора из скобок


я знаю точно что все телки которые красивые и которые любят ебаться, разбираются в часах

Но у меня нету часов, и хуевая ауди поэтому приходится дома дрочить

Поделиться сообщением


Ссылка на сообщение

всё хуйня

 

вот лучший способ индентации и расставления скобок

 

http://i.imgur.com/B9HxR5k.png

Поделиться сообщением


Ссылка на сообщение

ну так применяй на практике.

Поделиться сообщением


Ссылка на сообщение

всё хуйня

 

вот лучший способ индентации и расставления скобок

 

B9HxR5k.png

по-арабски

math.randomseed(os.time())
math.random(); math.random(); math.random()

говно блять


Публикация отключена

Поделиться сообщением


Ссылка на сообщение

мой код выглядит вот так  :sosew:

 

 

 

http://i.imgur.com/wh6gepp.gif 

bool AWalkingPlatform::UpdateBoundaries()
{
	if (GetWorld() && ActiveOverlapTriggers.Num() == 1)
	{
		bool bSuccessful = false;
		// Trace Params for lambda
			//global hit
		bool bHitOnce = false;
		//each individual hit
		bool bHitTrace = false;
		FVector previousHitLocation;
		FHitResult boundariesTraceHitResult(ForceInit);
		FHitResult wallTraceHitResult(ForceInit);
		FVector traceStart;
		FVector traceEnd;
		FCollisionQueryParams traceParams;
		traceParams.bTraceAsyncScene = true;
		const FCollisionQueryParams wallTraceParams = traceParams;
		const FCollisionShape shape = TraceShapeEnumFunctions::MakeShapeForTrace(TraceShapeType, TraceShapeSize);
		if (bDrawBoundarySearchTrace)
		{
			const FName traceTag("InitTraceTag");
			GetWorld()->DebugDrawTraceTag = traceTag;
			traceParams.TraceTag = traceTag;
		}
		//~Trace Params for lambda
			// Trace Routine Lambda
		auto TraceRoutine = [&](FVector InSideTraceStepOffset, FVector InSideStepTraceStep) -> bool
		{
			for (int32 i = 0; i < BoundaryTraceSideStepLimit; ++i)
			{
				boundariesTraceHitResult.Init();
				traceStart = GetActorLocation() + InSideTraceStepOffset * i;
				traceStart.Z = traceStart.Z + BoundaryTraceStartZOffset;
				traceEnd.Set(traceStart.X, traceStart.Y, traceStart.Z - BoundaryTraceLengthZ);
				// Trace Side to find is there are wall.e
				if (bCheckWallsOnBOundariesUpdate)
				{
					FVector smallEnd = TraceShapeEnumFunctions::GetExtent(shape, TraceShapeType);
					smallEnd.X = smallEnd.X + traceStart.X + 2.f * InSideStepTraceStep.X;
					smallEnd.Y = smallEnd.Y + traceStart.Y + 2.f * InSideStepTraceStep.Y;
					smallEnd.Z = traceStart.Z;
					bHitTrace = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult
						, FVector(GetActorLocation().X, GetActorLocation().Y, traceStart.Z), smallEnd
						, FQuat(), ECollisionChannel::ECC_Visibility, shape, wallTraceParams);
					if (bHitTrace)
					{
						if (bHitOnce)
						{
							return true;
						}
						else
						{
							return false;
						}
					}
				}
				if (TraceShapeType == ETraceShape::ETS_Line)
				{
					bHitTrace = GetWorld()->LineTraceSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, ECollisionChannel::ECC_Visibility, traceParams);
					if (bHitTrace)
					{
						previousHitLocation = boundariesTraceHitResult.Location;
						bHitOnce = true;
					}
				}
				else
				{
					bHitTrace = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, FQuat(), ECollisionChannel::ECC_Visibility, shape, traceParams);
					if (bHitTrace)
					{
						previousHitLocation = boundariesTraceHitResult.ImpactPoint;
						bHitOnce = true;
					}
				}
				if (!bHitTrace)
				{
					return bHitOnce;
				}
			}
			return false;
		};
		// Trace Left
		bSuccessful = TraceRoutine(LeftDirection * BoundaryTraceStepLength, LeftDirection * BoundaryTraceStepLength);
		if (bSuccessful)
		{
			LeftBoundary.SetNodeLocation(previousHitLocation + TraceResutlToBoundaryOffsetLeft);
			LeftBoundaryLocation = LeftBoundary.GetNodeLocation();
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(LeftBoundaryLocation);
			}
		}
		else
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			return false;
		}
		// Trace Right
		bHitOnce = false;
		bHitTrace = false;
		bSuccessful = TraceRoutine(RightDirection * BoundaryTraceStepLength, RightDirection * BoundaryTraceStepLength);
		if (bSuccessful)
		{
			RightBoundary.SetNodeLocation(previousHitLocation + TraceResutlToBoundaryOffsetRight);
			RightBoundaryLocation = RightBoundary.GetNodeLocation();
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(RightBoundaryLocation);
			}
			if (bDrawBoundaryLocation)
			{
				DrawDebugSphere(GetWorld(), LeftBoundary.GetNodeLocation(), 20.f, 12, FColor(255, 0, 0), false, BoundaryLocationDrawLifetime);
				DrawDebugSphere(GetWorld(), RightBoundary.GetNodeLocation(), 20.f, 12, FColor(0, 0, 255), false, BoundaryLocationDrawLifetime);
			}
			return true;
		}
		else
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			return false;
		}
	}
	else
	{
		return false;
	}
} 

 

 

Поделиться сообщением


Ссылка на сообщение

мой код выглядит вот так  :sosew:

 

 

 

http://i.imgur.com/wh6gepp.gif 

bool AWalkingPlatform::UpdateBoundaries()
{
	if (GetWorld() && ActiveOverlapTriggers.Num() == 1)
	{
		bool bSuccessful = false;
		// Trace Params for lambda
			//global hit
		bool bHitOnce = false;
		//each individual hit
		bool bHitTrace = false;
		FVector previousHitLocation;
		FHitResult boundariesTraceHitResult(ForceInit);
		FHitResult wallTraceHitResult(ForceInit);
		FVector traceStart;
		FVector traceEnd;
		FCollisionQueryParams traceParams;
		traceParams.bTraceAsyncScene = true;
		const FCollisionQueryParams wallTraceParams = traceParams;
		const FCollisionShape shape = TraceShapeEnumFunctions::MakeShapeForTrace(TraceShapeType, TraceShapeSize);
		if (bDrawBoundarySearchTrace)
		{
			const FName traceTag("InitTraceTag");
			GetWorld()->DebugDrawTraceTag = traceTag;
			traceParams.TraceTag = traceTag;
		}
		//~Trace Params for lambda
			// Trace Routine Lambda
		auto TraceRoutine = [&](FVector InSideTraceStepOffset, FVector InSideStepTraceStep) -> bool
		{
			for (int32 i = 0; i < BoundaryTraceSideStepLimit; ++i)
			{
				boundariesTraceHitResult.Init();
				traceStart = GetActorLocation() + InSideTraceStepOffset * i;
				traceStart.Z = traceStart.Z + BoundaryTraceStartZOffset;
				traceEnd.Set(traceStart.X, traceStart.Y, traceStart.Z - BoundaryTraceLengthZ);
				// Trace Side to find is there are wall.e
				if (bCheckWallsOnBOundariesUpdate)
				{
					FVector smallEnd = TraceShapeEnumFunctions::GetExtent(shape, TraceShapeType);
					smallEnd.X = smallEnd.X + traceStart.X + 2.f * InSideStepTraceStep.X;
					smallEnd.Y = smallEnd.Y + traceStart.Y + 2.f * InSideStepTraceStep.Y;
					smallEnd.Z = traceStart.Z;
					bHitTrace = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult
						, FVector(GetActorLocation().X, GetActorLocation().Y, traceStart.Z), smallEnd
						, FQuat(), ECollisionChannel::ECC_Visibility, shape, wallTraceParams);
					if (bHitTrace)
					{
						if (bHitOnce)
						{
							return true;
						}
						else
						{
							return false;
						}
					}
				}
				if (TraceShapeType == ETraceShape::ETS_Line)
				{
					bHitTrace = GetWorld()->LineTraceSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, ECollisionChannel::ECC_Visibility, traceParams);
					if (bHitTrace)
					{
						previousHitLocation = boundariesTraceHitResult.Location;
						bHitOnce = true;
					}
				}
				else
				{
					bHitTrace = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, FQuat(), ECollisionChannel::ECC_Visibility, shape, traceParams);
					if (bHitTrace)
					{
						previousHitLocation = boundariesTraceHitResult.ImpactPoint;
						bHitOnce = true;
					}
				}
				if (!bHitTrace)
				{
					return bHitOnce;
				}
			}
			return false;
		};
		// Trace Left
		bSuccessful = TraceRoutine(LeftDirection * BoundaryTraceStepLength, LeftDirection * BoundaryTraceStepLength);
		if (bSuccessful)
		{
			LeftBoundary.SetNodeLocation(previousHitLocation + TraceResutlToBoundaryOffsetLeft);
			LeftBoundaryLocation = LeftBoundary.GetNodeLocation();
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(LeftBoundaryLocation);
			}
		}
		else
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			return false;
		}
		// Trace Right
		bHitOnce = false;
		bHitTrace = false;
		bSuccessful = TraceRoutine(RightDirection * BoundaryTraceStepLength, RightDirection * BoundaryTraceStepLength);
		if (bSuccessful)
		{
			RightBoundary.SetNodeLocation(previousHitLocation + TraceResutlToBoundaryOffsetRight);
			RightBoundaryLocation = RightBoundary.GetNodeLocation();
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(RightBoundaryLocation);
			}
			if (bDrawBoundaryLocation)
			{
				DrawDebugSphere(GetWorld(), LeftBoundary.GetNodeLocation(), 20.f, 12, FColor(255, 0, 0), false, BoundaryLocationDrawLifetime);
				DrawDebugSphere(GetWorld(), RightBoundary.GetNodeLocation(), 20.f, 12, FColor(0, 0, 255), false, BoundaryLocationDrawLifetime);
			}
			return true;
		}
		else
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			return false;
		}
	}
	else
	{
		return false;
	}
} 

 

 

Ну и пиздец, не показуй больше такого

Поделиться сообщением


Ссылка на сообщение

Объяснись

Поделиться сообщением


Ссылка на сообщение

та что там объяснять, пизданул абы пиздануть

нормальный код

Поделиться сообщением


Ссылка на сообщение
(изменено)

офк лишь бы пиздануть

Вот это говно
 

 

if (bHitTrace)
{
if (bHitOnce)
{
return true;
}
else
{
return false;
}
}

 



можно сократить так

 

if (bHitTrace && bHitOnce)
{
return true;
}
return false;

 




Это ж элементарно
Имена переменных по 30 символов тоже крутяк, магические числа, куча вложенных if-else
Или это рили считается у вас нормальным кодом? :xd:


Изменено пользователем fessnik

Поделиться сообщением


Ссылка на сообщение

я согласен с тобой что в этом коде есть много моментов которые можно сделать лучше, но все равно этот код тянет на нормальный как по мне. код вполне читаемый и в принципе понятно что он делает

Поделиться сообщением


Ссылка на сообщение
(изменено)

я согласен с тобой что в этом коде есть много моментов которые можно сделать лучше, но все равно этот код тянет на нормальный как по мне. код вполне читаемый и в принципе понятно что он делает

Дефолтный код джуна, но я чет от этого "игродела и просто человека который пишет на нормально яп, а не на говняном js" ожидал большего.

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


Изменено пользователем fessnik
suez понравилось это

Поделиться сообщением


Ссылка на сообщение

ОДИН МЕТОД ДЛИННОЮ В ~150 СТРОЧЕК КОДА, С КУЧЕЙ IF ELSE И УРОВНЕМ ВЛОЖЕННОСТИ ДО 7 ДОПОЛНИТЕЛЬНЫХ ТАБУЛЯЦИЙ, КАРЛ!

НОРМ КОД

ВООБЩЕ ПИЗДЕЦ ПРОСТО НОРМ КОД НАХУЙ
Я конечно знал что тут в основном говноеды сидят, которым только дай повод про js потяфкать, но я думал поцаны хотя бы ебашут чуть лучше уровня джунов в самых задрипанных вебстудиях


userbar-53933.png

http://codepen.io/suez/ - they see me bydlocoding, they hatin.

Поделиться сообщением


Ссылка на сообщение

 

можно сократить так

if (bHitTrace && bHitOnce)
{
return true;
}
return false;

 

 

тут согласен, осталось после рефактора.

 

С именами переменных по 30 символов, лучше так чем 3 буквы, вон там же с bHitOnce & bHitTrace пришлось добавлять коммент ибо даже я начал путатся что они значат.

Куча вложеных if else считается нормальным если код именно то и делает, что ищет результат этих ifelse.

Я бы выслушал как убрать все эти вложенные ifelse когда этот код только для движка и там десяток флагов нужно проверять нужен ли разный функционал.

 

Что код делает

Это часть платформы, поиск границ, код сначала рейтрейсит в сторону чтоб узнать нет ли там стены, потом вниз, чтоб узнать есть ли там пол, если его нет, он проверяет был ли пол предыдущий раз и если он был, использует ту инфу чтоб поставить границу.

http://puu.sh/wWMyd.png На картинке, белые вертикальные полосы это дебаг сферы которые трейсят сверху вниз и ищут пол, краснеют когда находят, а синяя сфера это результат, граница. Потом по результатам этих границ указываются размеры и местоположение trigger volume, желтая рамочка, который и детектит игрока пересекающего границу.

Все это потом формирует сетку по которой АИ может вычислить где находится он, где находится его цель и стоит ли идти за ней, если да то как, можно ли тупо идти вперед, нужно ли будет прыгать и если нужно прыгать хватит ли ему текущей скорости и скорость которая будет когда он добежит до граници чтоб перепрыгнуть, если нет, тогда ищет куда бы ему отбежать чтоб разогнатся. http://i.imgur.com/wTU5e0a.mp4

 

 

В общем, я не вижу как код с таким множеством результатов и проверок ifelse, вон выше что аи делает глянь, можно сделать без этих ifelse, особенно учитывая все возможные флаги.

 

 

ОДИН МЕТОД ДЛИННОЮ В ~150 СТРОЧЕК КОДА, С КУЧЕЙ IF ELSE И УРОВНЕМ ВЛОЖЕННОСТИ ДО 7 ДОПОЛНИТЕЛЬНЫХ ТАБУЛЯЦИЙ, КАРЛ!

там 200 строк и внутри лямда первые 150 которая вызывается дважды

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

Поделиться сообщением


Ссылка на сообщение

 

 

Это часть платформы, поиск границ, код сначала рейтрейсит в сторону чтоб узнать нет ли там стены, потом вниз, чтоб узнать есть ли там пол, если его нет, он проверяет был ли пол предыдущий раз и если он был, использует ту инфу чтоб поставить границу.

 

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

Поделиться сообщением


Ссылка на сообщение

Можно и разобрать, но это ведь происходит вот тут 
 

				if (bCheckWallsOnBOundariesUpdate)
				{
					FVector smallEnd = TraceShapeEnumFunctions::GetExtent(shape, TraceShapeType);
					smallEnd.X = smallEnd.X + traceStart.X + 2.f * InSideStepTraceStep.X;
					smallEnd.Y = smallEnd.Y + traceStart.Y + 2.f * InSideStepTraceStep.Y;
					smallEnd.Z = traceStart.Z;
					bHitTrace = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult
						, FVector(GetActorLocation().X, GetActorLocation().Y, traceStart.Z), smallEnd
						, FQuat(), ECollisionChannel::ECC_Visibility, shape, wallTraceParams);
					if (bHitTrace)
					{
						if (bHitOnce)
						{
							return true;
						}
						else
						{
							return false;
						}
					}
				}

сам поиск пола вот 

				if (TraceShapeType == ETraceShape::ETS_Line)
				{
					bHitTrace = GetWorld()->LineTraceSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, ECollisionChannel::ECC_Visibility, traceParams);
					if (bHitTrace)
					{
						previousHitLocation = boundariesTraceHitResult.Location;
						bHitOnce = true;
					}
				}
				else
				{
					bHitTrace = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, FQuat(), ECollisionChannel::ECC_Visibility, shape, traceParams);
					if (bHitTrace)
					{
						previousHitLocation = boundariesTraceHitResult.ImpactPoint;
						bHitOnce = true;
					}
				}
				if (!bHitTrace)
				{
					return bHitOnce;
				}

и оба метода юзают одну и ту же переменную для хранения результата трейсов, как то было бы странно 15 строк, из которых половина это табуляци, в отдельную функцию выводить, которая всего лишь сабрутина.

Поделиться сообщением


Ссылка на сообщение

так так так что тут у нас
код ревью самого успешного гейм девелопера пд ахахахаха наканецта

Поделиться сообщением


Ссылка на сообщение

 

 

тут согласен, осталось после рефактора.
 

 

То есть после рефакторинга осталась такая какашка? Что ж было до?)

 

 

 

Куча вложеных if else считается нормальным если код именно то и делает, что ищет результат этих ifelse.
 

Где и кем это считается нормальным? В пхп за такое растреливают, а в "норм" языках это ок?

 

 

 

Я бы выслушал как убрать все эти вложенные ifelse когда этот код только для движка и там десяток флагов нужно проверять нужен ли разный функционал.
 
 

Я тебе показал как заменить два if else, на один if и поверь это не единственное место где можно убрать

Поделиться сообщением


Ссылка на сообщение
(изменено)
То есть после рефакторинга осталась такая какашка? Что ж было до?)

там был код который делал еще что то, я удалил его и то что осталось не трогал, не совсем рефактор.

 

Где и кем это считается нормальным? В пхп за такое растреливают, а в "норм" языках это ок?

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

 

 

bool AWalkingPlatform::UpdateBoundaries()
{
	if (GetWorld() && ActiveOverlapTriggers.Num() == 1)
	{
		bool bSuccessfulTraceRoutine = false;
		FVector traceHitResult(ForceInit);
		// Lambda for trace routine.
		auto TraceRoutine = [&](FVector& OutTraceRoutineHitResult, FVector InSideTraceStepOffset) -> bool
		{
			bool bTraceHit = false;
			bool bHitOnceBefore = false;
			OutTraceRoutineHitResult = FVector::ZeroVector;
			FHitResult boundariesTraceHitResult(ForceInit);
			FHitResult wallTraceHitResult(ForceInit);
			FVector traceStart;
			FVector traceEnd;
			const FCollisionShape traceShape = TraceShapeEnumFunctions::MakeShapeForTrace(TraceShapeType, TraceShapeSize);
			FCollisionQueryParams groundTraceParams;
			groundTraceParams.bTraceAsyncScene = true;
			FCollisionQueryParams wallTraceParams = groundTraceParams;
			if (bDrawBoundarySearchTrace)
			{
				const FName traceTag("InitTraceTag");
				GetWorld()->DebugDrawTraceTag = traceTag;
				groundTraceParams.TraceTag = traceTag;
				if (bDrawBoundarySearchWallTrace)
				{
					wallTraceParams.TraceTag = traceTag;
				}
			}
			else
			{
				if (bDrawBoundarySearchWallTrace)
				{
					const FName traceTag("InitTraceTag");
					GetWorld()->DebugDrawTraceTag = traceTag;
					wallTraceParams.TraceTag = traceTag;
				}
			}
			for (int32 i = 0; i < BoundaryTraceSideStepLimit; ++i)
			{
				boundariesTraceHitResult.Init();
				traceStart = GetActorLocation() + InSideTraceStepOffset * i;
				traceStart.Z = traceStart.Z + BoundaryTraceStartZOffset;
				traceEnd.Set(traceStart.X, traceStart.Y, traceStart.Z - BoundaryTraceLengthZ);
				// Trace sideways to find is there is a wall on the way.
				if (bCheckWallsOnBoundariesUpdate)
				{
					FVector wallTraceEnd = TraceShapeEnumFunctions::GetExtent(traceShape, TraceShapeType);
					wallTraceEnd.X = wallTraceEnd.X + traceStart.X + 2.f * InSideTraceStepOffset.X;
					wallTraceEnd.Y = wallTraceEnd.Y + traceStart.Y + 2.f * InSideTraceStepOffset.Y;
					wallTraceEnd.Z = traceStart.Z;
					bTraceHit = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult
						, FVector(GetActorLocation().X, GetActorLocation().Y, traceStart.Z)
						, wallTraceEnd
						, FQuat(), ECollisionChannel::ECC_Visibility, traceShape, wallTraceParams);
					if (bTraceHit)
					{
						break;
					}
				}
				// Trace for floor
				if (TraceShapeType == ETraceShape::ETS_Line)
				{
					bTraceHit = GetWorld()->LineTraceSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, ECollisionChannel::ECC_Visibility, groundTraceParams);
					if (bTraceHit)
					{
						OutTraceRoutineHitResult = boundariesTraceHitResult.Location;
						bHitOnceBefore = true;
					}
					else
					{
						break;
					}
				}
				else
				{
					bTraceHit = GetWorld()->SweepSingleByChannel(boundariesTraceHitResult, traceStart, traceEnd, FQuat(), ECollisionChannel::ECC_Visibility, traceShape, groundTraceParams);
					if (bTraceHit)
					{
						OutTraceRoutineHitResult = boundariesTraceHitResult.ImpactPoint;
						bHitOnceBefore = true;
					}
					else
					{
						break;
					}
				}
			} //for (int32 i = 0; i < BoundaryTraceSideStepLimit; ++i)
			if (bDrawBoundarySearchTrace || bDrawBoundarySearchWallTrace)
			{
				GetWorld()->DebugDrawTraceTag = NAME_None;
			}
			return bHitOnceBefore;
		};
		// Trace Left
		bSuccessfulTraceRoutine = TraceRoutine(traceHitResult, LeftDirection * BoundaryTraceStepLength);
		if (bSuccessfulTraceRoutine)
		{
			LeftBoundary.SetNodeLocation(traceHitResult + TraceResutlToBoundaryOffsetLeft);
			LeftBoundaryLocation = LeftBoundary.GetNodeLocation();
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(LeftBoundaryLocation);
			}
		} //bSuccessfulTraceRoutine
		else
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			return false;
		} // else bSuccessfulTraceRoutine
		// Trace Right
		bSuccessfulTraceRoutine = TraceRoutine(traceHitResult, RightDirection * BoundaryTraceStepLength);
		if (bSuccessfulTraceRoutine)
		{
			RightBoundary.SetNodeLocation(traceHitResult + TraceResutlToBoundaryOffsetRight);
			RightBoundaryLocation = RightBoundary.GetNodeLocation();
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(RightBoundaryLocation);
			}
			if (bDrawBoundaryLocation)
			{
				DrawDebugSphere(GetWorld(), LeftBoundary.GetNodeLocation(), 20.f, 12, FColor(255, 0, 0), false, BoundaryLocationDrawLifetime);
				DrawDebugSphere(GetWorld(), RightBoundary.GetNodeLocation(), 20.f, 12, FColor(0, 0, 255), false, BoundaryLocationDrawLifetime);
			}
			return true;
		} //bSuccessfulTraceRoutine
		else
		{
			LeftBoundary.Reset();
			RightBoundary.Reset();
			LeftBoundaryLocation = FVector::ZeroVector;
			RightBoundaryLocation = FVector::ZeroVector;
			if (LeftBoundaryGuideSphere)
			{
				LeftBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			if (RightBoundaryGuideSphere)
			{
				RightBoundaryGuideSphere->SetWorldLocation(GetActorLocation());
			}
			return false;
		} // else bSuccessfulTraceRoutine
	} //if (GetWorld() && ActiveOverlapTriggers.Num() == 1) 
	else
	{
		return false;
	}
}

 

 

вот текущий код.


Изменено пользователем CriErr

Поделиться сообщением


Ссылка на сообщение

офк лишь бы пиздануть

 

Вот это говно

 

 

if (bHitTrace)
{
if (bHitOnce)
{
return true;
}
else
{
return false;
}
}

 

 

 

можно сократить так

 

 

if (bHitTrace && bHitOnce)
{
return true;
}
return false;

 

 

 

 

Это ж элементарно

Имена переменных по 30 символов тоже крутяк, магические числа, куча вложенных if-else

Или это рили считается у вас нормальным кодом? :xd:

я бы сказал return bHitTrace && bHitOnce

HolyMalevolence и Kant понравилось это

Публикация отключена

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...