時(shí)鐘是顯示了,為什么沒有小球彈跳出來?
//固定化的寫法
//var WINDOW_WIDTH = 1024;
//var WINDOW_HEIGHT = 768;
//var RADIUS = 8;
//var MARGIN_LEFT=30;
//var MARGIN_TOP = 60;
//從指定的時(shí)間倒計(jì)時(shí)到現(xiàn)在
//const endTime = new Date(2018,5,13,16,47,52);//js中月是0-11
//可以倒計(jì)時(shí)一個(gè)小時(shí)
//var endTime = new Date();
//endTime.setTime(endTime.getTime() + 3600 * 1000);
//var curShowTimeSeconds = 0;
var balls = [];
const color = ["#33B5E5", "#0099CC", "#AA66CC", "#9933CC", "#99CC00", "#669900", "#FFBB33", "#FF8800", "#FF4444", "#CC0000"];
window.onload = function () {
//屏幕的自適應(yīng)
? ? WINDOW_WIDTH = document.body.clientWidth;
? ? WINDOW_HEIGHT = document.body.clientHeight;
? ??
? ? MARGIN_LEFT = Math.round(WINDOW_WIDTH / 10);
? ? RADIUS = Math.round(WINDOW_WIDTH * 4 / 5 / 108) - 1;
? ? MARGIN_TOP = Math.round(WINDOW_HEIGHT / 5);
? ? //獲取繪圖環(huán)境
? ? var canvas = document.getElementById('canvas');
? ? var context = canvas.getContext("2d");
? ? canvas.width = WINDOW_WIDTH;
? ? canvas.height = WINDOW_HEIGHT;
? ? curShowTimeSeconds = getCurrentShowTimeSeconds()
? ??
? ? //setInterval制作動畫的一個(gè)簡單架構(gòu)
? ? //兩個(gè)參數(shù),一個(gè)是匿名函數(shù),一個(gè)是時(shí)間,每隔多少毫秒執(zhí)行一次這個(gè)函數(shù)
? ? setInterval(
? ? ? ? function(){
? ? ? ? ? ? ? render(context);//繪制當(dāng)前畫面
? ? ? ? ? ? ? update();//調(diào)整
? ? ? ? }
? ? ? ? ?,
? ? ? ? 50
? ? ? ? );
}
function getCurrentShowTimeSeconds() {
? ? var curTime = new Date();//當(dāng)前的時(shí)間
? ? var ret = curTime.getHours() * 3600 + curTime.getMinutes() * 60 + curTime.getSeconds();
? ? return ret;
? ? //var ret = endTime.getTime() - curTime.getTime();//毫秒數(shù)
? ? //ret = Math.round(ret / 1000)//轉(zhuǎn)換為秒
? ?// return ret >= 0 ? ret : 0;//倒計(jì)時(shí)到0顯示0
}
//處理時(shí)間的變化
function update() {
? ?
? ? var nextShowTimeSeconds = getCurrentShowTimeSeconds();
? ? var nextHours = parseInt(nextShowTimeSeconds / 3600);
? ? var nextMinutes = parseInt((nextShowTimeSeconds - nextHours * 3600) / 60);
? ? var nextSeconds = nextShowTimeSeconds % 60;
? ? var curHours = parseInt(curShowTimeSeconds / 3600);
? ? var curMinutes = parseInt((curShowTimeSeconds - curHours * 3600) / 60)
? ? var curSeconds = curShowTimeSeconds % 60;
? ? //時(shí)間改變
? ? if (nextSeconds != curSeconds)
? ? {
? ? ? ? //小球的生成
? ? ? ? if(parseInt(curHours/10)!=parseInt(nextHours/10))
? ? ? ? {
? ? ? ? ? ? addBalls(MARGIN_LEFT + 0, MARGIN_TOP, parseInt(curHours / 10));
? ? ? ? }
? ? ? ? if (parseInt(curHours % 10) != parseInt(nextHours % 10))
? ? ? ? {
? ? ? ? ? ? addBalls(MARGIN_LEFT + 15*(RADIUS+1), MARGIN_TOP, parseInt(curHours %10));
? ? ? ? }
? ? ? ? if (parseInt(curMinutes / 10) != parseInt(curMinutes / 10))
? ? ? ? {
? ? ? ? ? ? addBalls(MARGIN_LEFT + 39 * (RADIUS + 1), MARGIN_TOP, parseInt(curHours / 10));
? ? ? ? }
? ? ? ? if (parseInt(curMinutes % 10) != parseInt(curMinutes % 10))
? ? ? ? {
? ? ? ? ? ? addBalls(MARGIN_LEFT + 54 * (RADIUS + 1), MARGIN_TOP, parseInt(curHours % 10));
? ? ? ? }
? ? ? ? if (parseInt(curSeconds / 10) != parseInt(curSeconds / 10))
? ? ? ? {
? ? ? ? ? ? addBalls(MARGIN_LEFT + 78 * (RADIUS + 1), MARGIN_TOP, parseInt(curHours / 10));
? ? ? ? }
? ? ? ? if (parseInt(curSeconds % 10) != parseInt(curSeconds % 10))
? ? ? ? {
? ? ? ? ? ? addBalls(MARGIN_LEFT + 93 * (RADIUS + 1), MARGIN_TOP, parseInt(curHours %10));
? ? ? ? }
? ? ? ? curShowTimeSeconds = nextShowTimeSeconds;
? ? }
? ? updateBalls();//對已經(jīng)存在的小球進(jìn)行更新
? ? console.log(balls.length);//界面在調(diào)試時(shí)會顯示小球數(shù)組的個(gè)數(shù)
}
? ? //更新小球的狀態(tài):小球的基本運(yùn)動
function updateBalls()
{
? ? ? ?for (var i = 0; i < balls.length;i++)
? ? ? ?{
? ? ? ? ? ?balls[i].x += balls[i].vx;
? ? ? ? ? ?balls[i].y += balls[i].vy;
? ? ? ? ? ?balls[i].vy += balls[i].g;
? ? ? ? ? ?//碰撞原理
? ? ? ? ? ?if (balls[i].y >= WINDOW_HEIGHT - RADIUS) {
? ? ? ? ? ? ? ?balls[i].y = WINDOW_HEIGHT - RADIUS;
? ? ? ? ? ? ? ?balls[i].vy = -balls[i].vy * 0.75;
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?//性能優(yōu)化:判斷一個(gè)小球是否在畫面內(nèi)
? ? ? ?var cnt = 0;//代表留在畫布中的小球數(shù)量
? ? ? ?for (var i = 0; i < balls.length;i++)
? ? ? ?{
? ? ? ? ? ?//小球的右邊大于0加上小球的左邊小于屏幕的寬就證明小球還在屏幕里
? ? ? ? ? ?if (balls[i].x + RADIUS > 0 && balls[i].x - RADIUS < WINDOW_WIDTH)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?//如果小球在屏幕里 就把這個(gè)小球覆蓋數(shù)組中小球
? ? ? ? ? ? ? ?balls[cnt++]=ball[i]
? ? ? ? ? ?}
? ? ? ? ? ?//while (ball.length > cnt)
? ? ? ? ? ?//{
? ? ? ? ? ?//? ? balls.pop();//把cnt及以后的小球刪除掉
? ? ? ? ? ?//}
? ? ? ? ? ?//表示如果cnt小于300則balls.length就取cnt,否則就取300,,是為了保證計(jì)算機(jī)的性能
? ? ? ? ? ?while (balls.length > Math.min(300, cnt)) {
? ? ? ? ? ? ? ?balls.pop();
? ? ? ? ? ?}
? ? ? ?}
? ? }
//添加小球
function addBalls(x, y, num) {
? ? for (var i = 0; i < digit[num].length; i++)
? ? {
? ? ? ? for (var j = 0; j<digit[num][i].length; j++)
? ? ? ? {
? ? ? ? ? ? if(digit[num][i][j]==1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var aBall =
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? x: x + j * 2 * (RADIUS + 1) + (RADIUS + 1),
? ? ? ? ? ? ? ? ? ? y: y + i * 2 * (RADIUS + 1) + (RADIUS + 1),
? ? ? ? ? ? ? ? ? ? g: 1.5 + Math.random(),
? ? ? ? ? ? ? ? ? ? vx: Math.pow(-1, Math.ceil(Math.random() * 1000)) * 4,
? ? ? ? ? ? ? ? ? ? vy: -5,
? ? ? ? ? ? ? ? ? ? color:colors[Math.floor(Math.random()*color.length)]
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //push() 方法可向數(shù)組的末尾添加一個(gè)或多個(gè)元素,并返回新的長度
? ? ? ? ? ? ? ? balls.push(aBall);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? ? ??
}
//顯示時(shí)分秒
function render(cxt) {
? ? //clearRect對矩形空間內(nèi)的圖像進(jìn)行一個(gè)刷新操作
? ? //參數(shù)分別為:矩形空間左上角的x坐標(biāo)左上角的y坐標(biāo),要清除的矩形的寬度(以像素計(jì)),要清除的矩形的高度(以像素計(jì))
? ? cxt.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
? ? //當(dāng)前日期距離截止日期有多少小時(shí)、多少分鐘、多少秒,目前小時(shí)最大位數(shù)為 2個(gè),最多倒計(jì)時(shí)4天
? ? // var hours = 12
? ? //var minutes = 34
? ? //var seconds = 56
? ? var hours = parseInt(curShowTimeSeconds / 3600);
? ? var minutes = parseInt((curShowTimeSeconds - hours * 3600) / 60)
? ? var seconds=curShowTimeSeconds%60
? ?
? ? renderDigit(MARGIN_LEFT, MARGIN_TOP, parseInt(hours / 10), cxt)
? ? renderDigit(MARGIN_LEFT + 15 * (RADIUS + 1), MARGIN_TOP, parseInt(hours % 10), cxt)
? ? renderDigit(MARGIN_LEFT + 30 * (RADIUS + 1), MARGIN_TOP, 10, cxt)
? ? renderDigit(MARGIN_LEFT + 39 * (RADIUS + 1), MARGIN_TOP, parseInt(minutes / 10), cxt)
? ? renderDigit(MARGIN_LEFT + 54 * (RADIUS + 1), MARGIN_TOP, parseInt(minutes % 10), cxt)
? ? renderDigit(MARGIN_LEFT + 69 * (RADIUS + 1), MARGIN_TOP, 10, cxt)
? ? renderDigit(MARGIN_LEFT + 78 * (RADIUS + 1), MARGIN_TOP, parseInt(seconds / 10), cxt)
? ? renderDigit(MARGIN_LEFT + 93 * (RADIUS + 1), MARGIN_TOP, parseInt(seconds % 10), cxt)
? ? //對每個(gè)小球進(jìn)行繪制
? ? for (var i = 0; i < balls.length; i++) {
? ? ? ? alert("111")
? ? ? ? cxt.fillStyle = balls[i].color;
? ? ? ? cxt.beginPath();
? ? ? ? cxt.arc(balls[i].x, balls[i].y, RADIUS, 0, 2 * Math.PI, true);
? ? ? ? cxt.closePath();
? ? ? ? cxt.fill();
? ? }
}?
//畫圓
function renderDigit(x, y, num, cxt) {
? ? cxt.fillStyle = "rgb(0,102,153)";
? ? for (var i = 0; i < digit[num].length; i++)
? ? ? ? for (var j = 0; j < digit[num][i].length; j++)
? ? ? ? ? ? if (digit[num][i][j] == 1) {
? ? ? ? ? ? ? ? cxt.beginPath();
? ? ? ? ? ? ? ? cxt.arc(x+j*2*(RADIUS+1)+(RADIUS+1),y+i*2*(RADIUS+1)+(RADIUS+1),RADIUS,0,2*Math.PI);
? ? ? ? ? ? ? ? cxt.closePath();
? ? ? ? ? ? ? ? cxt.fill();
? ? ? ? ? ? }
}
2018-06-21
2018-06-21
你在判斷時(shí)分秒是否與后一個(gè)相等的時(shí)候,addBalls()函數(shù)里的num全是curHours,應(yīng)該改成對應(yīng)的curMinutes之類的
2018-06-13
效果是這樣
2018-06-13
都沒有生成小球??