frigierim / ggj-tracking

Tracker for ggj-ng
0 stars 0 forks source link

Lo sprite del protagonista flippa solo sui lati "NSEO" #13

Open CristiJ92 opened 5 years ago

CristiJ92 commented 5 years ago

Lo sprite del protagonista flippa solo nelle direzioni nord sud est ovest, anche quando va in diagonale

Step: 1)Avvia il gioco 2)Play 3)Muoversi in diagonale

frigierim commented 5 years ago

Nel caso diagonale vogliamo degli sprite ruotati a multipli di 45 gradi?

CristiJ92 commented 5 years ago

No, lo sprite ruota in base alla rotazione dello stick

frigierim commented 5 years ago

Sistemato in https://github.com/frigierim/ggj-ng/commit/8ac95021d13a692972f4d0a7e58579d23f95599a

CristiJ92 commented 5 years ago

Sembra che il personaggio si muova solo a multipli di 45°, gdot non capisce di quanto ruotare o il gioco è programmato per muoversi in 8-ways?

frigierim commented 5 years ago

La seconda che hai detto :) Considerando che si può giocare sia con i tasti che con il pad, ho preferito mantenere allineata la gestione dello spostamento (non riuscirei a riprodurre la rotazione con angoli generici usando le frecce).

CristiJ92 commented 5 years ago

ho del codice che potresti riciclare dal progetto del corso di unreal che sto facendo... ti può essere utile? consiste nello sfruttare il dot product e il cross product dei vettori https://en.wikipedia.org/wiki/Dot_product https://it.wikipedia.org/wiki/Prodotto_vettoriale

ipotesi: gli stick restituiscono valori da -1 a +1 le frecce sono -1 e +1


TankMovementComponent.cpp: . . void UTankMovementComponent::IntendMoveForward(float Throw) { if (!ensure(LeftTrack && RightTrack))return; LeftTrack->SetThrottle(Throw); RightTrack->SetThrottle(Throw); }

void UTankMovementComponent::IntendTurnRight(float Throw) { if (!ensure(LeftTrack && RightTrack))return; LeftTrack->SetThrottle(Throw); RightTrack->SetThrottle(-Throw); }

void UTankMovementComponent::RequestDirectMove(const FVector& MoveVelocity, bool bForceMaxSpeed) { auto TankForward = GetOwner()->GetActorForwardVector().GetSafeNormal(); auto AIForwardIntention = MoveVelocity.GetSafeNormal(); auto ForwardThrow = FVector::DotProduct(TankForward, AIForwardIntention);// <== auto RightThrow = (FVector::CrossProduct(TankForward, AIForwardIntention)).Z;// <== IntendMoveForward(ForwardThrow);
IntendTurnRight(RightThrow); }


TankTrack.cpp . .

void UTankTrack::SetThrottle(float Throttle)//<== somma i vettori e limita range da -1 a+1 { CurrentThrottle = FMath::Clamp(CurrentThrottle + Throttle, -1, 1);// <== }

void UTankTrack::DriveTrack() { auto ForceApplied = GetForwardVector()CurrentThrottleTrackMaxDrivingForce; auto ForceLocation = GetComponentLocation(); auto TankRoot = Cast(GetOwner()->GetRootComponent()); TankRoot->AddForceAtLocation(ForceApplied, ForceLocation); }


si capisce qualcosa? XD

frigierim commented 5 years ago

Sì sì, si capisce, ma questo prevede un approccio diverso al movimento (legittimo, ma diverso). Fondamentalmente, l'asse verticale stabilisce la velocità, quello orizzontale la rotazione, e il prodotto dei due fornisce il vettore della direzione. Questo mi sta bene per un carro armato che è difficile da girare di 180 gradi istantaneamente :) Nel nostro caso, sospendo il giudizio, visto che non sono il game designer :P Se però decidiamo di andare per quella strada invece del banale 8-way che sto usando ora, posso modificare di conseguenza.

CristiJ92 commented 5 years ago

Lasciamo pure in sospeso per ora, l'ideale sarebbe avere una rotazione lineare prima del MVP.

il codice te lo avevo lasciato come spunto per ovviare il problema dei tasti della tastiera visto che in questo modo ad unreal non gliene frega niente se l'input viene da tastiera o pad visto che le tratta nella stessa maniera

CristiJ92 commented 5 years ago

Direi di sistemare questo issue per il MVP

CristiJ92 commented 5 years ago

aggiornato il gdd: image il commit lo farò più tardi assieme agli altri aggiornamenti gdd da fare