以下是 flappy bird压扁小鸟小游戏js代码 的示例演示效果:
部分效果截图:
HTML代码(index.html):
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>flappy bird压扁小鸟小游戏</title>
<meta name="description" content="你恨 flappy bird 吗?你每天晚上对着那个愚蠢的鸟做噩梦吗? 压扁它们!.">
<meta property="og:description" content="你恨 flappy bird 吗?你每天晚上对着那个愚蠢的鸟做噩梦吗? 压扁它们!.">
<meta property="og:type" content="website">
<meta property="og:title" content="Squishy Bird">
<meta property="og:site_name" content="Squishy Birds">
<meta property="og:image" content="./src/wav/fbthumb.jpg">
<meta name="viewport" content="user-scalable=no, initial-scale=0.5, width=610, height=1024">
<link rel="image_src" href="./src/wav/fbthumb.jpg">
</head>
<body style="margin: 0px; overflow: hidden;-moz-user-select: none;-webkit-user-select: none;user-select: none;" >
<div id="lgd" style="width: 300px; height: 64px; position: absolute; left: 533px; top: 301px; font-family: Verdana; font-size: 16px; font-weight: bold; text-align: center;">Loading...</div>
<script type="text/javascript" src="./src/squishybird.js"></script>
<div style="overflow: hidden; position: relative; width: 1366px; height: 620px;">
<canvas width="1366" height="620"></canvas>
<img src="./src/wav/pipe1.png" width="148" height="1664" style="position: absolute; left: 609px; top: -1533px; z-index: 420;"><img src="./src/wav/pipe2.png" width="148" height="1664" style="position: absolute; left: 609px; top: 400.9999999999999px; z-index: 420;">
<canvas width="1366" height="88" style="position: absolute; z-index: 31337; left: 0px; top: 532px;"></canvas>
<canvas width="1366" height="256" style="position: absolute; z-index: 60; left: 0px; top: 276px;"></canvas>
<canvas width="1366" height="216" style="position: absolute; z-index: 61; left: 0px; top: 316px;"></canvas>
<img src="./src/wav/logo.png" style="position: absolute; opacity: 0; z-index: 42069; left: 370px; top: 174px; display: none;"><img src="./src/wav/gameover.png" style="position: absolute; opacity: 1; z-index: 42069; left: 370px; top: 93px; display: inline;"><img src="./src/wav/clicktostart.png" style="position: absolute; opacity: 0; z-index: 42070; left: 514px; top: 435px; display: none;">
<div style="width: 800px; height: 24px; position: absolute; text-align: center; font-family: Verdana; font-size: 12px; z-index: 87654; left: 283px; top: 592px; display: none;">适用浏览器:360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗. 不支持IE8及以下浏览器。</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 536px; top: 17px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 535px; top: 17px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 534px; top: 17px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 533px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 533px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 533px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(255, 255, 255); z-index: 88888; -webkit-user-select: none; left: 533px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 533px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 533px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 533px; top: 17px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 532px; top: 17px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 531px; top: 17px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 23px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 22px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 21px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 20px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 19px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 18px;">0</div>
<div style="width: 300px; height: 50px; position: absolute; text-align: center; font-family: Verdana; font-weight: bold; font-size: 30px; color: rgb(0, 0, 0); z-index: 88887; -webkit-user-select: none; left: 530px; top: 17px;">0</div>
<canvas width="150" height="150" style="z-index: 69; position: absolute; left: 880.7973799593747px; top: 288.1699138371274px;"></canvas>
<canvas width="150" height="150" style="z-index: 69; position: absolute; left: 94.18296936130267px; top: 175.22475277371694px;"></canvas>
<canvas width="150" height="150" style="z-index: 69; position: absolute; left: 147.39346598794316px; top: 196.6628938429057px;"></canvas>
<canvas width="150" height="150" style="z-index: 69; position: absolute; left: -235.79706690685066px; top: -486.7269952782424px;"></canvas>
</div>
<audio src="./src/wav/flap.wav"></audio>
<audio src="./src/wav/flap.wav"></audio>
<audio src="./src/wav/flap.wav"></audio>
<audio src="./src/wav/flap.wav"></audio>
<audio src="./src/wav/flap.wav"></audio>
<audio src="./src/wav/slide.wav"></audio>
<audio src="./src/wav/slide.wav"></audio>
<audio src="./src/wav/slide.wav"></audio>
<audio src="./src/wav/clang.wav"></audio>
<audio src="./src/wav/clang.wav"></audio>
<audio src="./src/wav/clang.wav"></audio>
<audio src="./src/wav/coin.wav"></audio>
<audio src="./src/wav/coin.wav"></audio>
<audio src="./src/wav/coin.wav"></audio>
<audio src="./src/wav/coin2.wav"></audio>
<audio src="./src/wav/coin2.wav"></audio>
<audio src="./src/wav/coin2.wav"></audio>
<audio src="./src/wav/coin3.wav"></audio>
<audio src="./src/wav/coin3.wav"></audio>
<audio src="./src/wav/coin3.wav"></audio>
<audio src="./src/wav/coin4.wav"></audio>
<audio src="./src/wav/coin4.wav"></audio>
<audio src="./src/wav/coin4.wav"></audio>
<audio src="./src/wav/kick.wav"></audio>
<audio src="./src/wav/kick.wav"></audio>
<audio src="./src/wav/kick.wav"></audio>
<audio src="./src/wav/kick.wav"></audio>
<audio src="./src/wav/kick.wav"></audio>
<audio src="./src/wav/kick2.wav"></audio>
<audio src="./src/wav/kick2.wav"></audio>
<audio src="./src/wav/kick2.wav"></audio>
<audio src="./src/wav/kick2.wav"></audio>
<audio src="./src/wav/kick2.wav"></audio>
<audio src="./src/wav/kick3.wav"></audio>
<audio src="./src/wav/kick3.wav"></audio>
<audio src="./src/wav/kick3.wav"></audio>
<audio src="./src/wav/kick3.wav"></audio>
<audio src="./src/wav/kick3.wav"></audio>
<audio src="./src/wav/kick4.wav"></audio>
<audio src="./src/wav/kick4.wav"></audio>
<audio src="./src/wav/kick4.wav"></audio>
<audio src="./src/wav/kick4.wav"></audio>
<audio src="./src/wav/kick4.wav"></audio>
<audio src="./src/wav/kick5.wav"></audio>
<audio src="./src/wav/kick5.wav"></audio>
<audio src="./src/wav/kick5.wav"></audio>
<audio src="./src/wav/kick5.wav"></audio>
<audio src="./src/wav/kick5.wav"></audio>
<audio src="./src/wav/squish1.wav"></audio>
<audio src="./src/wav/squish1.wav"></audio>
<audio src="./src/wav/squish1.wav"></audio>
<audio src="./src/wav/squish2.wav"></audio>
<audio src="./src/wav/squish2.wav"></audio>
</body>
</html>
JS代码(squishybird.js):
document.body.style.margin = '0px';
document.body.style.overflow = 'hidden';
var raf = function (x){
alert('Your browser is not compatible with this site. Sorry:(');
}
if (window.requestAnimationFrame) raf = window.requestAnimationFrame;
// Firefox 23 / IE 10 / Chrome / Safari 7 (incl. iOS)else if (window.mozRequestAnimationFrame) raf = window.mozRequestAnimationFrame;
// Firefox < 23else if (window.webkitRequestAnimationFrame) raf = window.webkitRequestAnimationFrame;
// Older versions of Safari / Chromevar game ={
}
;
game.ended = false;
game.div = document.createElement('div');
game.div.style.overflow = 'hidden';
game.div.style.position = 'relative';
game.div.style.width = '100%';
game.div.style.height = '100%';
document.body.appendChild(game.div);
var resize = function (){
ww = Math.ceil(window.innerWidth);
hh = Math.ceil(window.innerHeight);
var fblikebox = document.getElementById('fblikebox');
var googbox = document.getElementById('googbox');
if (fblikebox){
if (hh < 710){
fblikebox.style.right = '178px';
if (googbox){
googbox.style.bottom = '5px';
googbox.style.top = 'auto';
}
}
else{
fblikebox.style.right = '8px';
if (googbox){
googbox.style.top = '5px';
googbox.style.bottom = 'auto';
}
}
}
game.div.style.width = ww+'px';
game.div.style.height = hh+'px';
pipe_center = (hh - 88)/2;
game.canvas.width = ww;
game.canvas.height = hh;
game.ctx.fillStyle = '#71c5cf';
game.ctx.fillRect(0,0,ww,hh);
ground.canvas.width = ww;
ground.canvas.height = 88;
ground.ctx.fillStyle = '#ddd894';
ground.ctx.fillRect(0,0,ww,88);
var gx = 0;
while (gx < ww){
ground.ctx.drawImage(ground.bit,gx,0);
gx += 48;
}
ground.canvas.style.left = '0px';
ground.canvas.style.top = (hh - 88)+'px';
logo.reposition();
gameover.reposition();
c2s.reposition();
//fbshare.reposition();
playagain.reposition();
parody.div.style.left = Math.round((ww - 800)/2)+'px';
parody.div.style.top = (hh - 28)+'px';
var i = 0;
for (var xx = -3;
xx <= 3;
xx++){
for (var yy = -3;
yy <= 3;
yy++){
var div = score.divs[i];
i++;
div.style.left = Math.round(xx + (ww - 300)/2)+'px';
div.style.top = (yy + 20)+'px';
}
}
city.canvas.width = ww;
city.canvas.height = 256;
city.ctx.clearRect(0,0,ww,256);
var gx = 0;
while (gx < ww){
city.ctx.drawImage(city.bit,gx,0);
gx += 300;
}
city.canvas.style.left = '0px';
city.canvas.style.top = (hh - 256 - 88)+'px';
trees.canvas.width = ww;
trees.canvas.height = 216;
trees.ctx.clearRect(0,0,ww,216);
var gx = 0;
while (gx < ww){
trees.ctx.drawImage(trees.bit,gx,0);
gx += 300;
}
trees.canvas.style.left = '0px';
trees.canvas.style.top = (hh - 216 - 88)+'px';
pipe_x = Math.floor(ww/2 - 148/2);
pipe1.img.style.left = pipe_x+'px';
pipe2.img.style.left = pipe_x+'px';
for (var i = bloods.length-1;
i>=0;
i--){
var blood = bloods[i];
repositionBlood(blood);
}
}
var want_image_count = 0;
var loadGameImage = function (n){
want_image_count++;
var o = document.createElement('img');
o.onload = function (){
want_image_count--;
if ((want_image_count == 0) && (want_sound_count == 0)){
gameLoaded();
}
}
o.src = n;
return o;
}
//var sounds_playing = [];
var want_sound_count = 0;
var loadGameSound = function (n,chc){
// file name,channel count var o ={
}
;
o.channels = [];
o.channel_pos = 0;
o.chc = chc;
o.play = function (){
var tm = new Date().getTime();
var sc = this.channels.length;
var got_good_sound = false;
var ch;
for (var i = sc;
i>=0;
i--){
this.channel_pos++;
if (this.channel_pos >= this.channels.length){
this.channel_pos = 0;
}
var ch = this.channels[this.channel_pos];
//if (ch.can_play){
got_good_sound = true;
break;
//}
}
if (got_good_sound){
//ch.sound.currentTime = 1;
ch.sound.play();
//ch.can_play = false;
//sounds_playing.push(ch);
}
}
//want_sound_count++;
/* var ao = document.createElement("audio");
ao.sndo = o;
ao.addEventListener('canplaythrough',function (){
//want_sound_count--;
var o = this.sndo;
for (var i = 0;
i<0*o.chc;
i++){
var sch ={
}
;
sch.sound = this.cloneNode(true);
//sch.can_play = true;
o.channels.push(sch);
}
var sch ={
}
;
sch.sound = this;
//sch.can_play = true;
o.channels.push(sch);
if ((want_image_count == 0) && (want_sound_count == 0)){
gameLoaded();
}
}
,false);
*/
for (var i = 0;
i<chc;
i++){
var ao = document.createElement("audio");
var sch ={
}
;
sch.sound = ao;
sch.can_play = true;
o.channels.push(sch);
ao.src = n;
ao.type = "audio/wav";
document.body.appendChild(ao);
}
return o;
}
var bottom_pipe_gap = 270;
var pipe_gap = bottom_pipe_gap;
var pipe_center = 500;
var pipe_closing = -1;
var pipe_opening = -1;
var pipe_x;
var game_loaded = false;
var gameLoaded = function (){
game.div.appendChild(game.canvas);
game.div.appendChild(pipe1.img);
game.div.appendChild(pipe2.img);
game.div.appendChild(ground.canvas);
game.div.appendChild(city.canvas);
game.div.appendChild(trees.canvas);
game.div.appendChild(logo.img);
game.div.appendChild(gameover.img);
//document.body.appendChild(fbshare.img);
document.body.appendChild(playagain.img);
game.div.appendChild(c2s.img);
game.div.appendChild(parody.div);
for (var i = score.divs.length-1;
i>=0;
i--){
game.div.appendChild(score.divs[i]);
}
game_loaded = true;
resize();
raf(oef);
oef();
//document.body.addEventListener("touchstart",poundPipes,false);
document.body.onmousedown = function (){
poundPipes();
}
document.body.onkeydown = function (e){
if (e.keyCode == 32){
poundPipes();
}
}
}
var poundPipes = function (){
if (game.ended){
// then we have to set ended=false with the play again button return false;
}
if (!game.started){
fr = 0;
nbfr = fnbfr = 100;
points = 0;
score.update();
for (var i = birds.length-1;
i>=0;
i--){
var bird = birds[i];
bird.canvas.width = 1;
bird.canvas.height = 1;
game.div.removeChild(bird.canvas);
birds.splice(i,1);
}
game.started = true;
logo.showing = false;
logo.hiding = true;
gameover.showing = false;
gameover.hiding = true;
c2s.showing = false;
c2s.hiding = true;
/* fbshare.showing = false;
fbshare.hiding = true;
*/
playagain.showing = false;
playagain.hiding = true;
parody.div.style.display = 'none';
points = 0;
score.update();
}
want_pound = true;
if (pipe_opening == -1){
if (pipe_closing == -1){
pipe_closing = 0;
want_pound = false;
pipeslide.play();
return true;
}
}
return false;
}
var want_pound = false;
var ww = 768;
var hh = 920;
var bird_images = [];
var angry_bird_images = [];
for (var i = 1;
i<=3;
i++){
var o ={
}
;
var img = loadGameImage('./src/wav/bird'+i+'.png');
o.img = img;
bird_images.push(o);
var o ={
}
;
var img = loadGameImage('./src/wav/angrybird'+i+'.png');
o.img = img;
angry_bird_images.push(o);
}
bird_images.push(bird_images[1]);
// this one final push makes the wing animation loop correctlyangry_bird_images.push(angry_bird_images[1]);
// this one final push makes the wing animation loop correctlyvar flap = loadGameSound('./src/wav/flap.wav',5);
var pipeslide = loadGameSound('./src/wav/slide.wav',3);
var clang = loadGameSound('./src/wav/clang.wav',3);
var coin1 = loadGameSound('./src/wav/coin.wav',3);
var coin2 = loadGameSound('./src/wav/coin2.wav',3);
var coin3 = loadGameSound('./src/wav/coin3.wav',3);
var coin4 = loadGameSound('./src/wav/coin4.wav',3);
var kick = loadGameSound('./src/wav/kick.wav',5);
var kick2 = loadGameSound('./src/wav/kick2.wav',5);
var kick3 = loadGameSound('./src/wav/kick3.wav',5);
var kick4 = loadGameSound('./src/wav/kick4.wav',5);
var kick5 = loadGameSound('./src/wav/kick5.wav',5);
var kicks = [kick,kick2,kick3,kick4,kick5];
var squish1 = loadGameSound('./src/wav/squish1.wav',3);
var squish2 = loadGameSound('./src/wav/squish2.wav',3);
var squishes = [squish1,squish2];
var clanging = -1;
game.canvas = document.createElement('canvas');
game.canvas.width = ww;
game.canvas.height = hh;
game.ctx = game.canvas.getContext('2d');
game.started = false;
game.ctx.fillStyle = '#71c5cf';
game.ctx.fillRect(0,0,ww,hh);
var logo ={
}
;
logo.a = -.2;
logo.fr = 0;
logo.showing = true;
logo.hiding = false;
logo.img = loadGameImage('./src/wav/logo.png');
// 626 x 144logo.img.style.position = 'absolute';
logo.img.style.opacity = 0;
logo.img.style.zIndex = '42069';
logo.reposition = function (){
logo.img.style.left = Math.floor((ww-626)/2)+'px';
logo.img.style.top = Math.floor(Math.cos(logo.fr/9)*20 + (hh - 144 - 88)/2)+'px';
}
var gameover ={
}
;
gameover.a = -.2;
gameover.fr = 0;
gameover.showing = false;
gameover.hiding = true;
gameover.img = loadGameImage('./src/wav/gameover.png');
// 626 x 144gameover.img.style.position = 'absolute';
gameover.img.style.opacity = 0;
gameover.img.style.zIndex = '42069';
gameover.reposition = function (){
gameover.img.style.left = Math.floor((ww-626)/2)+'px';
gameover.img.style.top = Math.floor(Math.cos(gameover.fr/32)*4 + (hh - 200 - 144 - 88)/2)+'px';
}
/*var fbshare ={
}
;
// 592 x 80fbshare.a = -.2;
fbshare.fr = 0;
fbshare.showing = false;
fbshare.hiding = true;
fbshare.img = loadGameImage('./src/wav/fbshare.png');
fbshare.img.style.border = '0px';
fbshare.img.style.cursor = 'pointer';
fbshare.img.border = 0;
fbshare.img.style.position = 'absolute';
fbshare.img.style.display = 'none';
fbshare.img.style.opacity = 0;
fbshare.img.style.zIndex = '142069';
fbshare.reposition = function (){
fbshare.img.style.left = Math.floor((ww-592)/2)+'px';
fbshare.img.style.top = Math.floor(Math.cos(fbshare.fr/12)*5 + (hh + 150 + 80 - 88)/2)+'px';
}
*/
/* www.datouwang.com */
/*fbshare.img.onclick = function (){
FB.ui({
method:'feed',link:'http://squishybird.com/',name:'Squishy Bird',picture:'http://squishybird.com/fbthumb.jpg',caption:'I hate that freakin\' bird so much...',description:'I scored '+points+' in Squishy Bird! Can you beat that?'}
,function(response){
}
);
}
*/
var playagain ={
}
;
// 252x71 592 x 80playagain.a = -.2;
playagain.fr = 0;
playagain.showing = false;
playagain.hiding = true;
playagain.img = loadGameImage('./src/wav/playagain.png');
playagain.img.style.border = '0px';
playagain.img.style.cursor = 'pointer';
playagain.img.border = 0;
playagain.img.style.position = 'absolute';
playagain.img.style.display = 'none';
playagain.img.style.opacity = 0;
playagain.img.style.zIndex = '142068';
playagain.reposition = function (){
playagain.img.style.left = Math.floor((ww-252)/2)+'px';
playagain.img.style.top = Math.floor(Math.cos(playagain.fr/14)*5 + (hh + 320 + 71 - 88)/2)+'px';
}
playagain.img.onclick = function (){
game.ended = false;
poundPipes();
}
var c2s ={
}
;
c2s.a = -1;
c2s.showing = true;
c2s.hiding = false;
c2s.img = loadGameImage('./src/wav/clicktostart.png');
// 337 x 75c2s.img.style.position = 'absolute';
c2s.img.style.opacity = 0;
c2s.img.style.zIndex = '42070';
c2s.reposition = function (){
c2s.img.style.left = Math.floor((ww-337)/2)+'px';
c2s.img.style.top = Math.floor((hh + 250)/2)+'px';
}
var parody ={
}
;
parody.div = document.createElement('div');
parody.div.style.width = '800px';
parody.div.style.height = '24px';
parody.div.style.position = 'absolute';
parody.div.style.textAlign = 'center';
parody.div.style.fontFamily = 'Verdana';
parody.div.style.fontSize = '12px';
parody.div.style.zIndex = 87654;
parody.div.innerHTML = '适用浏览器:360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗. 不支持IE8及以下浏览器。来源:<a href="http://sc.chinaz.com/" target="_blank">站长素材</a>';
var points = 0;
var highscore = 0;
var score ={
}
;
score.divs = [];
for (var xx = -3;
xx <= 3;
xx++){
for (var yy = -3;
yy <= 3;
yy++){
var div = document.createElement('div');
score.divs.push(div);
div.style.width = '300px';
div.style.height = '50px';
div.style.position = 'absolute';
div.style.textAlign = 'center';
div.style.fontFamily = 'Verdana';
div.style.fontWeight = 'bold';
div.style.fontSize = '30px';
div.style.color = '#000000';
div.style.zIndex = 88887;
div.style['user-select'] = 'none';
div.style['-webkit-user-select'] = 'none';
div.style['-moz-user-select'] = 'none';
div.style['-ms-user-select'] = 'none';
div.style['-o-user-select'] = 'none';
/* -webkit-user-select:none;
// Chrome/Safari -moz-user-select:none;
// Firefox -ms-user-select:none;
// IE10+ // Rules below not implemented in browsers yet -o-user-select:none;
user-select:none;
*/
if (xx == 0 && yy == 0){
div.style.color = '#FFFFFF';
div.style.zIndex = 88888;
}
div.innerHTML = '';
}
}
score.update = function (){
for (var i = score.divs.length-1;
i>=0;
i--){
score.divs[i].innerHTML = points;
}
}
var ground ={
}
;
ground.canvas = document.createElement('canvas');
ground.canvas.style.position = 'absolute';
ground.canvas.style.zIndex = '31337';
ground.ctx = ground.canvas.getContext('2d');
ground.bit = loadGameImage('./src/wav/ground.png');
var city ={
}
;
city.canvas = document.createElement('canvas');
city.canvas.style.position = 'absolute';
city.canvas.style.zIndex = '60';
city.ctx = city.canvas.getContext('2d');
city.bit = loadGameImage('./src/wav/city.png');
var trees ={
}
;
trees.canvas = document.createElement('canvas');
trees.canvas.style.position = 'absolute';
trees.canvas.style.zIndex = '61';
trees.ctx = trees.canvas.getContext('2d');
trees.bit = loadGameImage('./src/wav/trees.png');
var birds = [];
var dead_birds = [];
var newBird = function (){
var bird ={
}
;
bird.cw = 150;
bird.ch = 150;
bird.ww = 85;
bird.hh = 60;
bird.xx = -200 - Math.random()*360;
bird.yy = 0 - Math.random() * 280;
bird.svx = 3 + Math.random()*2 + Math.pow((100 - nbfr)/20,2);
bird.vx = bird.svx;
bird.vy = -13 - Math.random()*13;
bird.vr = 0;
bird.ar = 0;
bird.ang = 0;
bird.fr = 0;
bird.anger = 0;
bird.anger_fr = 0;
bird.dying = false;
bird.dead = false;
bird.invincible = 0;
// if greater than 0,counts down per frame until 0 again bird.canvas = document.createElement('canvas');
game.div.appendChild(bird.canvas);
bird.canvas.width = bird.cw;
bird.canvas.height = bird.ch;
bird.canvas.style.zIndex = '69';
bird.canvas.style.position = 'absolute';
bird.ctx = bird.canvas.getContext('2d');
birds.push(bird);
}
var blood_image = loadGameImage('./src/wav/blood.png');
var bloods = [];
var newBlood = function (){
var blood ={
}
;
blood.ww = 325*4;
blood.hh = 138*4;
blood.fr = 0;
blood.canvas = document.createElement('canvas');
game.div.appendChild(blood.canvas);
blood.canvas.width = blood.ww;
blood.canvas.height = blood.hh;
blood.canvas.style.zIndex = '70';
blood.canvas.style.position = 'absolute';
repositionBlood(blood);
blood.ctx = blood.canvas.getContext('2d');
bloods.push(blood);
}
var repositionBlood = function (blood){
blood.canvas.style.left = (pipe_x + 148/2 - (325*4/2))+'px';
blood.canvas.style.top = (pipe_center - 32)+'px';
}
var pipe1 ={
}
;
pipe1.img = loadGameImage('./src/wav/pipe1.png');
pipe1.img.width = 148;
pipe1.img.height = 1664;
pipe1.img.style.position = 'absolute';
pipe1.img.style.left = '340px';
pipe1.img.style.top = '0px';
pipe1.img.style.zIndex = '420';
var pipe2 ={
}
;
pipe2.img = loadGameImage('./src/wav/pipe2.png');
pipe2.img.width = 148;
pipe2.img.height = 1664;
pipe2.img.style.position = 'absolute';
pipe2.img.style.left = '340px';
pipe2.img.style.top = '0px';
pipe2.img.style.zIndex = '420';
var nbfr = 100;
var fnbfr = 100;
var fr = 0;
var ltm = 0;
var oef = function (){
if (game_loaded){
var ftm = new Date().getTime();
var tm;
var tj = 0;
while (ltm < ftm){
ltm += 20;
tj++;
if (tj > 10){
// we're way too many frames behind. just give up. ltm = ftm;
break;
}
if (game.started){
fr++;
if ((fr % fnbfr) == 1){
newBird();
if (nbfr > 13){
nbfr = (nbfr - 13)*.996 + 13;
//nbfr -= (101 - nbfr) * .1;
//console.log(nbfr);
fnbfr = Math.ceil(nbfr);
}
}
}
if (want_pound){
want_pound = !poundPipes();
}
/* for (var i = sounds_playing.length-1;
i>=0;
i--){
var ch = sounds_playing[i];
if (ch.sound.currentTime > (ch.sound.duration - 1)){
ch.sound.currentTime = 1;
ch.sound.pause();
ch.can_play = true;
}
}
*/
if (logo.showing){
logo.a += .03;
if (logo.a >= 1){
logo.a = 1;
logo.showing = false;
}
logo.img.style.opacity = logo.a;
}
if (logo.hiding){
logo.a -= .1;
if (logo.a <= 0){
logo.a = 0;
logo.hiding = false;
}
logo.img.style.opacity = logo.a;
}
if (logo.a > 0){
logo.fr++;
logo.reposition();
}
if (logo.a > .01){
if (!logo.visible){
logo.visible = true;
logo.img.style.display = 'inline';
}
}
else{
if (logo.visible){
logo.visible = false;
logo.img.style.display = 'none';
}
}
if (gameover.showing){
gameover.a += .03;
if (gameover.a >= 1){
gameover.a = 1;
gameover.showing = false;
}
gameover.img.style.opacity = gameover.a;
}
if (gameover.hiding){
gameover.a -= .1;
if (gameover.a <= 0){
gameover.a = 0;
gameover.hiding = false;
}
gameover.img.style.opacity = gameover.a;
}
if (gameover.a > 0){
gameover.fr++;
gameover.reposition();
}
if (gameover.a > .01){
if (!gameover.visible){
gameover.visible = true;
gameover.img.style.display = 'inline';
}
}
else{
if (gameover.visible){
gameover.visible = false;
gameover.img.style.display = 'none';
}
}
/* if (fbshare.showing){
fbshare.a += .03;
if (fbshare.a >= 1){
fbshare.a = 1;
fbshare.showing = false;
}
fbshare.img.style.opacity = fbshare.a;
}
if (fbshare.hiding){
fbshare.a -= .1;
if (fbshare.a <= 0){
fbshare.a = 0;
fbshare.hiding = false;
}
fbshare.img.style.opacity = fbshare.a;
}
if (fbshare.a > 0){
fbshare.fr++;
fbshare.reposition();
}
if (fbshare.a > .01){
if (!fbshare.visible){
fbshare.visible = true;
fbshare.img.style.display = 'inline';
}
}
else{
if (fbshare.visible){
fbshare.visible = false;
fbshare.img.style.display = 'none';
}
}
*/
if (playagain.showing){
playagain.a += .03;
if (playagain.a >= 1){
playagain.a = 1;
playagain.showing = false;
}
playagain.img.style.opacity = playagain.a;
}
if (playagain.hiding){
playagain.a -= .1;
if (playagain.a <= 0){
playagain.a = 0;
playagain.hiding = false;
}
playagain.img.style.opacity = playagain.a;
}
if (playagain.a > 0){
playagain.fr++;
playagain.reposition();
}
if (playagain.a > .01){
if (!playagain.visible){
playagain.visible = true;
playagain.img.style.display = 'inline';
}
}
else{
if (playagain.visible){
playagain.visible = false;
playagain.img.style.display = 'none';
}
}
if (c2s.showing){
c2s.a += .03;
if (c2s.a >= 1){
c2s.a = 1;
c2s.showing = false;
}
c2s.img.style.opacity = c2s.a;
}
if (c2s.hiding){
c2s.a -= .1;
if (c2s.a <= 0){
c2s.a = 0;
c2s.hiding = false;
}
c2s.img.style.opacity = c2s.a;
}
if (c2s.a > .01){
if (!c2s.visible){
c2s.visible = true;
c2s.img.style.display = 'inline';
}
}
else{
if (c2s.visible){
c2s.visible = false;
c2s.img.style.display = 'none';
}
}
if (clanging >= 0){
clanging--;
pipe1.img.style.left = (pipe_x + Math.cos(fr*Math.PI)*3)+'px';
pipe2.img.style.left = (pipe_x + Math.cos(fr*Math.PI)*3)+'px';
}
pipe1.img.style.top = (pipe_center - 1664 - pipe_gap/2)+'px';
pipe2.img.style.top = (pipe_center + pipe_gap/2)+'px';
if (pipe_opening >= 0){
pipe_opening++;
if (pipe_opening >= 15){
pipe_opening = -1;
}
}
var kill_combo = 0;
var new_points = 0;
var kicked = 0;
if (pipe_closing >= 0){
pipe_gap -= 50;
if (pipe_gap <= -3){
pipe_gap = -3;
pipe_closing++;
if (pipe_closing >= 5){
pipe_closing = -1;
pipe_opening = 0;
}
var wnb = false;
for (var i = birds.length-1;
i>=0;
i--){
var bird = birds[i];
if (bird.invincible == 0){
if (bird.dying){
if (bird.xx <= (pipe_x+10)){
bird.invincible = 5;
// ensures there isn't a double-kick anomaly bird.vx = -10 - Math.random()*20 - bird.anger*8;
bird.vy = 0;
bird.ar = Math.random()*6 - 3;
bird.dying = false;
kicks[Math.min(bird.anger,4)].play();
bird.anger++;
kicked++;
}
else if (bird.xx >= (pipe_x + 148 -10)){
bird.vx = 10 + Math.random()*20;
bird.vy = 0;
bird.ar = Math.random()*6 - 3;
bird.dying = false;
bird.anger++;
}
else{
bird.dead = true;
wnb = true;
new_points += 1 + bird.anger;
kill_combo++;
score.update();
}
}
}
}
if (pipe_closing == 1){
if (kill_combo == 0){
if (kicked == 0){
clang.play();
clanging = 12;
}
}
}
if (wnb){
newBlood();
}
}
}
else{
pipe_gap += (bottom_pipe_gap - pipe_gap) * .15;
}
if (new_points > 0){
new_points *= kill_combo;
new_points = Math.pow(new_points,2);
if (new_points == 0){
}
else if (new_points == 1){
coin1.play();
}
else if (new_points < 8){
coin2.play();
}
else if (new_points < 50){
coin3.play();
}
else{
coin4.play();
}
points += new_points;
score.update();
}
if (new_points > 0){
squishes[Math.floor(Math.random()*squishes.length)].play();
}
for (var i = bloods.length-1;
i>=0;
i--){
var blood = bloods[i];
var bctx = blood.ctx;
bctx.clearRect(0,0,blood.ww,blood.hh);
var tx = Math.floor(blood.fr)%5;
var ty = (Math.floor(blood.fr) - tx)/5;
bctx.drawImage(blood_image,tx*325,ty*138,325,138,0,0,325*4,138*4);
blood.fr += 1;
if (blood.fr >= 30){
game.div.removeChild(blood.canvas);
bloods.splice(i,1);
}
}
if (game.started){
for (var i = birds.length-1;
i>=0;
i--){
var bird = birds[i];
var bctx = bird.ctx;
if (bird.invincible > 0){
bird.invincible--;
}
bctx.save();
bctx.clearRect(0,0,bird.cw,bird.ch);
bctx.translate(bird.cw/2,bird.ch/2);
if (!bird.dying){
bird.vr += bird.ar;
bird.vr *= .8;
bird.ar *= .95;
var ang = 0;
if (bird.vy > 11) ang = Math.atan2(bird.vy,bird.vx) * Math.max(0,Math.min(1,.1 * (bird.vy - 11)));
bctx.rotate(-.4 + ang + bird.vr);
}
bird.fr += .4;
bird.fr %= bird_images.length;
var bfr = Math.floor(bird.fr);
bctx.drawImage(bird_images[bfr].img,0,0,bird.ww,bird.hh,-bird.ww/2 + 10,-bird.hh/2,bird.ww,bird.hh);
if (bird.anger > 0){
bird.anger_fr += bird.anger/8;
bctx.globalAlpha = .5 * (1 - Math.cos(bird.anger_fr)) * Math.min(1,bird.anger/3);
bctx.drawImage(angry_bird_images[bfr].img,0,0,bird.ww,bird.hh,-bird.ww/2 + 10,-bird.hh/2,bird.ww,bird.hh);
}
bctx.restore();
bird.canvas.style.left = (bird.xx - bird.cw/2)+'px';
bird.canvas.style.top = (pipe_center + bird.yy - bird.ch/2)+'px';
if (bird.dying){
if (bird.stuck_side == 1){
bird.yy = pipe_gap/2 - 30;
}
else{
bird.yy = 30 - pipe_gap/2;
}
}
else{
if (bird.vx < bird.svx){
bird.vx++;
if (bird.vx >= bird.svx){
bird.vx = bird.svx;
}
}
else if (bird.vx > bird.svx){
bird.vx--;
if (bird.vx <= bird.svx){
bird.vx = bird.svx;
}
}
bird.xx += bird.vx + bird.anger*1.5;
bird.yy += bird.vy;
bird.vy += .6;
if (bird.yy > (bottom_pipe_gap/2 - 40)){
bird.yy = bottom_pipe_gap/2 - 41;
bird.vy = -8 - Math.random()*6;
flap.play();
}
if (pipe_closing != -1){
if (bird.xx >= (pipe_x-40)){
if (bird.xx <= (pipe_x + 148 +30)){
//if (Math.abs(bird.yy) < (pipe_gap/2 + 20)){
if (bird.invincible == 0){
bird.dying = true;
if (bird.yy > 0){
bird.stuck_side = 1;
}
else{
bird.stuck_side = 2;
}
}
//}
}
}
}
else{
// pipe might be opening from last close if (!bird.dying){
// bird might be overlapping a pipe but won't be killed so must fly away instead if (bird.xx >= (pipe_x-40)){
if (bird.xx <= (pipe_x + 148 +30)){
if (Math.abs(bird.yy) > (pipe_gap/2 + 20)){
bird.vx = -10 - Math.random()*20 - bird.anger*8;
bird.vy = 0;
bird.ar = Math.random()*6 - 3;
kicks[Math.min(bird.anger,4)].play();
bird.anger++;
}
}
}
}
}
}
if (bird.xx > (pipe_x + 148 + 200)){
game.started = false;
game.ended = true;
gameover.hiding = false;
gameover.showing = true;
/* fbshare.hiding = false;
fbshare.showing = true;
*/
playagain.hiding = false;
playagain.showing = true;
if (points > highscore){
highscore = points;
}
}
if (bird.dead || (bird.xx > (ww + 311))){
bird.canvas.width = 1;
bird.canvas.height = 1;
game.div.removeChild(bird.canvas);
birds.splice(i,1);
}
}
}
}
}
raf(oef);
}
window.onresize = function (){
resize();
}