【canvas】基于坐标的碰撞检测 / 基本的动画 / 多物体动画

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
canvas {
border: 2px dotted #ddd
}
</style>
</head>
<body>
<canvas id="canvas1" width="400" height="400"></canvas>
<canvas id="canvas2" width="400" height="400"></canvas>
<script>
var canvas1 = document.getElementById('canvas1')
var context1 = canvas1.getContext('2d')
function randomFromTo(from, to) {
return Math.floor(Math.random() * (to - from) + from)
}
function Circle(x, y, radius, color) {
this.x = x
this.y = y
this.radius = radius
this.color = color
this.isSelected = false
} var circles = []
function addRandomCircle() {
var radius = randomFromTo(10, 60)
var x = randomFromTo(0, canvas1.width)
var y = randomFromTo(0, canvas1.height) var colors = ['green', 'blue', 'red', 'yellow', 'magenta', 'orange', 'brown', 'purple', 'pink']
var color = colors[randomFromTo(0, 8)]
var circle = new Circle(x, y, radius, color)
circles.push(circle)
}
function drawCircles() {
context1.clearRect(0, 0, canvas1.width, canvas1.height)
context1.globalAlpha = 0.85
context1.strokeStyle = 'black' for (var i = 0, l = circles.length; i < l; i++) {
var circle = circles[i]
if (circle.isSelected) {
context1.lineWidth = 5
} else {
context1.lineWidth = 1
}
context1.beginPath()
context1.arc(circle.x, circle.y, circle.radius, 0, Math.PI*2)
context1.fillStyle = circle.color
context1.fill()
context1.stroke()
}
}
var previousSelectedCircle = null
function canvasClick(e) {
var clickX = e.pageX - canvas1.offsetLeft
var clickY = e.pageY - canvas1.offsetTop
for (var i = circles.length; i > 0; i--) {
var circle = circles[i - 1]
var distanceFromCenter = Math.sqrt(Math.pow(circle.x - clickX, 2) + Math.pow(circle.y - clickY, 2))
if (distanceFromCenter <= circle.radius) {
if (previousSelectedCircle != null) {
previousSelectedCircle.isSelected = false
}
previousSelectedCircle = circle
circle.isSelected = true
drawCircles()
return
}
}
}
addRandomCircle()
addRandomCircle()
addRandomCircle()
addRandomCircle()
addRandomCircle()
addRandomCircle()
addRandomCircle()
addRandomCircle()
drawCircles()
canvas1.onclick = canvasClick var canvas2 = document.getElementById('canvas2')
var context2 = canvas2.getContext('2d')
var squarePosition_y = 0
var squarePosition_x = 10
function drawFrame() {
context2.clearRect(0, 0, canvas2.width, canvas2.height)
context2.beginPath()
context2.rect(squarePosition_x, squarePosition_y, 10, 10)
context2.lineStyle = 'black'
context2.lineWidth = 1
context2.stroke()
if (squarePosition_y > canvas2.height) {
squarePosition_y = 0
} else {
squarePosition_y += 1
}
setTimeout('drawFrame()', 20)
}
setTimeout('drawFrame()', 20)
</script>
</body>
</html>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<canvas id="canvas" width="600" height="400" style="border:1px solid #ddd;"></canvas>
<button id="add">Add Ball</button>
<button id="clear">Clear Canvas</button>
<input id="ballSize" type="number">
<input id="connectedBalls" type="checkbox">
Connect Balls
<script>
function Ball(x, y, dx, dy, radius) {
this.x = x
this.y = y
this.dx = dx
this.dy = dy
this.radius = radius
this.color = 'red'
}
var balls = []
function addBall() {
var radius = parseFloat(document.getElementById('ballSize').value)
var ball = new Ball(50, 50, 1, 1, radius)
balls.push(ball)
}
function clearBall() {
balls = []
}
document.getElementById('add').onclick = addBall
document.getElementById('clear').onclick = clearBall
var canvas = document.getElementById('canvas')
var context = canvas.getContext('2d')
setTimeout('drawFrame()', 20)
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
}
if (!document.getElementById('connectedBalls').checked) {
context.beginPath()
context.fillStyle = ball.color
} else {
context.fillStyle = 'white'
}
context.arc(ball.x, ball.y, ball.radius, 0, Math.PI*2)
context.lineWidth = 1
context.fill()
context.stroke()
}
setTimeout('drawFrame()', 20)
}
</script>
</body>
</html>
【canvas】基于坐标的碰撞检测 / 基本的动画 / 多物体动画的更多相关文章
- 10款基于HTML5+CSS3实现的超酷源码动画
		
1.基于Bootstrap的jQuery登录表单 这是一款基于Bootstrap的登录表单,表单的外观自然不用说,沿用了Bootstrap的风格,非常漂亮.这款登录表单有一个经过CSS3处理过的头像图 ...
 - 基于坐标的自动化测试神器---Total Control快速入门
		
1.Total Control简单介绍 一款能够在PC上控制手机的软件,同时可以使用PC 触摸屏.鼠标.键盘, 全面操控 Android 手机,只需通过 USB 或 WiFi 连接手机至电脑,即可随时 ...
 - 基于swiper的移动端H5页面,丰富的动画效果
		
概述 通过运用swiper插件,制作移动端上下整屏滑动的H5页面,用来宣传或者简单注册等,可以嵌套H5音乐或者视频. 详细 代码下载:http://www.demodashi.com/demo/119 ...
 - 笔记-动画篇-layout动画初体验
		
约束动画的文章要比预计的迟迟来临,最大的原因是没有找到我认为的足够好的动画来讲解约束动画 —— 当然了,这并不是因为约束动画太难.相反,因为约束动画实在太简单了,反而没有足够多的简单动画素材让我选用. ...
 - 【转】android动画之Tween动画 (渐变、缩放、位移、旋转)
		
原文:http://blog.csdn.net/feng88724/article/details/6318430 Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的 ...
 - Android 动画基础——视图动画(View Animation)
		
本篇讲android 3.0之前被广泛的动画框架——ViewAnimation. 目录 我将分为六部分来讲: 概述 Alpha透明动画 Rotate旋转动画 Translate位移动画 Scale放缩 ...
 - 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画
		
CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...
 - View动画和属性动画
		
在应用中, 动画效果提升用户体验, 主要分为View动画和属性动画. View动画变换场景图片效果, 效果包括平移(translate), 缩放(scale), 旋转(rotate), 透明(alph ...
 - 背水一战 Windows 10 (15) - 动画: 缓动动画
		
[源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...
 
随机推荐
- SAMBA用户访问指定的目录
			
指定某个用户访问一个特定的共享文件夹sfx 用户可以访问abc目录 别的用户不可以访问abc目录 先创建一个用户命令useradd sfx 创建一个smbpasswd用户 在创建这个用户时要先创建一个 ...
 - CSS伪类选择器和伪元素选择器
			
CSS的伪类选择器常用的是link/visited/hover/active,分别对应未访问.已访问过.鼠标悬停.鼠标按下时的样式,常用于链接,使用时要按此顺序依次写CSS,不能乱 a:link{ba ...
 - PHP制作简单的日历
			
在这里分享一个PHP制作的日历 <?php //万年历if($_GET['year']){$year = $_GET['year'];}else{$year = date("Y&quo ...
 - wpf 自定义窗体的实现
			
首先创建自定义窗体的资源文件 <ControlTemplate x:Key="BaseWindowControlTemplate" TargetType="Wind ...
 - window远程连接linux
			
一.字符界面连接Linux 1.直接使用window自带的telnet. 2.但现在Linux一般都不启用telnet,而是启用ssh.这样的话,window就要安装客户端来访问Linux了.这 ...
 - NUnit + VS2010 简单入门
			
一.环境准备 1. NUnit 2.6.3 下载地址:https://launchpadlibrarian.net/153448476/NUnit-2.6.3.msi 2. VS2010 二.安装 N ...
 - 三种C#.net生成静态页面的方法
			
ASP.NET生成静态页面方法主要有三种 第一种方法:向服务器的动态页面发送请求,获取页面的html代码.这种方法缺点显而易见:速度慢.另外如果请求的动态页面有验证控件的话,返回的html页面却无 ...
 - 关于 const 成员函数
			
成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如 ...
 - 一个在线的C++帮助文档网站  转载
			
http://www.cplusplus.com/ //C++参考 http://www.cppreference.com/wiki/start //C++参考 http ...
 - 如何在一个网站或者一个页面,去书写你的JS代码
			
// JavaScript Document //如何在一个网站或者一个页面,去书写你的JS代码: //1.js的分层(功能) : jquery(tools) 组件(ui) 应用(app), mvc( ...