Topum (nesneler) neden küçülmüyor / kaybolmuyor?


208

http://jsfiddle.net/goldrunt/jGL84/42/ bu JS kemanındaki 84. satırdan. 141-146 no'lu satırları açmadan toplara uygulanabilen 3 farklı efekt vardır. 'Sıçrama' efekti olması gerektiği gibi çalışır, ancak 'asplode' efekti hiçbir şey yapmaz. Aspirasyon fonksiyonunun içine 'shrink' fonksiyonunu eklemeli miyim?

// balls shrink and disappear if they touch
var shrink = function(p) {
    for (var i = 0; i < 100; i++) {
        p.radius -= 1;
    }
    function asplode(p) {
        setInterval(shrink(p),100);
        balls.splice(p, 1);
    }
}

12
asplodeküresel kapsamda beyan edilmemiş (veya özellikle erişilebilecek bir kapsamda tanımlanmamıştır update); konsolumuzu kontrol edin.
apsillers

39
Neyse ki, bu balls.splice()bir ile p.
m59

1
hatan var Uncaught ReferenceError: asplode is not defined. İşlev asplode()görünmüyor.
Anto Jurković

2
asplodedoğru kapsamda değil, setIntervalbir işlev başvurusu almalı, splicebir dizine ihtiyaç duymalı
bendytree

3
Bu tamamen farklı bir soru. Tek ortak noktaları toplardır. Ve JavaScript. Ve dikkat. Oh ve, lütfen, şaka yapmak istiyorsanız, en azından zevkli olun. (Ama ne olursa olsun silinecekler.)
BoltClock

Yanıtlar:


65

Kodunuzda birkaç sorun var.

İlk olarak, tanımınızda:

var shrink = function(p) {
    for (var i = 0; i < 100; i++) {
        p.radius -= 1;
    }

    function asplode(p) {
         setInterval(shrink(p),100);
        balls.splice(p, 1);
    }
}

asplodeiçindeki kapsam için yereldir shrinkve bu nedenle updateonu aramaya çalıştığınız kod tarafından erişilemez . JavaScript kapsamı işlev tabanlıdır, bu nedenle içeride updateolmadığı için göremezsiniz . ( Konsolunuzda aşağıdaki gibi bir hata görürsünüz .)asplodeshrinkUncaught ReferenceError: asplode is not defined

İlk olarak aşağıdakilerin asplodedışına çıkmayı deneyebilirsiniz shrink:

var shrink = function(p) {
    for (var i = 0; i < 100; i++) {
        p.radius -= 1;
    }
}

function asplode(p) {
     setInterval(shrink(p),100);
     balls.splice(p, 1);
}

Ancak, kodunuzun bu sorunun kapsamı dışında kalan birkaç sorunu daha vardır:

  • setIntervalbir işlev bekliyor. setInterval(shrink(p), 100)neden setIntervalalmak için dönüş değeri arasında -derhal çağrılan shrink(p) . Muhtemelen istiyorsun

    setInterval(function() { shrink(p) }, 100)
  • Kodunuz for (var i = 0; i < 100; i++) { p.radius -= 1; }muhtemelen düşündüğünü yapmaz. Bu işlem hemen azaltma işlemini 100 kez çalıştırır ve ardından sonucu görsel olarak gösterir. Topu her yeni boyutta yeniden işlemek istiyorsanız, her bir ayrı düşüşü ayrı bir zamanlama geri araması (bir setIntervalişlem gibi ) içinde yapmanız gerekir .

  • .splicebir nesne değil, sayısal bir dizin bekliyor. Aşağıdakilerle bir nesnenin sayısal dizinini alabilirsiniz indexOf:

    balls.splice(balls.indexOf(p), 1);
  • Aralığınız ilk kez çalıştığında, balls.spliceifade zaten gerçekleşti (tam olarak 100ms önce oldu). Sanırım istediğin bu değil. Bunun yerine, sürekli tarafından çağrılır bir eksiltim fonksiyonu olmalıdır setIntervalve son olarak gerçekleştirir balls.splice(p,1)sonra p.radius == 0.


21
setInterval(shrink(p),100);

Bu düşündüğünü yapmaz. Bu çağırır shrink, geçirir pve sonra sonucu iletir setInterval. shrink(p)döner undefined, bu nedenle bu çizgi aslında bir aralığa hiçbir şey koymaz.

Muhtemelen siz istersiniz:

setInterval(function(){
    shrink(p)
}, 100);

1
@ tereško: Bununla yaşayabilirim :)
Rocket Hazmat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.