再起動
作ったものをある程度きちんとした形で公開する気が出てきたので、いろいろ整備中。
作ったものをある程度きちんとした形で公開する気が出てきたので、いろいろ整備中。
UE4のWigetのButtonに、マウスカーソルが重なったときに呼ばれるOnHoveredのデリゲートがあるが、 これはPlayerController->bShowMouseCursor=false になっていてマウスが隠れている場合呼ばれない。 Buttonの見た目も変わらない。
FVector2D USTGBButton::GetSelectLocation_Implementation() const { const FTransform2D ButtonTrans_DisplaySpace = GetCachedGeometry().ToPaintGeometry().GetAccumulatedRenderTransform(); const FVector2D ButtonNW_DisplaySpace = ButtonTrans_DisplaySpace.GetTranslation(); const FTransform2D WindowTrans_DisplaySpace = OwnerWidget->GetCachedGeometry().ToPaintGeometry().GetAccumulatedRenderTransform(); const FVector2D WindowNW_DisplaySpace = WindowTrans_DisplaySpace.GetTranslation(); const FVector2D ButtonNW_CanvasSpace = ButtonNW_DisplaySpace - WindowNW_DisplaySpace; const FVector2D ButtonSize = GetCachedGeometry().ToPaintGeometry().GetLocalSize() * ButtonTrans_DisplaySpace.GetMatrix().GetScale().GetVector(); return ButtonNW_CanvasSpace + ButtonSize/2; } こんな感じで取得する。 マウス位置を取得するときはウィンドウ内の描画位置を基準とする空間なのに、 GetCachedGeometry().ToPaintGeometry().GetAccumulatedRenderTransform() で取得するウィジェット位置はディスプレイの描画位置を基準とする空間であることに注意。
偏差射撃の実装について 目標 自機が移動する的に当たる弾を発射するために、適切な発射方向を計算する。 定義 太字の英数字はベクトル(e.g. $\mathbf{a}$). 位置$A$と$B$があったとき、$AB$は$A$から$B$へのベクトル。 $|\mathbf{a}|$はベクトル$\mathbf{a}$の長さ。 設定 自機と的がある。 自機は原点Oから弾速sの弾を発射し、 的は位置Lから速度$\mathbf{v}$で移動する。 $l := |OL|,$ $\theta :=$直線$OL$と$\mathbf{v}$の成す角度$(0 \le \theta \le 180[deg]).$ 結果 弾を発射してから着弾するまでの時間$t$について、 $$t = \frac{l}{\pm s\sqrt{1-(\frac{|\mathbf{v}|}{s} \sin \theta)^2} - |\mathbf{v}|\cos \theta}.$$ となる。 $t \ge 0$のとき、弾が命中するときの的の位置は$L + \mathbf{v}t$であり、そこに向けて弾を撃てば命中する。 $t$が求められない場合や$t$が負である場合、どの方向に弾を撃っても的に当たらない。 計算 弾が発射され、時間$t$後に的に当たるときの位置を$P$とする。 このとき、 $$|OP| = st, |LP| = |\mathbf{v}|t.$$ $OL \perp PQ$となり、線分$OL$上にある位置$Q$を設定する。 $\angle POQ$の角度を$\theta’$とする。 $O, Q, L$は直線状にあるので、 $$|OQ + LQ| = |OL|$$ $$<=>st\cos\theta’ - |\mathbf{v}|t\cos\theta = l.$$ また、 $$|PQ| = st\sin\theta’ = |\mathbf{v}|t\sin\theta$$ $$<=> 1 - \cos^2\theta’ = \left(\frac{|\mathbf{v}|}{s}\sin\theta\right)^2$$ $$<=> \cos\theta’ = \pm\sqrt{1 - \left(\frac{|\mathbf{v}|}{s}\sin\theta\right)^2}.