为什么我的没有小球掉下来

来源:4-3 华丽的小球滚动效果

comlejade

2016-02-24 21:36

var WINDOW_WIDTH = 1024;
var WINDOW_HEIGHT =768;
var RADIUS = 6;
var MARGIN_TOP = 30;
var MARGIN_LEFT = 60;

const endTime = new Date(2016,1,27,12,30,30);
var curShowTime = 0;

var balls = []; 
const colors = ["#073155","#FFCE43","#DD5044","#00D2DC","#9C642D","#FFB439","#A6E22E","#FF1B2D"];

window.onload = function(){
	var canvas = document.getElementById("canvas");
	canvas.width = WINDOW_WIDTH;
	canvas.height = WINDOW_HEIGHT;
	var context = canvas.getContext("2d");

	curShowTime = getCurShowTime();
	setInterval(function(){
		render(context);
		update();
	},50);
}

function getCurShowTime(){
	var curTime = new Date();
	var ret = endTime.getTime() - curTime.getTime();
	ret = Math.round(ret/1000);
	return ret >= 0 ? ret : 0;
}


function update(){
	var nextShowTime = getCurShowTime();

	var nextHours = parseInt(nextShowTime/3600);
	var nextMinutes = parseInt(nextShowTime/60%60);
	var nextSeconds = parseInt(nextShowTime%60);

	var curHours = parseInt(curShowTime/3600);
	var curMinutes = parseInt(curShowTime/60%60);
	var curSeconds = parseInt(curShowTime%60);

	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(nextMinutes/10)){
			addBalls(MARGIN_LEFT+39*(RADIUS+1), MARGIN_TOP, parseInt(curMinutes/10));
		}

		if(parseInt(curMinutes%10) != parseInt(nextMinutes%10)){
			addBalls(MARGIN_LEFT+54*(RADIUS+1), MARGIN_TOP, parseInt(curMinutes%10));
		}

		if(parseInt(curSeconds/10) != parseInt(nextSeconds/10)){
			addBalls(MARGIN_LEFT+78*(RADIUS+1), MARGIN_TOP, parseInt(curSeconds/10));
		}

		if(parseInt(curSeconds%10) != parseInt(nextSeconds%10)){
			addBalls(MARGIN_LEFT+93*(RADIUS+1), MARGIN_TOP, parseInt(curSeconds%10));
		}
		curShowTime = nextShowTime;
	}

	updateBalls();
}

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.5;
		}
	}
}

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] ==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.randm()*colors.length)]
				};
				balls.push(aBall);
			}
			
		}
	}
}

function render(cxt){

	cxt.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); //刷新矩形

	var hours = parseInt(curShowTime/3600);
	var minutes = parseInt(curShowTime/60%60);
	var seconds = parseInt(curShowTime%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);

	for (var i = 0; i < balls.length; i++) {
		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();
			}
		}
	}
}


写回答 关注

1回答

  • 呵Sever
    2016-02-25 17:00:49
    已采纳

    addBall函数里的if(digit[num][i] ==1){}判断应该是if(digit[num][i][j] ==1){}

    同一个函数里,Math.random写成了Math.randm

    comlej...

    非常感谢!

    2016-02-26 21:13:01

    共 1 条回复 >

炫丽的倒计时效果Canvas绘图与动画基础

学习HTML5中最激动人心的技术Canvas,彻底释放自己的创造力

96746 学习 · 1000 问题

查看课程

相似问题