2016-08-29 4 views
0

단추를 클릭 할 때 표시되는 캔버스 html 요소가 있습니다.캔버스 재시작 단추 클릭

내가 겪고있는 문제는 캔버스의 애니메이션이 약 1 초간 지속된다는 것입니다. 따라서 버튼을 클릭하여 CSS 속성을 display:none에서 display:inline으로 변경하면 백그라운드에서로드되는 애니메이션이 이미 종료되었습니다.

캔버스 애니메이션을 다시 시작하기 위해 단추를 클릭하기 만하면됩니다. 나는 그것이 백그라운드에서 로딩된다는 것을 염두에 두지 않고 단지 버튼 클릭만으로 다시 시작하기를 원한다. 이 캔버스 내 자바 스크립트

<canvas class="canvas2" id="canvas2"></canvas> 
    <script src="canvas.js"></script> 

    <div class="buttons"> 
     <button class="two">Canvas 2</button> 
    </div> 

입니다 :

는 캔버스와 버튼에 대한 HTML이다. 애니메이션은 단순히 왼쪽에서 오른쪽으로 튀는 광장입니다 :

var canvas = document.getElementById('canvas2'); 
var c2 = canvas.getContext('2d'); 

c2.fillStyle = "black"; 
c2.fillRect(0,0,canvas.width,canvas.height); 

var posX = 20; 
posY = canvas.height/2; 
vx = 8, 
vy = -10; 
gravity = 1; 

setInterval(function(){ 
    c2.fillStyle = "black"; 
    c2.fillRect(0,0,canvas.width,canvas.height); 
    posX += vx; 
    posY += vy; 

    if (posY > 120){ 
     vy *= -0.5; 
     vx *= 0.5; 
     posY = 120; 
    } 

    vy += gravity; 

    c2.fillStyle = "red"; 
    c2.fillRect(posX, posY, 10, 10); 
}, 30); 

}); 

그리고 이것은 간단한 jQuery를 캔버스 요소를 표시하는 데 사용됩니다 : 나는 다양한 기능을 시도했습니다

$('.two').click(function() { 
    $('.canvas2').show(); 
}); 

을하지만 그럴 수 없어 two 클래스의 버튼을 클릭하면 캔버스 애니메이션이 다시 시작되는 것 같습니다.

아무도 도와 줄 수 있습니까?

당신은 단지 버튼을 클릭 할 때 시작 만 기능에 넣어 수 있습니다
+0

당신이 결코 간격을 취소하지 않기 때문에 실제로 멈추지 말아야합니다. 그것은 당신의 더 큰 관심사가되어야합니다. – Kaiido

답변

0

https://jsfiddle.net/co047stc/

var canvas, context; 
 
var canvasDisplayed = false; 
 
var intervalAnimation = null; 
 
var posX, posY, vx, vy, gravity; 
 

 
$('.two').click(function() { 
 
    if (!canvasDisplayed) { 
 
    showCanvas() 
 
    } 
 
    animation() 
 
}); 
 

 
function showCanvas() { 
 
\t canvasDisplayed = true; 
 
\t canvas = document.getElementById('canvas2'); 
 
    context = canvas.getContext('2d'); 
 

 
    context.fillStyle = "black"; 
 
    context.fillRect(0,0,canvas.width,canvas.height); 
 
} 
 

 
function resetSquare() { 
 
\t posX = 20; 
 
    posY = canvas.height/2; 
 
    vx = 8, 
 
    vy = -10; 
 
    gravity = 1; 
 
} 
 

 

 
function animation() { 
 
\t resetSquare() 
 
\t animationEnd() 
 
    intervalAnimation = setInterval(function(){ 
 
    \t \t context.fillStyle = "black"; 
 
\t \t context.fillRect(0, 0, canvas.width, canvas.height) 
 
    posX += vx; 
 
    posY += vy; 
 

 
    if (posY > 120){ 
 
     vy *= -0.5; 
 
     vx *= 0.5; 
 
     posY = 120; 
 
    } 
 

 
    vy += gravity; 
 

 
    context.fillStyle = "red"; 
 
    context.fillRect(posX, posY, 10, 10); 
 
    }, 30); 
 
} 
 

 
function animationEnd() { 
 
\t context.fillStyle = "black"; 
 
\t context.fillRect(0, 0, canvas.width, canvas.height) 
 
    clearInterval(intervalAnimation) 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<canvas class="canvas2" id="canvas2"></canvas> 
 
    <script src="canvas.js"></script> 
 

 
    <div class="buttons"> 
 
     <button class="two">Canvas 2</button> 
 
    </div>

+0

완벽하게 보입니다! 당신이 바꾼 것을 설명해 주시겠습니까? –

+0

함수에서 코드를 분리하면 버튼 클릭시'animation()'이 호출되고 다른 함수는 하나의 액션에만 관련됩니다. – Quentin

0

:

function animation() { 
    var canvas = document.getElementById('canvas2'); 
    var c2 = canvas.getContext('2d'); 

    c2.fillStyle = "black"; 
    c2.fillRect(0,0,canvas.width,canvas.height); 

    var posX = 20; 
    posY = canvas.height/2; 
    vx = 8, 
    vy = -10; 
    gravity = 1; 

    setInterval(function(){ 
     c2.fillStyle = "black"; 
     c2.fillRect(0,0,canvas.width,canvas.height); 
     posX += vx; 
     posY += vy; 

     if (posY > 120){ 
      vy *= -0.5; 
      vx *= 0.5; 
      posY = 120; 
     } 

     vy += gravity; 

     c2.fillStyle = "red"; 
     c2.fillRect(posX, posY, 10, 10); 
    }, 30); 

    }); 
} 


$('.two').click(function() { 
    $('.canvas2').show(); 
    animation(); 
}); 
+0

감사합니다. 이전에 시도했습니다. 캔버스가 지워지지 않기 때문에 애니메이션이 다시 시작되지만 애니메이션은 깜박입니다. 애니메이션이 실행 된 후 캔버스를 지울 수있는 방법이 있습니까? –

+0

https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/clearRect 그래서 귀하의 경우 c2.clearRect (0,0, canvas.width, canvas.height) – Fels