Что нового

[War Thunder] Нужны идеи по AIM

Ameno

Новичок
Сообщения
1
Репутация
0
Доброго дня.

Есть авиасимулятор http://warthunder.ru/
Ищутся идеи для AIM

Прицел на цель полупрозрачный и в разных местах, поймать какие-либо характерные пиксели не удалось
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
скрин маловат. В любом случае в памяти игры можно найти координаты цели и координаты игрока и далее по средством банальной геометрии свести их на одной прямой.
 

blacklis

Новичок
Сообщения
64
Репутация
1
В аркаде геометрия просчитывается в клиенте и выводится маркер упреждения, т.е. можно банально использовать пиксельсёч и искать этот кружочек, наводить прицел маусмувом и стрелять
а вот в истории маркера нет и требуется лезть в память и придумывать свой маркер с блекджеком и геометрией, и учитывая то, что на разных типах орудий разная скорость полёта снаряда и разное поведение самолётов в воздухе. И если для аркады написать аим - 10 минут, то для истории вопрос убегает на несколько тысяч рублей и в паблик он бесплатно не улетит:smile:. Да и для этой цели данный язык не является самым удобным.
Для рб все вообще крайне сложно, не каждый сможет САМ там летать, а не умея летать бота написать затруднительно, и даже если он будет летать, проще взломать сервера пентагона, чем научить его там адекватно стрелять.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Ameno
На мой взгляд следует "исследовать" сам процесс, а не изображение на экране.

Вам будет достаточно следующих данных:
XYZ(враг), XYZ(позиция камеры), Axis1-3, FOV.
(почитайте о проецировании и необходимых для этого данных в 3d играх).

И использовать функцию W2S(она конечно не универсальна, но концепция понятна).
Код:
Func __WorldToScreen1( ByRef $x, ByRef $y, $_vLocation, $_vOrigin, $_aFOV )
	Local $vTransform[3]

	Local $vLocal = _FVec_Subtract( $_vLocation, $_vOrigin )
    $vTransform[0] = _FVec_DotProduct( $vLocal, $_Axis[1])
    $vTransform[1] = _FVec_DotProduct( $vLocal, $_Axis[2])
    $vTransform[2] = _FVec_DotProduct( $vLocal, $_Axis[3])
	If $vTransform[2] < 0.1 Then _
		Return False

	$x = $_CenterX * (1 - ($vTransform[0] / $_aFOV[0] / $vTransform[2]))
	$y = $_CenterY * (1 - ($vTransform[1] / $_aFOV[1] / $vTransform[2]))

	Return True
EndFunc


И вам наверное пригодится еще моя библиотека:
Код:
Func _FVec_Addition( $vector1, $vector2 )
	Local $vector[3]

	$vector[0] = $vector1[0] + $vector2[0]
	$vector[1] = $vector1[1] + $vector2[1]
	$vector[2] = $vector1[2] + $vector2[2]
	Return $vector
EndFunc

Func _FVec_Subtract( $vector1, $vector2 )
	Local $vector[3]

	$vector[0] = $vector1[0] - $vector2[0]
	$vector[1] = $vector1[1] - $vector2[1]
	$vector[2] = $vector1[2] - $vector2[2]
	Return $vector
EndFunc

Func _FVec_Multiply( $vector1, $vector2 )
	Local $vector[3]

	$vector[0] = $vector1[0] * $vector2[0]
	$vector[1] = $vector1[1] * $vector2[1]
	$vector[2] = $vector1[2] * $vector2[2]
	Return $vector
EndFunc

Func _FVec_Divide( $vector1, $vector2 )
	Local $vector[3]

	$vector[0] = $vector1[0] / $vector2[0]
	$vector[1] = $vector1[1] / $vector2[1]
	$vector[2] = $vector1[2] / $vector2[2]
	Return $vector
EndFunc

Func _FVec_Distance( $vector1, $vector2 )
	Local $v = _FVec_Subtract($vector1, $vector2)

	Return _FVec_Length($v)
EndFunc

Func _FVec_CrossProduct( $vector1, $vector2 )
	If (UBound($vector1) = 2) Then
		Return ($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0])
	ElseIf (UBound($vector1) = 3) Then
		Local $v[3]

		$v[0] = ($vector1[1] * $vector2[2]) - ($vector1[2] * $vector2[1])
		$v[1] = ($vector1[2] * $vector2[0]) - ($vector1[0] * $vector2[2])
		$v[2] = ($vector1[0] * $vector2[1]) - ($vector1[1] * $vector2[0])

		Return $v
	EndIf
EndFunc

Func _FVec_DotProduct( $vector1, $vector2 )
	Local $v

	$v = $vector1[0]*$vector2[0]
	$v += $vector1[1]*$vector2[1]
	$v += $vector1[2]*$vector2[2]

	Return $v
EndFunc

Func _FVec_Normalize( $vector1 )
	If $vector1[0] = 0 And $vector1[1] = 0 Then _
		Return 0

	Local $v[2]
	Local $length = _FVec_Length( $vector1 )
	$v[0] = $vector1[0] / $length
	$v[1] = $vector1[1] / $length

	Return $v
EndFunc

Func _FVec_Length( $vector1 )
	Local $v, $i

	For $i = 0 To UBound($vector1) - 1
		$v += $vector1[$i] ^ 2
	Next

	Return Sqrt($v)
EndFunc


И на спроецированную точку уже наводить курсор мыши.
 

ExplodingBanana

Новичок
Сообщения
6
Репутация
0
Никто не задумывался над тем, что можно просто искать тескстурку сведения (кто играл, тот поймёт) на экране и двигать к ней мышку пока она не на текстурке?
 
Верх