【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 ...
随机推荐
- table完美css样式,table的基本样式,table样式
table完美css样式,table的基本样式,table样式 >>>>>>>>>>>>>>>>> ...
- 微信上传图文消息素材40007,invalid media_id hint
上传图文消息素材40007,invalid media_id hint,微信40007 >>>>>>>>>>>>>> ...
- asp gridview批量删除和全选
本人新手刚学asp.net 全选和删除也是引用了他人的代码试了一试可以实现,感觉很好,就发了上来. 前台代码 <asp:GridView ID="GridView1" r ...
- jQuery 选择器【1】
jQuery 选择器 请使用我们的 jQuery 选择器检测器 来演示不同的选择器. 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname&q ...
- js实现简单计算器
效果图: 刚开始做时没考虑到清零和退格两个功能,嘻嘻,后来加的整体与传统计算器比有点小瑕疵. 代码: <!DOCTYPE html><html><head> < ...
- Spring Boot笔记(一)
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- Memcached认知[分布式]
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. Memcached的服务器客户端通信使用简单的基于文本行的协议. Memcached基于一个存储键/值对的 ...
- memcached 入门
memcached 是什么? Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. memcached 能够做些什么? 适用于大型网站,处理千万及的数据,而且 ...
- JS中关于clientWidth offsetWidth srollWidth等的含义
网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...
- QSslError 类
QSslError Class Header: #include <QSslError> qmake: QT += network Since: Qt 4.3 注意:这个类中的所有函数都是 ...