2017-04-02 4 views
-2

Ich habe ein Problem, meine Kollisionserkennung Funktion setzt manchmal Einheit Position NaN. Wenn ich Konsole (auf Chrom) Position der Entität und Kollision öffnen sind gültige Zahlen, aber subtrahieren sie voneinander manchmal NaN zurück.Javaskript: Einfache Substraktion liefert NaN

updateCollision = function(entity,rect) { 
var a = entity.x - rect.x; // a = NaN , entity.x = 3117.2646499953607 , rect.x = 3296.976967651385 
var b = entity.y - rect.y; // b = NaN , entity.y = 3024.105915848102 , rect.y = 3144.4270586199345 

if(isNaN(a)) // isNaN(a) = true 
{ 
    console.log("not again >:("); // but console doesn't log 
} 

//the code continues but its not important 

Screenshot der Konsole:

(screenshot of console)

So bin ich wirklich verwirrt und weiß nicht, was mit diesem Thema zu tun.

+0

vielleicht Sie rufen updateCollision schlecht - wie über Sie console.log Einheit und rect und stellen Sie sicher, dass die x/y-Eigenschaften der einzelnen sind eigentlich Zahlen –

+0

Sie sollten etwas mehr nützlich, wie die Werte von 'a' und 'b' anmelden. – Xufox

+1

Bitte aktualisieren Sie die Frage, um ein [mcve] des Problems einzubeziehen. Ihr Screenshot zeigt die Dev-Tools von Chrome und Sie markieren Dinge, während der Code pausiert ist. ** ** zeigt jedoch nicht, auf welche Anweisung Sie pausiert haben ** (die blau markiert wäre). Während also diese Variablen auch diese Werte ab, was auch immer Aussage haben können, ist, es ist eindeutig nicht in diesem Screenshot von Code und nicht gleich zu Beginn dieser Funktion in dem 'a' und 'b' berechnet werden, so haben wir keine Möglichkeit, Ihnen helfen, herauszufinden, was vor sich geht. –

Antwort

0

Ich habe rewriten der Code ein weiteres Mal und ich nicht mehr die NaN-Werte erhalten

Fest Funktion:

updateCollision = function(entity,rect) { 
var a = entity.x - rect.x; 
var b = entity.y - rect.y; 

var unrotatedCircleY = Math.sin((-rect.angle)/180*Math.PI)*a + Math.cos((-rect.angle)/180*Math.PI)*b +rect.y; 
var unrotatedCircleX = Math.cos((-rect.angle)/180*Math.PI)*a - Math.sin((-rect.angle)/180*Math.PI)*b +rect.x; 
var r = entity.collRad/2; 

var closestX, closestY, aX, aY; 


if (unrotatedCircleX < rect.x - rect.width/2) 
{ 
    closestX = rect.x - rect.width/2; 
    aX = closestX; 
} 
else if (unrotatedCircleX > rect.x + rect.width/2) 
{ 
    closestX = rect.x + rect.width/2; 
    aX = closestX; 
} 
else 
{ 
    closestX = unrotatedCircleX; 
    aX=rect.x; 
} 

if (unrotatedCircleY < rect.y - rect.height/2) 
{ 
    closestY = rect.y - rect.height/2; 
    aY = closestY; 
} 
else if (unrotatedCircleY > rect.y + rect.height/2) 
{ 
    closestY = rect.y + rect.height/2; 
    aY = closestY; 
} 
else 
{ 
    closestY = unrotatedCircleY; 
    aY = rect.y; 
} 


var collision = false; 

var distance = getDistance(unrotatedCircleX , unrotatedCircleY, closestX, closestY); 
if (distance < r) 
collision = true; 
else 
collision = false; 

if(collision && entity.type == "bullet") 
{ 
    entity.hp = 0; 
} 
else if(collision) 
{ 
    if(entity.type == "bullet") 
    { 
     DeleteEntity(entity); 
     return; 
    } 
    if(rect.collType == "solid") 
    { 

     var positionAngle = Math.atan2(-closestY + unrotatedCircleY , -closestX + unrotatedCircleX); 

     var y_vel = Math.sin((-rect.angle)/180*Math.PI)*entity.x_vel + Math.cos((-rect.angle)/180*Math.PI)*entity.y_vel; 
     var x_vel = Math.cos((-rect.angle)/180*Math.PI)*entity.x_vel - Math.sin((-rect.angle)/180*Math.PI)*entity.y_vel; 

     y_vel *= 0.9; 
     x_vel *= 0.9; 



     unrotatedCircleX = closestX + Math.cos(positionAngle)*(r); 
     unrotatedCircleY = closestY + Math.sin(positionAngle)*(r); 

     a = unrotatedCircleX - rect.x; 
     b = unrotatedCircleY - rect.y; 

     entity.y = Math.sin((rect.angle)/180*Math.PI)*a + Math.cos((rect.angle)/180*Math.PI)*b + rect.y; 
     entity.x = Math.cos((rect.angle)/180*Math.PI)*a - Math.sin((rect.angle)/180*Math.PI)*b + rect.x; 

     entity.y_vel = Math.sin((rect.angle)/180*Math.PI)*x_vel + Math.cos((rect.angle)/180*Math.PI)*y_vel; 
     entity.x_vel = Math.cos((rect.angle)/180*Math.PI)*x_vel - Math.sin((rect.angle)/180*Math.PI)*y_vel; 
    } 
    if(rect.collType == "trigger") 
    { 
     if(level["commandList"][rect.data].command == "tp") 
     { 
      entity.x = level["commandList"][rect.data].x; 
      entity.y = level["commandList"][rect.data].y; 
     } 
     if(level["commandList"][rect.data].command == "loadLevel") 
     { 
      levelToLoad = level["commandList"][rect.data].x; 
     } 
    } 
} 

Aber danke für die Hilfe :)

-2

Ich brauche mehr von Ihrem Code, um zu sehen, zu sehen, was eigentlich falsch ist, aber sicher ist NaN ein Ergebnis von mathematischen Operationen auf einen undefined Typ, nehmen Sie so einen guten Blick, wenn etwas undefined ist

+0

Ich weiß nicht, warum ich nicht den Screenshot sehen konnte, aber 'undefined' kann ein Problem sein, wenn Sie ein Objekt übergeben zu einer Funktion wäre, wenn Sie einen Wert (undefined) an einem seiner Eigenschaft die ganze Objekte zuweisen betroffen (da irgendwie durch Verweis es ist), erlebe ich dieses Problem, wenn ich auch mit Turbulenz-Game-Engine Kollisionserkennung funktionierte, und das war etwas kina 'undefined'. Ändern Sie Ihre Funktion so, dass sie funktioniert (entity_x, entity_y, rect_x, rect_y), um zu sehen, ob sie funktioniert. – StetHD

Verwandte Themen