2016-06-20 28 views
2

Für ein Minecraft-Projekt wollte ich den Spieler Gesicht (0, 60, 0) allmählich. Bisher scheint alles, was ich versucht habe, zu versagen, wenn der Spieler sich mehr als 720 ° bewegt (0, 60, 0).Minecraft Modding ändern Richtung des Spielers allmählich

Hat jemand eine Idee, wie man die Kamera nahtlos zu (0, 60, 0) bewegt?

Vielen Dank!

Hier ist mein Code so weit (die in einer Schleife läuft, wenn getoggelt):

int x = 0; 
int y = 60; 
int z = 0; 

player = Minecraft.getMinecraft().thePlayer; 

double dirx = player.posX - 0; 
double diry = player.posY - 60; 
double dirz = player.posZ - 0; 

double len = Math.sqrt(dirx*dirx + diry*diry + dirz*dirz); 

dirx /= len; 
diry /= len; 
dirz /= len; 

double pitch = Math.asin(diry); 
double yaw = Math.atan2(dirz, dirx); 

//to degree 
pitch = pitch * 180.0/Math.PI; 
yaw = yaw * 180.0/Math.PI; 

yaw += 90f; 

if(yaw > player.rotationYaw) { 
    player.rotationYaw++; 
} else if(yaw < player.rotationYaw) { 
    player.rotationYaw--; 
} 

EDIT:

Dieser Code ohne die if-Anweisung ordnungsgemäß funktioniert. Die Gier- und Nickvariablen sind in Grad angegeben.

Was ich truoble mit ist, ist die Tatsache, dass, wenn ich ein paar Mal umdrehen (0, 60, 0), der Bildschirm plötzlich eine 360 ​​° Drehung, ohne ersichtlichen Grund.

+0

Möchten Sie aus der Richtung rotieren, in die der Spieler gerade schaut? Ist die Position, an der Sie einen Standort in der Welt oder in Bezug auf Ihren Player sehen möchten? Ist 'player.rotationYaw' in Grad oder Radian? – ManIkWeet

+0

@ManIkWeet RotationYaw ist in Grad, dass ich sicher weiß. – Pokechu22

+0

@ManIkWeet Es ist in Grad – JustAJavaCoder

Antwort

1

Dies ist ein häufiges Problem. Oder besser gesagt, das Problem, das Menschen gemeinsam haben, ist, dass sie etwas "über die Zeit" machen wollen und nicht wissen, wie sie es "über die Zeit hinweg" schaffen können.

Sie müssen lerp die Kamera einen kleinen Abstand jedes Tick bis die gewünschte Richtung erreicht ist. Sie müssen entweder:

a) Erstellen Sie einen Event-Handler und abonnieren Sie eines der TickEvents (wählen Sie ein passendes aus und stellen Sie sicher, dass Sie eine Phase wählen, entweder Phase.START oder Phase.END, oder Ihr Code wird mehrere Male einen Rahmen laufen lassen).

b) In welcher Methode auch immer Ihr Code ist (Hinweis: dieser Code muss bereits einmal als Tick aufgerufen werden) und machen Sie dort das Lerping.

Ich weiß nicht, wie man lerp berechnet? Stack Overflow already has that answered.