限时优惠活动
亲爱的苦力吧用户,我们为了回馈新老用户一直以来的鼎力支持,即日起(2025-02-06至2025-03-06)凡是购买苦力吧VIP/充值K币的新老用户,都直接可获得买一送一的优惠馈赠。例如:购买一个月的VIP会员可直接获得两个月的VIP会员;充值100K币可直接获得200K币,以此类推!有任何疑问可联系在线客服,感谢各位用户对苦力吧素材的信任与厚爱,我们将一如既往的给大家上新更多优质的素材源码,祝大家开工大吉、工作顺利、心想事成。

javascript弹珠打砖块2D网页小游戏源码

所属分类: 网页特效-抽奖&游戏    2023-11-29 04:01:26

 21.1K  4  查看评论 (1)
javascript弹珠打砖块2D网页小游戏源码 ie兼容6
 查看演示  登录后下载 温馨提示
登录会员即可享受免费下载
 我要建站

javascript弹珠打砖块2D网页小游戏源码(共3个文件)

    • index.html

使用方法

  • code
  • source
  1. // Canvas related variables
  2. var canvas = document.getElementById('myCanvas');
  3. var ctx = canvas.getContext('2d');
  4. // Game related variables
  5. var lives = 3;
  6. var gameOver = false;
  7. var paused = false;
  8. var score = 0;
  9. var autoplayToggle = document.getElementById("autoplay");
  10. autoplayToggle.checked = false;
  11. // Ball relates variables
  12. var x = canvas.width / 2;
  13. var y = canvas.height - 30;
  14. var dx = 1.5;
  15. var dy = -1.5;
  16. var ballRadius = 10;
  17. var maxSpeed = 3.5;
  18. var speedMultiplier = 1;
  19. // Paddle related variables
  20. var paddleHeight = 10;
  21. var paddleWidth = 75;
  22. var paddleX = (canvas.width - paddleWidth) / 2;
  23. var paddleY = canvas.height - (paddleHeight + 5);
  24. var rightPressed = false;
  25. var leftPressed = false;
  26. var paddleSpeed = 7;
  27. // Brick related variables
  28. var brickRowCount = 3;
  29. var brickColumnCount = 5;
  30. var brickWidth = 75;
  31. var brickHeight = 20;
  32. var brickPadding = 10;
  33. var brickOffsetTop = 30;
  34. var brickOffsetLeft = 30;
  35. var bricks = [];
  36. for (c = 0; c < brickColumnCount; c++) {
  37. bricks[c] = [];
  38. for (r = 0; r < brickRowCount; r++) {
  39. bricks[c][r] = {
  40. x: 0,
  41. y: 0,
  42. status: 2
  43. };
  44. }
  45. }
  46. function draw() {
  47. if (!paused) {
  48. ctx.clearRect(0, 0, canvas.width, canvas.height);
  49. if (autoplayToggle.checked) {
  50. autoPlay();
  51. }
  52. drawPaddle();
  53. drawBricks();
  54. drawBall();
  55. collisionDetection();
  56. drawScore();
  57. drawLives();
  58. x += dx;
  59. y += dy;
  60. }
  61. if (x + dx > (canvas.width - ballRadius) || x + dx < ballRadius) {
  62. dx = -dx;
  63. }
  64. if (y + dy < ballRadius) {
  65. dy = -dy;
  66. } else if (y + dy > (canvas.height - (2 * ballRadius))) {
  67. if (x > paddleX && x < paddleX + paddleWidth) {
  68. dy = -dy;
  69. if (Math.abs(dx) < maxSpeed && Math.abs(dy) < maxSpeed) {
  70. dx *= speedMultiplier;
  71. dy *= speedMultiplier;
  72. console.log(dx);
  73. }
  74. } else {
  75. lives--;
  76. if (!lives) {
  77. alert("游戏结束");
  78. document.location.reload();
  79. } else {
  80. x = canvas.width / 2;
  81. y = canvas.height - 30;
  82. dx = 2;
  83. dy = -2;
  84. paddleX = (canvas.width - paddleWidth) / 2;
  85. }
  86. }
  87. }
  88. if (lives <= 0) {
  89. loseMessage.style.display = "block";
  90. }
  91. requestAnimationFrame(draw);
  92. }
  93. function drawBall() {
  94. ctx.beginPath();
  95. ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
  96. ctx.fillStyle = '#0095DD';
  97. ctx.fill();
  98. ctx.closePath();
  99. }
  100. function drawPaddle() {
  101. ctx.beginPath();
  102. ctx.rect(paddleX, paddleY, paddleWidth, paddleHeight);
  103. ctx.fillStyle = "#00FFFF";
  104. ctx.fill();
  105. ctx.closePath();
  106. if (rightPressed) {
  107. if (paddleX + paddleSpeed < canvas.width - paddleWidth) {
  108. paddleX += paddleSpeed;
  109. }
  110. } else if (leftPressed) {
  111. if (paddleX - paddleSpeed > 0) {
  112. paddleX -= paddleSpeed;
  113. }
  114. }
  115. }
  116. function autoPlay() {
  117. var newX = x - (paddleWidth / 2);
  118. if (newX >= 0 && newX <= canvas.width - paddleWidth) {
  119. paddleX = newX;
  120. }
  121. }
  122. function drawBricks() {
  123. for (c = 0; c < brickColumnCount; c++) {
  124. for (r = 0; r < brickRowCount; r++) {
  125. if (bricks[c][r].status > 0) {
  126. var brickX = (c * (brickWidth + brickPadding)) + brickOffsetLeft;
  127. var brickY = (r * (brickHeight + brickPadding)) + brickOffsetTop;
  128. bricks[c][r].x = brickX;
  129. bricks[c][r].y = brickY;
  130. ctx.beginPath();
  131. ctx.rect(brickX, brickY, brickWidth, brickHeight);
  132. ctx.fillStyle = bricks[c][r].status == 2 ? "#ddd000" : "#dd1e00";
  133. ctx.fill();
  134. ctx.closePath();
  135. }
  136. }
  137. }
  138. }
  139. function collisionDetection() {
  140. for (c = 0; c < brickColumnCount; c++) {
  141. for (r = 0; r < brickRowCount; r++) {
  142. var b = bricks[c][r];
  143. if (b.status != 0) {
  144. if (x > b.x && x < b.x + brickWidth && y - ballRadius > b.y && y - ballRadius < b.y + brickHeight) {
  145. dy = -dy;
  146. b.status--;
  147. if (b.status == 0) {
  148. dy = -dy;
  149. score++;
  150. if (score == brickRowCount * brickColumnCount) {
  151. alert("恭喜你~ 你赢了!");
  152. document.location.reload();
  153. }
  154. }
  155. }
  156. }
  157. }
  158. }
  159. }
  160. function drawScore() {
  161. ctx.font = "16px Arial";
  162. ctx.fillStyle = "#0095DD";
  163. ctx.fillText("得分: " + score, 8, 20);
  164. }
  165. function drawLives() {
  166. ctx.font = "16px Arial";
  167. ctx.fillStyle = "#0095DD";
  168. ctx.fillText("生命: " + lives, canvas.width - 65, 20);
  169. }
  170. function keyDownHandler(e) {
  171. if (e.keyCode == 39 || e.keyCode == 68) {
  172. rightPressed = true;
  173. } else if (e.keyCode == 37 || e.keyCode == 65) {
  174. leftPressed = true;
  175. }
  176. }
  177. function keyUpHandler(e) {
  178. if (e.keyCode == 39 || e.keyCode == 68) {
  179. rightPressed = false;
  180. } else if (e.keyCode == 37 || e.keyCode == 65) {
  181. leftPressed = false;
  182. }
  183. }
  184. function pauseKeyPress(e) {
  185. if (e.keyCode == 27) {
  186. paused = !paused;
  187. console.log(paused);
  188. }
  189. }
  190. function mouseMoveHandler(e) {
  191. var relativeX = e.clientX - canvas.offsetLeft;
  192. if (relativeX > 0 && relativeX < canvas.width) {
  193. var newPaddleX = relativeX - paddleWidth / 2;
  194. if (newPaddleX >= 0 && newPaddleX + paddleWidth <= canvas.width) {
  195. paddleX = newPaddleX;
  196. }
  197. }
  198. }
  199. document.addEventListener("keydown", keyDownHandler, false);
  200. document.addEventListener("keyup", keyUpHandler, false);
  201. document.addEventListener("keyup", pauseKeyPress, false);
  202. document.addEventListener("mousemove", mouseMoveHandler, false);
  203. //setInterval(draw, 10);
  204. draw();
// Canvas related variables
var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');

// Game related variables
var lives = 3;
var gameOver = false;
var paused = false;
var score = 0;
var autoplayToggle = document.getElementById("autoplay");
autoplayToggle.checked = false;

// Ball relates variables
var x = canvas.width / 2;
var y = canvas.height - 30;
var dx = 1.5;
var dy = -1.5;
var ballRadius = 10;
var maxSpeed = 3.5;
var speedMultiplier = 1;

// Paddle related variables
var paddleHeight = 10;
var paddleWidth = 75;
var paddleX = (canvas.width - paddleWidth) / 2;
var paddleY = canvas.height - (paddleHeight + 5);
var rightPressed = false;
var leftPressed = false;
var paddleSpeed = 7;

// Brick related variables
var brickRowCount = 3;
var brickColumnCount = 5;
var brickWidth = 75;
var brickHeight = 20;
var brickPadding = 10;
var brickOffsetTop = 30;
var brickOffsetLeft = 30;
var bricks = [];
for (c = 0; c < brickColumnCount; c++) {
    bricks[c] = [];
    for (r = 0; r < brickRowCount; r++) {
        bricks[c][r] = {
            x: 0,
            y: 0,
            status: 2
        };
    }
}

function draw() {    
    if (!paused) {
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        if (autoplayToggle.checked) {
            autoPlay();
        }
        drawPaddle();
        drawBricks();
        drawBall();
        collisionDetection();
        drawScore();
        drawLives();

        x += dx;
        y += dy;
    }
    if (x + dx > (canvas.width - ballRadius) || x + dx < ballRadius) {
        dx = -dx;
    }
    if (y + dy < ballRadius) {
        dy = -dy;
    } else if (y + dy > (canvas.height - (2 * ballRadius))) {

        if (x > paddleX && x < paddleX + paddleWidth) {
            dy = -dy;
            if (Math.abs(dx) < maxSpeed && Math.abs(dy) < maxSpeed) {
                dx *= speedMultiplier;
                dy *= speedMultiplier;

                console.log(dx);
            }
        } else {
            lives--;
            if (!lives) {
                alert("游戏结束");
                document.location.reload();
            } else {
                x = canvas.width / 2;
                y = canvas.height - 30;
                dx = 2;
                dy = -2;
                paddleX = (canvas.width - paddleWidth) / 2;
            }

        }

    }

    if (lives <= 0) {
        loseMessage.style.display = "block";
    }
    
    requestAnimationFrame(draw);
}

function drawBall() {
    ctx.beginPath();
    ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
    ctx.fillStyle = '#0095DD';
    ctx.fill();
    ctx.closePath();


}

function drawPaddle() {
    ctx.beginPath();
    ctx.rect(paddleX, paddleY, paddleWidth, paddleHeight);
    ctx.fillStyle = "#00FFFF";
    ctx.fill();
    ctx.closePath();

    if (rightPressed) {
        if (paddleX + paddleSpeed < canvas.width - paddleWidth) {
            paddleX += paddleSpeed;
        }
    } else if (leftPressed) {
        if (paddleX - paddleSpeed > 0) {
            paddleX -= paddleSpeed;
        }
    }
}

function autoPlay() {
    var newX = x - (paddleWidth / 2);

    if (newX >= 0 && newX <= canvas.width - paddleWidth) {
        paddleX = newX;
    }
}

function drawBricks() {
    for (c = 0; c < brickColumnCount; c++) {
        for (r = 0; r < brickRowCount; r++) {
            if (bricks[c][r].status > 0) {
                var brickX = (c * (brickWidth + brickPadding)) + brickOffsetLeft;
                var brickY = (r * (brickHeight + brickPadding)) + brickOffsetTop;
                bricks[c][r].x = brickX;
                bricks[c][r].y = brickY;
                ctx.beginPath();
                ctx.rect(brickX, brickY, brickWidth, brickHeight);
                ctx.fillStyle = bricks[c][r].status == 2 ? "#ddd000" : "#dd1e00";
                ctx.fill();
                ctx.closePath();
            }
        }
    }
}

function collisionDetection() {
    for (c = 0; c < brickColumnCount; c++) {
        for (r = 0; r < brickRowCount; r++) {
            var b = bricks[c][r];
            if (b.status != 0) {
                if (x > b.x && x < b.x + brickWidth && y - ballRadius > b.y && y - ballRadius < b.y + brickHeight) {
                    dy = -dy;
                    b.status--;

                    if (b.status == 0) {
                        dy = -dy;
                        score++;

                        if (score == brickRowCount * brickColumnCount) {
                            alert("恭喜你~ 你赢了!");
                            document.location.reload();
                        }
                    }
                }
            }
        }
    }
}

function drawScore() {
    ctx.font = "16px Arial";
    ctx.fillStyle = "#0095DD";
    ctx.fillText("得分: " + score, 8, 20);
}

function drawLives() {
    ctx.font = "16px Arial";
    ctx.fillStyle = "#0095DD";
    ctx.fillText("生命: " + lives, canvas.width - 65, 20);
}

function keyDownHandler(e) {
    if (e.keyCode == 39 || e.keyCode == 68) {
        rightPressed = true;
    } else if (e.keyCode == 37 || e.keyCode == 65) {
        leftPressed = true;
    }
}

function keyUpHandler(e) {
    if (e.keyCode == 39 || e.keyCode == 68) {
        rightPressed = false;
    } else if (e.keyCode == 37 || e.keyCode == 65) {
        leftPressed = false;
    }
}

function pauseKeyPress(e) {
    if (e.keyCode == 27) {
        paused = !paused;
        console.log(paused);
    }
}

function mouseMoveHandler(e) {
    var relativeX = e.clientX - canvas.offsetLeft;
    if (relativeX > 0 && relativeX < canvas.width) {
        var newPaddleX = relativeX - paddleWidth / 2;

        if (newPaddleX >= 0 && newPaddleX + paddleWidth <= canvas.width) {
            paddleX = newPaddleX;
        }
    }
}

document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
document.addEventListener("keyup", pauseKeyPress, false);
document.addEventListener("mousemove", mouseMoveHandler, false);
//setInterval(draw, 10);
draw();

站长提示:
1. 苦力吧素材官方QQ群:950875342
2. 平台上所有素材资源,需注册登录会员方能正常下载。
3. 会员用户积极反馈网站、素材资源BUG或错误问题,每次奖励2K币
4. PHP源码类素材,如需协助安装调试,或你有二次开发需求,可联系苦力吧客服。
5. 付费素材资源,需充值后方能下载,如有任何疑问可直接联系苦力吧客服
相关资源 / 抽奖&游戏

jquery无缝滚动在线抽奖机老虎机特效

一款模拟老虎机游戏机抽奖代码,停止和开始均为分开控制了,点击开始按钮,三位数字立即转动,按停止按钮可抽奖。
  抽奖&游戏
 9916  0

vue现金红包九宫格抽奖

一款基于vue的红包抽奖插件,可随意配置 m * n 宫格, 格子大小和形状可自定义,支持同步 / 异步抽奖, 概率前后端可控。
  抽奖&游戏
 3324  0

纯javascript在线网球双人小游戏代码

一款在线打网球小游戏源码,按住键盘上下方向键移动左侧人物,带比分显示。
  抽奖&游戏
 4307  0

jquery模拟老虎机滚动数字抽奖程序

0~9三列数字随机滚动,中奖结果每一列取一个数字,一共三个数字。
  抽奖&游戏
 9810  0

评论数(1) 回复有机会获得K币 用户协议

    masker0
    2023-12-10 13:58:49
    这个游戏源码不错~ 下载研究一下看看怎么二次开发~
    回复
😀
  • 😀
  • 😊
  • 😂
  • 😍
  • 😑
  • 😷
  • 😵
  • 😛
  • 😣
  • 😱
  • 😋
  • 😎
  • 😵
  • 😕
  • 😶
  • 😚
  • 😜
  • 😭
发表评论