官术网_书友最值得收藏!

  • HTML5實驗室
  • 張磊編著
  • 1038字
  • 2019-01-09 15:53:49

實驗2 臺球

簡介

臺球源于英國,它是一項在國際上廣泛流行的高雅的室內體育運動,是一種用球桿在臺上擊球,依靠計算得分確定比賽勝負的室內娛樂體育項目。臺球也稱為桌球(中國港、澳地區的稱法)、撞球(中國臺灣地區的稱法)。在沒有開球之前,每個球的擺放位置如圖1-8所示。

圖1-8 桌球

這次,要繪制的就是類似圖1-8的效果。在繪制之前,先來繪制實心圓。

實心圓

CanvasRenderingContext2D提供了fill函數,為一個封閉的區域內填充顏色,如圓形、矩形等。實心圓和空心圓的區別在于:

● 設置實心圓顏色:CanvasRenderingContext2D.fillStyle;

● 設置空心圓路徑顏色:CanvasRenderingContext2D.strokeStyle;

● 填充實心圓:CanvasRenderingContext2D.fill;

● 連接空心圓路徑:CanvasRenderingContext2D.stroke。

掌握了這些,可以輕松地在Canvas中畫一個實心圓:

        <canvasid="myCanvas"width="200"height="100"style="border:1px solid #c3c3c3;">
        Your browser does not support the canvas element.
        </canvas>
        <scripttype="text/javascript">
        var c=document.getElementById("myCanvas");
        var cxt=c.getContext("2d");
            cxt.fillStyle="#FF7F00";
            cxt.beginPath();
            cxt.arc(70, 18, 15, 0, Math.PI * 2, true);
            cxt.closePath();
            cxt.fill();
        </script>

效果如圖1-9所示。

圖1-9畫圓

實心圓

掌握了畫實心圓,就可以開始繪制臺球桌面上的16個小球(包括母球)了。在繪制之前,先復習一下初等幾何知識,一個直角三角形,如果有一個角為30°,那么三角形的三個邊的比例如圖1-10所示。

圖1-10 三角形各邊比例

再回到要繪制的臺球,如圖1-11所示。最外層的圓心連成的三角形是等邊三角形,然后被分成兩個直角三角形,等邊三角形的3個角都是60°,所以被分成的直角三角形的三個邊的比例是

圖1-11 桌球布局分析

假設母球和離母球最近的頂部的球的位置分別如下:

        var parentBall={
              position: { x: 200, y: 200 },
              r: r,
              color: "#fff"
            };
        var firstBall={
              position: { x: 550, y: 200 },
              r: r,
              color: "#fff"
            };

這里用了面向對象的思想分別定義了小球的位置、半徑和顏色。知道了頂部小球的位置,加上上面的分析,可以生成后面一系列小球的坐標:

         for (var j=1; j < 5; j++) {
        for (var k=0; k < j+1; k++) {
        var ball={
                      position: { x: firstBall.position.x+j * Math.sqrt(3) * r, y: firstBall.position.y -
                      j * r+2 * k * r },
                      r: r,
                      color: "#fff"
                  };
                  balls.push(ball);
              }
            }

把所有生成的球放入一個balls的數組當中,然后調用CanvasRenderingContext2DAPI,根據小球的坐標、顏色和半徑,把所有小球繪制出來:

            cxt.fillStyle="#fff";
        for (i in balls) {
              cxt.beginPath();
              cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].r, 0, Math.PI * 2, true);
              cxt.closePath();
              cxt.fill();
            }

完整的代碼如下:

        <canvasid="myCanvas"width="847"height="440"style="background-color:#000000">
        Your browser does not support the canvas element.
        </canvas>
        <script>
        var canvas=document.getElementById("myCanvas");
        var cxt=canvas.getContext("2d");
        var r=10;
        var balls=[];
        function initBall() {    \注:initBall方法生成所有的小球\
        var parentBall={
                  position: { x: 200, y: 200 },
                  r: r,
                  color: "#fff"
              };
        var firstBall={
                  position: { x: 550, y: 200 },
                  r: r,
                  color: "#fff"
              };
        for (var j=1; j < 5; j++) {
        for (var k=0; k < j+1; k++) {    \注:根據 firstBall的坐標,通過兩個嵌套的for循環生成所有小球坐標\
        var ball={
                        position: { x: firstBall.position.x+j * Math.sqrt(3) * r, y: firstBall.position.y -
                        j * r+2 * k * r },
                        r: r,
                        color: "#fff"
                      };
                      balls.push(ball);
                  }
              }
              balls.push(firstBall);
              balls.push(parentBall);
            }
        function draw() {
              cxt.fillStyle="#fff";
        for (i in balls) {
                  cxt.beginPath();
                  cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].r, 0, Math.PI * 2, true);
                  cxt.closePath();
                  cxt.fill();
              }
            }
            initBall();
            draw();
        </script>

運行效果如圖1-12所示。

圖1-12 在Canvas上模擬繪制

當然,也可以在初始化小球時讓每個小球產生一個隨機顏色,利用下面這種方法產生隨機顏色。

        function randomColor() {
        var arrHex=["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]; var strHex="#";
        var index;
        for (var i=0; i < 6; i++) {
                  index=Math.round(Math.random() * 15);
                  strHex +=arrHex[index];
              }
        return strHex;
            }

在初始化小球時調用該方法。

        var firstBall={
              position: { x: 550, y: 200 },
              r: r,
              color: randomColor()    \注:產生隨機顏色\
            };
        for (var j=1; j < 5; j++) {
        for (var k=0; k < j+1; k++) {
        var ball={
                      position: { x: firstBall.position.x+j * Math.sqrt(3) * r, y: firstBall.position.y -
                      j * r+2 * k * r },
                      r: r,
                      color: randomColor()    \注:產生隨機顏色\
                  };
                  balls.push(ball);
              }
            }

在畫球時直接使用小球的color屬性即可。

        function draw() {
        for (i in balls) {
                  cxt.fillStyle=balls[i].color;    \注:在這里使用\
                  cxt.beginPath();
                  cxt.arc(balls[i].position.x, balls[i].position.y, balls[i].r, 0, Math.PI * 2, true);
                  cxt.closePath();
                  cxt.fill();
              }
            }

效果如圖1-13所示。

圖1-13 彩色桌球

通過這個實驗,學習了基本的繪制實心圓的方法,并通過不同顏色的小球模擬出桌球的初始擺放。在真實的游戲開發當中,會讓美工畫好具有反光和立體感的小球,然后把對應的位置填上相應的小球圖片,就可以達到最終想要的效果。

主站蜘蛛池模板: 垦利县| 奉化市| 吕梁市| 丘北县| 元谋县| 来宾市| 桂东县| 澄迈县| 长葛市| 灵璧县| 宁蒗| 靖边县| 边坝县| 郯城县| 邢台市| 武安市| 镇远县| 保定市| 谢通门县| 龙州县| 朝阳区| 安丘市| 柯坪县| 常山县| 海口市| 南宫市| 迭部县| 衡水市| 藁城市| 雅江县| 宁陕县| 永宁县| 吴旗县| 临夏县| 祥云县| 武鸣县| 青州市| 松江区| 商都县| 枣强县| 托克逊县|