<canvas id ="cvs" width="800" height="600"></canvas>
<script>
var cvs = document.getElementById("cvs");
var ctx = cvs.getContext('2d');
var imgUrls = [ //存图片名称 和图片路径的对象
{name: 'birds', path: './res/birds.png'},
{name: 'land', path: './res/land.png'},
{name: 'pipe1', path: './res/pipe1.png'},
{name: 'pipe2', path: './res/pipe2.png'},
{name: 'sky', path: './res/sky.png'},
];
//创建的函数,传入俩个参数 第一个参数是图片名称和路径的数组,第二个参数是加载完成需要执行的函数体
function loadImages(imgUrls, callback) {
var count = imgUrls.length; // 创建的长度用于遍历和计数用
var imgEls = {}; //创建一个新数组
for (var i = 0; i < imgUrls.length; i++) { //循环遍历穿入的图片数组
var imgEl = new Image(); // 创建一个 img 标签
imgEl.src = imgUrls[i].path; // img标签的 src 加载 穿入的数组内的path (路径)
var name = imgUrls[i].name; // 创建一个 name 属性 接收 数组内的name 属性
imgEls[name] = imgEl; //img 标签属性name 等于 一个对象
imgEl.addEventListener('load', function () { //imgEl(img)创建一个监听事件 图片加载完成后执行
count--; //加载完成一次,计数减一
if (count == 0) { // count 等于0的时候 执行
callback(imgEls) ; //加载完成执行函数体
}
})
}
}
// --------------------------
//主函数体
loadImages(imgUrls,function(imgEls){
//封装一个对象,能够绘制一个会自己下落的小鸟。
//有构造函数准备数据。
//有update和draw用于更新数据和绘制。
//update里面有下落和帧切换两种动画。
function Bird(x,y,img,a,speed) {
// TODO: 准备小鸟对象所需要的数据
this.x = x; //在画布上的x坐标
this.y = y; //在画布上的Y坐标
this.img = img; //图片名称
this.index = 0; //用来计算图片X轴的位置
this.a = a; // 计算加速时间
this.speed = speed; // 图片移动速度
this.waitTime = 0; // 累积小图等待的时间。
}
Bird.prototype.draw = function(){
// TODO:绘制小鸟 (不需要有旋转)
ctx.drawImage(this.img,
52*this.index, 0, 52, 45, // 原图上选择的矩形区域
this.x, this.y, 52, 45 // Cavnas上选择的矩形区域
);
};
Bird.prototype.update = function (dt) {
// 我们原来是一帧切换一张小图。昨天写的一帧是100毫秒。
// 但是现在我们的一帧,约为16.67毫秒,所以小图切换的速度,就太快了。
// r如何解决这个问题呢?
this.waitTime += dt;
if (this.waitTime >= 100) { // 等停在这给index上的时间超过100毫秒,再做切换
// 现在的思路是:
// 等待一百毫秒后,切换小图,然后用来累积等待时间的变量减去100毫秒。
this.index++;
if (this.index > 2) {
this.index = 0;
}
this.waitTime -= 100;
}
// TODO : 小鸟的下落动画
// speed和a:小鸟的速度和加速度。我们算小鸟的位置时,应该是这样的:
// speed = speed + a × dt; 速度是根据加速度和时间算出来的。
// s = speed × dt; 路程是根据速度和时间算出来的。
// y = y + s; 位置是根据路程算出来的。(纵轴的位置)
this.speed = this.speed + this.a * dt;
this.y = this.y+this.speed * dt;
};
// bird
var animate = new Bird(150,150,imgEls.birds,0.0002,0);
var lastTime =Date.now(); //计算执行之前的时间
var looper = function(){
var now = Date.now(); //执行之后的时间
var dt = now - lastTime; //执行时间
// if(dt<10){
// requestAnimationFrame(looper);
// return;
// }
lastTime = now;
ctx.clearRect(0,0,800,600);//清除图像
animate.update(dt);
animate.draw();
requestAnimationFrame(looper);
}
cvs.addEventListener('click', function () {
animate.speed = -0.15;
})
requestAnimationFrame(looper);
})
</script>
分享到:
相关推荐
在canvas-flappybird项目中,JavaScript代码定义了小鸟、管道等游戏对象,每个对象都有自己的属性(如位置、速度)和方法(如移动、碰撞检查)。游戏循环通过`requestAnimationFrame()`函数来更新画面,确保流畅的...
在本项目中,我们关注的是使用原生JavaScript和HTML5 Canvas技术来开发一款类似Flappy Bird的游戏,名为“压扁小鸟”。HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,而JavaScript...
游戏的核心是角色——小鸟的飞行控制,通过点击屏幕使小鸟上下移动,穿越不断出现的管状障碍物。游戏的设计简洁而富有吸引力,色彩鲜明的背景、简单的动画效果以及令人上瘾的得分机制,都是其成功的关键元素。 在...
在这个名为“flappy bird压扁小鸟小游戏.zip”的压缩包中,包含了一款基于前端技术实现的Flappy Bird克隆版。接下来,我们将深入探讨这个项目中涉及到的前端开发技术,包括CSS、javascript、jQuery以及HTML5。 首先...
在FlappyBird中,小鸟的上下移动、管道的滚动以及得分的显示都利用了这一原理。 7. **游戏循环**:一个典型的游戏循环包括渲染(Render)、更新(Update)和输入处理(Input Handling)三个步骤。在FlappyBird中,...
Flappy Bird的玩法就是控制小鸟在不断移动的管道间穿梭,所以管道的运动规律和小鸟的碰撞判断至关重要。这部分代码通常会涉及到数学运算,比如坐标转换、距离计算等。 “bird.js”文件专注于小鸟的运动和动画。小鸟...
在《简单小游戏Flappy Bird制作》的相关博客中,开发者可能会详细讲解如何将这些图像和音频资源集成到游戏引擎中,如使用Unity、Cocos2d-x或者纯HTML5 Canvas等。他们会介绍如何设置精灵(Sprite)和动画,如何处理...
1. **Canvas API**:FlappyBird的图形渲染主要依赖HTML5的Canvas API,这是一个用于在网页上绘制图形的画布。开发者需要熟悉`context`对象的使用,如`fillRect`用于填充矩形(管道和地面)、`beginPath`和`stroke`...
在这个“HTML5 Canvas FlappyBird.zip”压缩包中,包含了一个使用HTML5 Canvas技术高仿的经典游戏——Flappy Bird。Flappy Bird是一款在2013年由越南开发者Dong Nguyen发布的极简风格的游戏,因其难度颇高和令人上瘾...
Flappy Bird的游戏循环,包括碰撞检测、物理模拟(如重力和飞行)、计分系统以及用户交互(如点击屏幕使小鸟飞起),都是通过JavaScript来控制的。开发者通常会使用事件监听器来响应用户的输入,如点击或触摸屏幕,...
《Flappy Bird游戏开发:Unity3D源码与素材解析》 Flappy Bird,这款曾经风靡全球的小游戏,以其简单却极具挑战性的玩法吸引了无数玩家。本资源包含Flappy Bird的游戏源码以及相关的素材,旨在帮助开发者和游戏爱好...
2. 角色移动:Flappy Bird的主角鸟通过重力加速度进行下落,通过点击屏幕使鸟向上飞行。这涉及到碰撞检测和物理模拟。 3. 管道生成与移动:游戏中的管道以一定速度从屏幕右侧进入,左侧消失,管道间的间距随机生成,...
在Flappy Bird游戏中,Canvas用于创建游戏背景、小鸟、管道等元素,并实时更新它们的位置和状态,实现游戏的动画效果。开发者通常会使用requestAnimationFrame来实现平滑的动画帧率控制。 JavaScript作为HTML5的...
在Flappy Bird中,小鸟的飞行动画、管道的移动动画都是通过定时器(通常是`setInterval`)在每一帧时更新画面实现的。 5. **物理模拟**:虽然Flappy Bird的物理规则简化了很多,但仍然需要一些基本的物理概念,比如...
利用中介者模式进行业务搭建 Game是游戏中介者类,它的作用就是中介者的...Bird小鸟类,作用是对小鸟的业务进行封装 Land大地类,封装地面的样式 Background背景类,作用是封装背景图 PiPe管子类,作用是随机出现管子
在Flappy Bird游戏中,Canvas用于绘制游戏场景,包括管道、地面、小鸟等元素。开发者需要通过JavaScript控制这些元素的移动、碰撞检测以及得分计算。 JavaScript是实现游戏逻辑的核心,它负责处理用户的输入(如...
Flappy Bird的小鸟在飞行时会有一个上下振翅的动画效果,这通过设置精灵的帧动画来实现。 5. **游戏状态管理**:Phaser的状态管理机制允许开发者将游戏的不同阶段(如开始、游戏进行、游戏结束等)划分为不同的状态...
Flappy Bird是一款2D像素风格的游戏,玩家通过点击屏幕控制小鸟上下飞行,穿越不断出现的绿色管道,避免碰撞导致游戏结束。游戏的核心在于对时间节奏和空间判断的把握,考验玩家的反应速度和判断能力。 二、游戏...
在Flappybird中,玩家通过点击屏幕让小鸟上下移动,这就是Input Manager的作用。 6. **C#脚本**:Unity使用C#作为主要的编程语言,编写逻辑控制游戏的行为。在Flappybird项目中,你需要创建C#脚本来控制小鸟的飞行...
`pixijs-cli-flappybird` 是一个使用 PixiJS CLI 创建的 Flappy Bird 克隆项目示例,旨在帮助开发者了解如何利用 PixiJS 库来构建类似的游戏。 PixiJS 是一个高性能的2D渲染引擎,支持WebGL和canvas,广泛用于创建...