2016-05-01 14 views
6

Próbuję wstrząsnąć elementem html dla mojej gry.JavaScript wstrząsnąć elementem html

znalazłem ten kod tutaj:

shake = function (sprite, magnitude = 16, angular = false) { 

    //A counter to count the number of shakes 
    var counter = 1; 

    //The total number of shakes (there will be 1 shake per frame) 
    var numberOfShakes = 10; 

    //Capture the sprite's position and angle so you can 
    //restore them after the shaking has finished 
    var startX = sprite.x, 
     startY = sprite.y, 
     startAngle = sprite.rotation; 

    // Divide the magnitude into 10 units so that you can 
    // reduce the amount of shake by 10 percent each frame 
    var magnitudeUnit = magnitude/numberOfShakes; 

    //The `randomInt` helper function 
    var randomInt = (min, max) => { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
    }; 

    //Add the sprite to the `shakingSprites` array if it 
    //isn't already there 
    if(shakingSprites.indexOf(sprite) === -1) { 
    //console.log("added") 
    shakingSprites.push(sprite); 

    //Add an `updateShake` method to the sprite. 
    //The `updateShake` method will be called each frame 
    //in the game loop. The shake effect type can be either 
    //up and down (x/y shaking) or angular (rotational shaking). 
    sprite.updateShake =() => { 
     if(angular) { 
     angularShake(); 
     } else { 
     upAndDownShake(); 
     } 
    }; 
    } 

    //The `upAndDownShake` function 
    function upAndDownShake() { 

    //Shake the sprite while the `counter` is less than 
    //the `numberOfShakes` 
    if (counter < numberOfShakes) { 

     //Reset the sprite's position at the start of each shake 
     sprite.x = startX; 
     sprite.y = startY; 

     //Reduce the magnitude 
     magnitude -= magnitudeUnit; 

     //Randomly change the sprite's position 
     sprite.x += randomInt(-magnitude, magnitude); 
     sprite.y += randomInt(-magnitude, magnitude); 

     //Add 1 to the counter 
     counter += 1; 
    } 

    //When the shaking is finished, restore the sprite to its original 
    //position and remove it from the `shakingSprites` array 
    if (counter >= numberOfShakes) { 
     sprite.x = startX; 
     sprite.y = startY; 
     shakingSprites.splice(shakingSprites.indexOf(sprite), 1); 
    } 
    } 

    //The `angularShake` function 
    //First set the initial tilt angle to the right (+1) 
    var tiltAngle = 1; 

    function angularShake() { 
    if (counter < numberOfShakes) { 

     //Reset the sprite's rotation 
     sprite.rotation = startAngle; 

     //Reduce the magnitude 
     magnitude -= magnitudeUnit; 

     //Rotate the sprite left or right, depending on the direction, 
     //by an amount in radians that matches the magnitude 
     sprite.rotation = magnitude * tiltAngle; 
     counter += 1; 

     //Reverse the tilt angle so that the sprite is tilted 
     //in the opposite direction for the next shake 
     tiltAngle *= -1; 
    } 

    //When the shaking is finished, reset the sprite's angle and 
    //remove it from the `shakingSprites` array 
    if (counter >= numberOfShakes) { 
     sprite.rotation = startAngle; 
     shakingSprites.splice(shakingSprites.indexOf(sprite), 1); 
     //console.log("removed") 
    } 
    } 

} 

Jednak to działa tylko dla duszków płótnie. Jak mogę go uruchomić z elementami HTML? Dzięki.

+2

dlaczego nie używać animacji CSS? –

+0

@zb 'pokazana tu funkcja wstrząsania jest dość wyrafinowana, pozwala ustawić kąt, jasność i naturalnie obniża ilość drgań po zakończeniu. – Harry

+0

@Harry Moja odpowiedź nie jest rozwiązaniem? – Mohammad

Odpowiedz

3

I przystosowały swoją funkcję tak, że działa na elementach DOM. Jest to dość mocny wstrząsnąć choć może chcesz grać z parametrami do jej tłumiony trochę:

var shakingElements = []; 

var shake = function (element, magnitude = 16, angular = false) { 
    //First set the initial tilt angle to the right (+1) 
    var tiltAngle = 1; 

    //A counter to count the number of shakes 
    var counter = 1; 

    //The total number of shakes (there will be 1 shake per frame) 
    var numberOfShakes = 15; 

    //Capture the element's position and angle so you can 
    //restore them after the shaking has finished 
    var startX = 0, 
     startY = 0, 
     startAngle = 0; 

    // Divide the magnitude into 10 units so that you can 
    // reduce the amount of shake by 10 percent each frame 
    var magnitudeUnit = magnitude/numberOfShakes; 

    //The `randomInt` helper function 
    var randomInt = (min, max) => { 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
    }; 

    //Add the element to the `shakingElements` array if it 
    //isn't already there 
    if(shakingElements.indexOf(element) === -1) { 
    //console.log("added") 
    shakingElements.push(element); 

    //Add an `updateShake` method to the element. 
    //The `updateShake` method will be called each frame 
    //in the game loop. The shake effect type can be either 
    //up and down (x/y shaking) or angular (rotational shaking). 
    if(angular) { 
     angularShake(); 
    } else { 
     upAndDownShake(); 
    } 
    } 

    //The `upAndDownShake` function 
    function upAndDownShake() { 

    //Shake the element while the `counter` is less than 
    //the `numberOfShakes` 
    if (counter < numberOfShakes) { 

     //Reset the element's position at the start of each shake 
     element.style.transform = 'translate(' + startX + 'px, ' + startY + 'px)'; 

     //Reduce the magnitude 
     magnitude -= magnitudeUnit; 

     //Randomly change the element's position 
     var randomX = randomInt(-magnitude, magnitude); 
     var randomY = randomInt(-magnitude, magnitude); 

     element.style.transform = 'translate(' + randomX + 'px, ' + randomY + 'px)'; 

     //Add 1 to the counter 
     counter += 1; 

     requestAnimationFrame(upAndDownShake); 
    } 

    //When the shaking is finished, restore the element to its original 
    //position and remove it from the `shakingElements` array 
    if (counter >= numberOfShakes) { 
     element.style.transform = 'translate(' + startX + ', ' + startY + ')'; 
     shakingElements.splice(shakingElements.indexOf(element), 1); 
    } 
    } 

    //The `angularShake` function 
    function angularShake() { 
    if (counter < numberOfShakes) { 
     console.log(tiltAngle); 
     //Reset the element's rotation 
     element.style.transform = 'rotate(' + startAngle + 'deg)'; 

     //Reduce the magnitude 
     magnitude -= magnitudeUnit; 

     //Rotate the element left or right, depending on the direction, 
     //by an amount in radians that matches the magnitude 
     var angle = Number(magnitude * tiltAngle).toFixed(2); 
     console.log(angle); 
     element.style.transform = 'rotate(' + angle + 'deg)'; 
     counter += 1; 

     //Reverse the tilt angle so that the element is tilted 
     //in the opposite direction for the next shake 
     tiltAngle *= -1; 

     requestAnimationFrame(angularShake); 
    } 

    //When the shaking is finished, reset the element's angle and 
    //remove it from the `shakingElements` array 
    if (counter >= numberOfShakes) { 
     element.style.transform = 'rotate(' + startAngle + 'deg)'; 
     shakingElements.splice(shakingElements.indexOf(element), 1); 
     //console.log("removed") 
    } 
    } 

}; 

DEMO

Zapraszamy do obejrzenia demo na skrzypcach. Blok red jest regularny upAndDownShake, natomiast jeden green wykorzystuje angularShake:

https://jsfiddle.net/12aueufy/1/

2

Może powinieneś rzucić okiem w Animate.css, https://daneden.github.io/animate.css/, jest to biblioteka css, która zapewnia wiele animacji, w tym wstrząsnąć ... Mam nadzieję, że to może działać dla Twojego problemu!

21

Można używać animacji css jak w poniższym przykładzie

@-webkit-keyframes shake { 
 
    0% { -webkit-transform: translate(2px, 1px) rotate(0deg); } 
 
    10% { -webkit-transform: translate(-1px, -2px) rotate(-1deg); } 
 
    20% { -webkit-transform: translate(-3px, 0px) rotate(1deg); } 
 
    30% { -webkit-transform: translate(0px, 2px) rotate(0deg); } 
 
    40% { -webkit-transform: translate(1px, -1px) rotate(1deg); } 
 
    50% { -webkit-transform: translate(-1px, 2px) rotate(-1deg); } 
 
    60% { -webkit-transform: translate(-3px, 1px) rotate(0deg); } 
 
    70% { -webkit-transform: translate(2px, 1px) rotate(-1deg); } 
 
    80% { -webkit-transform: translate(-1px, -1px) rotate(1deg); } 
 
    90% { -webkit-transform: translate(2px, 2px) rotate(0deg); } 
 
    100% { -webkit-transform: translate(1px, -2px) rotate(-1deg); } 
 
} 
 
.shake:hover { 
 
    -webkit-animation-name: shake; 
 
    -webkit-animation-duration: 0.5s; 
 
    -webkit-transform-origin:50% 50%; 
 
    -webkit-animation-iteration-count: infinite; 
 
} 
 
.shake { 
 
    display:inline-block 
 
}
<div class="shake">Shake me</div> 
 
<img class="shake" src="https://www.w3.org/2008/site/images/logo-w3c-screen-lg" />

Aby zmienić prędkość wytrząsania, zmiana wartości od animation-duration, translate(), rotate().

Jeśli chcesz wstrząsnąć elementu przy użyciu javascript zobaczyć jsfiddle

+0

Potrząsanie nasila się –

0
function shake(e, oncomplete, distance, time) { 
var time = 500; 
var distance = 5; 

var start = (new Date()).getTime(); 
animate(); 

function animate() { 
    var now = (new Date()).getTime(); 
    // Get current time 
    var elapsed = now - start; 
    // How long since we started 
    var fraction = elapsed/time; 
    // What fraction of total time? 
    if (fraction < 1) { 
     var x = distance * Math.sin(fraction * 4 * Math.PI); 
     e.style.left = x + "px"; 
     // We're aiming for a smooth 40 frames/second animation. 
     setTimeout(animate, Math.min(25, time - elapsed)); 
    } else { 
     // Otherwise, the animation is complete 
     if (oncomplete) oncomplete(e); 
     // Invoke completion callback 
    } 
    } 
} 

function shakeme(event1) { 
    shake(event1.target); 
} 

document.getElementById("wood").addEventListener("mouseover", shakeme, false); 

elementu HTML

<button id="wood">Hello World</button> 

źródło

http://javascriipt.blogspot.com/2015/02/how-to-mimic-shake-animation-effect.html

0

Można użyć niektóre biblioteki dla animacji javascript jak Velocity

To bardzo elastyczny i łatwy w użyciu.

Proszę sprawdzić working sample, jestem pewien, że można tworzyć chciał efekt w minutach

Mam nadzieję, że pomoże

Powiązane problemy