2016-03-23 5 views
0

Ich möchte einen Ball prellen, und in der Zukunft mehr schaffen und sie Rebound machen. Dies ist mein Code (p5.js, eine Verarbeitungsbibliothek für javascript)Stoppen springenden Ball unter Schwerkraft aus dem Verschwinden

var xpos = 200; 
var ypos = 450; 
var vy = 0; 
var gravity = 0.6; 
var bounce = -1.00; 
var diameter = 30; 

function setup() { 
    var myCanvas = createCanvas(windowWidth, windowHeight); 

    stroke(255); 
    noFill(); 
} 

function draw() { 
    background(0); 

    ellipse(xpos, ypos, diameter, diameter); 

    vy += gravity; 
    ypos += vy; 

    if(ypos > (windowHeight - diameter/2)) { 
    vy *= bounce; 
    } 

} 

Es sieht aus, als ob es funktioniert gut, aber wenn die Bounce ist wirklich klein zu bekommen, beginnt es zu Glitch und verschwindet, here's a codepen. Ich weiß nicht, wie man es einfach stoppen und rollen oder etwas (offensichtlich nicht rollen, wenn es keine x Eigenschaft gibt, aber hören Sie einfach auf, sich nach dem Aufprallen zu bewegen)

Jede Hilfe wird geschätzt, danke.

Antwort

2

Sie wollen Beschleunigen Sie zuerst, führen Sie dann Kollisionsprüfungen durch, und justieren Sie dann die Position für Kollisionen.

Wenn Sie eine Wiederherstellung wünschen, wenden Sie das nach jeder Kollision an vy, z.

Edit: auch überprüft, um zu sehen, ob ein Objekt sein sollte „Ruhe“ hilft

var xpos = 200; 
var ypos = 0; 
var vy = 0; 
var gravity = 10; 
var bounce = 0.9; // typically represented as a positive normalized value 
var diameter = 30; 
var sleepTolerance = gravity; // this will provide a solid result 

// KA variables 
var windowHeight = height; 
var windowWidth = width; 

frameRate(30); 
var draw = function() { 
    background(0); 

    ellipse(xpos, ypos, diameter, diameter); 

    var asleep = false; 

    if(!asleep){ 
     vy += gravity; 
     ypos += vy; 
    } 

    var heightAboveGround = ypos - (windowHeight - diameter/2); 
    if(heightAboveGround > 0) { // remember y is inverted 
     // position adjusted for reflection after collision 
     // including restitution (resulting from the bounce) 
     ypos -= bounce * heightAboveGround; 

     // apply restitution to subsequent velocity 
     vy *= -bounce; 

     if (heightAboveGround <= sleepTolerance && abs(vy) <= sleepTolerance){ 
      asleep = true; 
      ypos = windowHeight - diameter/2; 
     } 
    } 
}; 
+0

http://codepen.io/samirc/pen/RaVGRW?editors=0010 Wenn ich den Durchmesser vergrößern wird der Ball sichtbar glitschig, wenn er aufhört zu springen –

+0

Ich habe das gerade erkannt. :) Bearbeiten Antwort ... – Nolo

+0

Okay, danke :) –

0

konnte ich einen hüpfenden Ball, indem sie zwei Anpassungen genauer simulieren:

  1. Gelten nicht die Schwerkraft, wenn der Ball den ‚Boden‘ berührt und bewegt sich nicht
  2. Attenuate oder Abnahme der Größenordnung der Geschwindigkeit während jedes Prell
  3. Stellen Sie die Geschwindigkeit auf 0, sobald die Größe klein genug ist,

Aktualisieren der bounce:

// Attenuate velocity by making the magnitude of this value < 1 
var bounce = -0.9; 

// Give initial vy 
var vy = 0.1; 

Und stellen wir sicher, Schwerkraft nur hinzufügen, wenn Ball "in der Luft" (verhindert unsere Ball von "unter der Erde versinkt") ist:

function draw() { 
    background(0); 

    ellipse(xpos, ypos, diameter, diameter); 

    var floor = windowHeight - diameter/2; 
    var inAir = ypos <= floor; 
    var moving = Math.abs(vy) > 0.01; 

    if (inAir && moving) { 
     vy += gravity; 
    } 

    ypos += vy; 

    if(!inAir && vy > 0) { 
     vy *= bounce; 

     if (!moving) { 
      vy = 0; 
     } 
    } 
} 
+0

http://codepen.io/samirc/pen/RaVGRW?editors=0010 Es fällt nur und friert, tat Ich mache etwas falsch? –

+0

Änderungen vorgenommen, um diese Probleme zu beheben –

+0

Sie haben das erste Problem behoben, aber ein anderes verursacht, jetzt wird es für immer zurückspringen, wenn die Bouncing-Höhe kurz ist http://codepen.io/samirc/pen/RaVGRW?editors=0010 –

Verwandte Themen