HTML5 Canvas弹跳小球小例子

1,Canvas实现动画的原理

(1)首先设置一个定时器,反复调用绘图函数(一般每秒30~40次)。每次调用,都会重绘整个画布。完成后的效果就像动画一样,每一帧间过渡会平滑而流畅。
(2)有两种方法都可以实现重复绘制:setTimeout()和setInterval()。用哪个可以自行决定。
(3)setInterval() 能保证精确地按时重绘,当又可能因此牺牲性能(如果绘图代码执行时间比设定时间还要长,浏览器将很难跟上,随着绘图代码的连续执行,页面会出现短暂地停顿)
(4)本例使用 setTimeout(),其运行等待时间设为20毫秒(这个是典型的动画延迟时间)。

2,小球弹跳动画

(1)点击“添加小球”按钮,会在画布上添加一个小球。
(2)添加的小球会向右下做自由落体运动,碰到地板、墙壁后会反弹。同时每次反弹会受到阻力的影响,稍稍减少速度。
(3)鼠标点击任意小球,会让该小球突然加速,让它向某个方向弹开。
(4)点击“清空画布”按钮,会清除页面上的所有小球。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>hangge.com</title>
<style>
    canvas {
      cursor: pointer;
      border: 1px solid black;
    }
</style>
<script>
// 用于表示球的所有细节的Ball函数
function Ball(x, y, dx, dy, radius) {
  this.x = x;
  this.y = y;
  this.dx = dx;
  this.dy = dy;
  this.radius = radius;
  this.strokeColor = "black";
  this.fillColor = "red";
}
 
// 这个数组用于保存画布上出现的所有球
var balls = [];
 
var canvas;
var context;
 
window.onload = function() {
  canvas = document.getElementById("canvas");
  context = canvas.getContext("2d");
  canvas.onmousedown = canvasClick;
  // 每0.02秒绘制一次画布
  setTimeout(drawFrame, 20);
};
 
function addBall() {
  // 小球半径
  var radius = 20;
  // 创建新的ball对象
  var ball = new Ball(50,50,1,1,radius);
  // 将其保存在balls数组中
  balls.push(ball);
}
 
function clearBalls() {
  // 删除所有球对象
  balls = [];
}
 
function drawFrame() {
  // 清除画布
  context.clearRect(0, 0, canvas.width, canvas.height);
 
  context.beginPath();
 
  // 循环所有的球
  for(var i=0; i<balls.length; i++) {
    // 把每个球移动到新的位置
    var ball = balls[i];
    ball.x += ball.dx;
    ball.y += ball.dy;
 
    // 添加重力作用的效果,让球加速下落
    if ((ball.y) < canvas.height) ball.dy += 0.22;
    // 添加摩擦力作用的效果,减慢左右移动速度
    ball.dx = ball.dx * 0.998;
    // 如果球碰到某一边,就反弹回来
    if ((ball.x + ball.radius > canvas.width) || (ball.x - ball.radius < 0)) {
      ball.dx = -ball.dx;
    }
    // 如果球碰到底部,反弹回来,但慢慢地减速
    if ((ball.y + ball.radius > canvas.height) || (ball.y - ball.radius < 0)) {
      ball.dy = -ball.dy*0.96;
    }
 
    context.beginPath();
    context.fillStyle = ball.fillColor; 
 
    // 绘制球
    context.arc(ball.x, ball.y, ball.radius, 0, Math.PI*2);
    context.lineWidth = 1;
    context.fill();
    context.stroke();
  }
 
  // 20毫秒后绘制下一帧
  setTimeout(drawFrame, 20);
}
 
function canvasClick(e) {
  // 获取点击的坐标
  var clickX = e.pageX - canvas.offsetLeft;
  var clickY = e.pageY - canvas.offsetTop;
 
  // 找到点中的小球
  for(var i in balls)
  {
    var ball = balls[i];
    if ((clickX > (ball.x-ball.radius)) && (clickX < (ball.x+ball.radius)))
    {
      if ((clickY > (ball.y-ball.radius)) && (clickY < (ball.y+ball.radius)))
      {
        // 改变点击的小球速度
        ball.dx -= 2;
        ball.dy -= 3;
        return;
      }
    }
  }
}
</script>
</head>
<body>
  <canvas id="canvas" width="400" height="300">
  </canvas>
  <div>
    <button onclick="addBall()">添加小球</button>
    <button onclick="clearBalls()">清空画布</button>
  </div>
</body>
</html>

时间: 2024-08-02 06:37:19

HTML5 Canvas弹跳小球小例子的相关文章

HTML5 Canvas开发迷宫游戏例子

本文介绍如何使用Canvas画布制作一个简单的迷宫游戏:用户按下方向键时,笑脸图标会沿相应的方向移动(移动时有动画效果),遇到墙壁时(碰撞检测)就会停下来. 1,在线样例加载困难迷宫 加载简单迷宫 开发迷宫游戏例子-html5 canvas绘图例子"> 2,实现原理(1)迷宫的生成:我们这里是使用一幅迷宫图片,然后把整幅图绘制到画布上. (2)通过设置 window.onkeydown 的响应函数 processKey(),当用户按下方向键的时候,根据键码调整笑脸各方向上的速度. (3)d

使用CoffeeScript和HTML5 canvas元素创建小游戏

小游戏是学习新技术的一种有趣方式.本文将引导您使用 CoffeeScript 和http://www.aliyun.com/zixun/aggregation/79228.html"> HTML5 canvas元素亲自实现Conway 的 Game of Life .尽管Conway 的 Game of Life 可能算不上一个游戏,但它是一个非常容易管理的出色的小任务. 在技术方面,您将需要: 一个可处理 HTML5 canvas元素的最 新的 Web 浏览器. CoffeeScript

HTML5 - Canvas动画效果的例子

1,样例说明 (1)在没有鼠标介入的情况下,这些球就像有磁性一样拼成"Google"字样. (2)在鼠标移动到其中后,小球像是受到了排斥,向画布的四周扩散,然后不规则地反弹回来. <!DOCTYPE HTML> <html>   <head>     <style>       body {         margin: 0px;         padding: 0px;       }       canvas {        

HTML5 Canvas画图板的例子

功能很简单,原理其实和拖放是类似的,主要是三个事件: 在canvas 上绑定mousedown 事件以标志绘画的开始(调用moveTo 移动画笔) 在document 上绑定mousemove 事件来处理绘画时的行为(调用lineTo 以及stroke 进行绘画) 在document 上绑定mouseup 事件以标志绘画的结束(解绑document 上的两个事件) 实现时需特别注意的一点是调用moveTo 以及lineTo 方法时如何传递正确的坐标值,这个坐标值应该是光标相对于canvas 左上

HTML5 随机弹跳的小球

原文:HTML5 随机弹跳的小球 查看效果:http://keleyi.com/a/bjad/tc1y11dy.htm Chrome效果图: 火狐效果图: 以下是源码: 1 <!doctype html> 2 <html> 3 <head> 4 <title>HTML5 随机弹跳的小球-柯乐义</title> 5 <style> 6 body{ 7 font-family: 微软雅黑; 8 } 9 body,h1{ 10 margin

如何开发一个简单的HTML5 Canvas 小游戏

原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wizard's Lizard这个游戏的半数以上开发是由我完成的) 我们直接来看源码里的game.js,当然你也可以在线体验一下游戏先. 游戏截图 创建画布 // Create the canvas var canvas = document.createElement("canvas"); v

使用 HTML5 Canvas 实现移动平台动画(游戏)的一些痛点和思路

前言 最近一直在做一些HTML5 Canvas加速方面的事情,HTML5已经出来相当长一段时间,各浏览器厂商也基本上已经支持!从目前来看,HTML5的大规模普及还是雷声大,雨点小:但从长远来看,HTML5由于其诸多优点,比如本文提到到Canvas元素支持,将会逐渐成为主流,特别是在复杂场景应用中! 本文主要从目前HTML5 Canvas 在实现动画(游戏)中遇到的部分痛点入手,尝试提供一些相应的解决办法和思路! 痛点 性能问题:目前性能问题HTML5 Canvas的性能问题在Android中表现

HTML5 Canvas的事件处理介绍

  HTML5 Canvas的事件处理介绍        DOM是Web前端领域非常重要的组成部分,不仅在处理HTML元素时会用到DOM,图形编程也同样会用到.比如SVG绘图,各种图形都是以DOM节点的形式插入到页面中,这就意味着可以使用DOM方法对图形进行操作.比如有一个 元素,可以直接用jquery增加click事件$('#p1').click(function(){-})".然而这种DOM处理方法在HTML5的Canvas里不再适用,Canvas使用的是另外一套机制,无论在Canvas上绘

HTML5 Canvas API详解

HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C "工作草案" - 意味着它仍然处于开发阶段 - 它包含丰富的元素和属性,它们都支持现行的 HTML 4.01 版本规范.它还引入了几个新元素和属性,它们适用许多使用 web 页面的领域 - 音频.视频.图形.数据存储.内容呈现,等等.本文主要关注图形方面的增强:canvas. 新的 HTML5 canvas 是一个原生 HTML 绘图簿,用于 JavaScript 代码,不使用第三