2012-02-13 4 views
3

HTML5 캔버스의 경로를 사용하여 트럭의 그림을 만들었습니다. 캔버스 이미지 자체는 900 줄의 코드에 가깝고 윈도우의 너비/높이로 결정된 크기 조정 비율에 따라 이미지를 그리는 함수를 구현했습니다. 최종 결과는 캔버스와 캔버스 내의 모든 요소가 윈도우 내용에 맞게 동적으로 크기가 조정된다는 것입니다.복잡한 캔버스 경로의 동적 크기 조정 HTML5

나는 캔버스를 사용하는 날 2에만 머물렀다. 그래서 나는 무엇인가 놓쳤을지도 모른다. 그러나 내가하고있는 것을 이루기위한 쉬운 방법이 있어야한다. 그래서, 내 질문은 : 복잡한 경로가 관련되어있는 경우 캔버스와 내부 요소의 크기를 조정하는 더 쉬운 방법/방법이 있습니까?

내 코드의 샘플은 다음과 아니라 신체 부하의 크기를 조정, 나는하여 onResize 리스너에 연결되지했습니다 아직 ... 그래서 당신이 여기에 전체 소스를 얻을 수에 모두 맞지 않을 수 :

당신이 볼 수있는

http://www.epixseo.com/fullsource.txt

, 나는 다음 곱셈마다 그 크기를 조정 비율 ... 할 수있는 시간이 걸립니다으로 조정하고 선폭 .... semitruckv1 기능에 canvasWidth를 통과하고 크기 조정 비율을 결정합니다. .. (전체 소스 코드를 복사 + 붙여 넣기하고 IDE에서 로컬로 실행할 수 있어야합니다)

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" /> 
    <title>Semi truck</title> 
    <style type="text/css"> 
    body { 
     margin:0px; 
    } 
    </style> 
    <script> 

    function init() { 

     var viewportWidth = window.innerWidth; 
     var viewportHeight = window.innerHeight; 

     var canvas = document.getElementById("canvas"); 

     var canvasWidth = viewportWidth; 
     var canvasHeight = viewportHeight; 
     canvas.style.position = "fixed"; 
     canvas.setAttribute("width", canvasWidth); 
     canvas.setAttribute("height", canvasHeight); 

     var ctx = canvas.getContext("2d"); 

     semitruckv1(ctx, canvasWidth); 
    } 

    function semitruckv1(ctx, canvasWidth) { 
     //347 default width of initial image 

     var resizeRatio = canvasWidth/347; 
     // semitruckv1/Path 
     ctx.save(); 
     ctx.beginPath(); 
     ctx.moveTo(251.3*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(251.3*resizeRatio, 146.9*resizeRatio, 253.9*resizeRatio, 149.5*resizeRatio, 257.0*resizeRatio, 149.5*resizeRatio); 
     ctx.bezierCurveTo(260.2*resizeRatio, 149.5*resizeRatio, 262.8*resizeRatio, 146.9*resizeRatio, 262.8*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(262.8*resizeRatio, 140.6*resizeRatio, 260.2*resizeRatio, 138.1*resizeRatio, 257.0*resizeRatio, 138.1*resizeRatio); 
     ctx.bezierCurveTo(253.9*resizeRatio, 138.1*resizeRatio, 251.3*resizeRatio, 140.6*resizeRatio, 251.3*resizeRatio, 143.8*resizeRatio); 
     ctx.closePath(); 
     ctx.strokeStyle = "rgb(1, 1, 1)"; 
     ctx.lineWidth = 1*resizeRatio; 
     ctx.stroke(); 

     // semitruckv1/Path 
     ctx.beginPath(); 
     ctx.moveTo(243.3*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(243.3*resizeRatio, 151.4*resizeRatio, 249.5*resizeRatio, 157.5*resizeRatio, 257.0*resizeRatio, 157.5*resizeRatio); 
     ctx.bezierCurveTo(264.6*resizeRatio, 157.5*resizeRatio, 270.8*resizeRatio, 151.4*resizeRatio, 270.8*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(270.8*resizeRatio, 136.2*resizeRatio, 264.6*resizeRatio, 130.1*resizeRatio, 257.0*resizeRatio, 130.1*resizeRatio); 
     ctx.bezierCurveTo(249.5*resizeRatio, 130.1*resizeRatio, 243.3*resizeRatio, 136.2*resizeRatio, 243.3*resizeRatio, 143.8*resizeRatio); 
     ctx.closePath(); 
     ctx.lineWidth = 1*resizeRatio; 
     ctx.stroke(); 

     // semitruckv1/Path 
     ctx.beginPath(); 
     ctx.moveTo(241.3*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(241.3*resizeRatio, 152.5*resizeRatio, 248.3*resizeRatio, 159.6*resizeRatio, 257.0*resizeRatio, 159.6*resizeRatio); 
     ctx.bezierCurveTo(265.7*resizeRatio, 159.6*resizeRatio, 272.8*resizeRatio, 152.5*resizeRatio, 272.8*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(272.8*resizeRatio, 135.1*resizeRatio, 265.7*resizeRatio, 128.0*resizeRatio, 257.0*resizeRatio, 128.0*resizeRatio); 
     ctx.bezierCurveTo(248.3*resizeRatio, 128.0*resizeRatio, 241.3*resizeRatio, 135.1*resizeRatio, 241.3*resizeRatio, 143.8*resizeRatio); 
     ctx.closePath(); 
     ctx.lineWidth = 0.3*resizeRatio; 
     ctx.stroke(); 

     // semitruckv1/Path 
     ctx.beginPath(); 
     ctx.moveTo(232.5*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(232.5*resizeRatio, 157.3*resizeRatio, 243.5*resizeRatio, 168.3*resizeRatio, 257.0*resizeRatio, 168.3*resizeRatio); 
     ctx.bezierCurveTo(270.6*resizeRatio, 168.3*resizeRatio, 281.6*resizeRatio, 157.3*resizeRatio, 281.6*resizeRatio, 143.8*resizeRatio); 
     ctx.bezierCurveTo(281.6*resizeRatio, 130.2*resizeRatio, 270.6*resizeRatio, 119.3*resizeRatio, 257.0*resizeRatio, 119.3*resizeRatio); 
     ctx.bezierCurveTo(243.5*resizeRatio, 119.3*resizeRatio, 232.5*resizeRatio, 130.2*resizeRatio, 232.5*resizeRatio, 143.8*resizeRatio); 
     ctx.closePath(); 
     ctx.lineWidth = 0.5*resizeRatio; 
     ctx.stroke(); 

     //THERE ARE ABOUT ANOTHER 800 LINES OF PATH DRAWING DOWNLOAD THE FULL SOURCE TO VIEW: www.epixseo.com/fullsource.txt 

    } 
    </script> 
</head> 
<body onLoad="init()"> 
    <canvas id="canvas"></canvas> 
</body> 
</html> 

답변

4

캔버스 컨텍스트 컨텍스트가 복원 될 때까지 자동으로 캔버스에 그려진 아무것도 확장하거나 다시 1로 축척을 변경 https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Transformations#A_scale_example

+0

+1 튜토리얼에서는 이전에 스케일을 보았지만 그 튜토리얼을 읽은 후에 스케일은 내가 향해야하는 방향 인 것처럼 보였습니다. 내일은 그걸 촬영하고 그것이 필요한 경우 대답을 얻었습니다. 시간을내어 주셔서 감사합니다 –

+0

내가 찾던 결과를 얻기 위해 척도를 사용할 수있었습니다. 도움을 주셔서 감사합니다. –

0

캔버스를 사용하는 것에 대해 잘 모릅니다. (GameMaker : HTML5로 해드립니다.) SVG 이미지를로드하고 적절한 크기로 그릴 수는 없습니까?

+0

이것은 모바일 앱으로 배포되고 있으며 불행히도 안드로이드와 SVG는 아직 잘 어울리지 않습니다. 그렇지 않으면 SVG를 사용하고 싶지만이 경우에는 캔버스를 사용해야합니다. –

0

이 따라 처리 할 수있는 최선의 방법을 참조하는 scale 기능을 가지고 있습니다 예를 들어 당신의 미래 응용 프로그램에 :

그냥 같은 트럭을 그리기 만 사용 (페이지 대신 크기를 조정 한 다음 캔버스 크기를 조정 캔버스의 이미지를 끌어 캔버스의 toDataURL 방법을 사용하면 다시 그려야 할 경우
  1. .width 및 .height 대신 css 스트레칭됩니다. 나이)를 입력 한 다음 drawImage 메서드를 사용하여 해당 데이터 URL을 캔버스로 다시 그립니다 (또는 img 태그로 가져 가면됩니다).
  2. 예를 들어 바퀴 조각을 애니메이션으로 만들 계획이라면 트럭 이미지를 당기는 대신 1 단계와 동일한 전략을 사용해야합니다. 예를 들어 바퀴를 움직이게하는 경우 : 트럭 본체의 이미지를 당겨 휠의 이미지를 당긴 다음 크기를 조정할 때 트럭을 한 번 그립니다. 그런 다음 바퀴를 회전하면서 바퀴를 조금씩 회전시켜 다시 그립니다.