《HTML5 2D游戏编程核心技术》——第3章,第3.5节滚动游戏背景

3.5 滚动游戏背景
除跑步小人外,Snail Bait游戏中的所有物体,在游戏运行时都会在水平方向上滚动。本节将讨论这个滚动功能的实现。
3.5.1 平移坐标系
每一个canvas元素都包含两个部分:HTML元素以及绘图区域,如图3.3所示的一个画框和一片绘图区域。
绘图区域有一个坐标系,这样你就可以在指定的位置上绘制图形,如图3.3中的文字,它位于坐标(150,100)。可以使用程序清单3.11中的代码,在canvas元素中绘制那段文本。

图3.3 canvas元素(画框)和它的绘图区域

程序清单3.11 在绘图区域中绘制文本

坐标系的原点,即位置(0,0),默认是在canvas元素的左上角。X坐标从左向右增加,Y坐标从上向下增加,如图3.3所示。X和Y坐标的方向是不能改变的,但是坐标系的原点不是固定的。可以移动它,如图3.4所示,如同移动画框下面的绘图区域一样。

图3.4 平移坐标系

在图3.4中,坐标系向左平移了100个像素。平移坐标系并绘制文本的代码在程序清
单3.12中给出。
程序清单3.12 设置背景偏移量

传递给context.translate()的两个参数代表了在水平方向和垂直方向上移动坐标系的像素距离。在这个例子中,我们仅仅沿水平方向平移了坐标系,但context.translate()函数可以在两个方向平移。
注意,和图3.3中原始位置相比,尽管图3.4中的文字具有相同的坐标,但是相对于canvas元素向左移动了一些距离。反过来说,canvas元素相对于文字,向右移动了一些距离。很明显,移动来自于坐标系的平移。
可以在绘图区域的任意位置进行图形绘制,但是如果超出了canvas元素的范围,超出部分的图形将变得不可见,如图3.5所示。

图3.5 超出画框(canvas元素)的绘制没有效果

程序清单3.13给出了图3.5中坐标系平移用到的代码。
程序清单3.13 设置背景偏移量

前面的代码将坐标系平移到足够靠左的位置,这样canvas元素中仅有部分文字是可见的。
正如前面讨论的那样,通过持续地平移坐标系,并在相同的坐标值下进行重新绘制,你就可以创作出明显的运动效果。这就是Snail Bait游戏滚动背景和其他物体的方法。
3.5.2 滚动Snail Bait游戏的背景
Snail Bait游戏的背景图像如图3.6所示。
Snail Bait游戏将绘制背景两次,并且将其首尾相连,以适应滚动,如图3.7所示,图中蓝色的线(中间的线)并没有在游戏中画出,仅代表了两个背景的连接。
 
   ??图3.6 背景图像

               ??图3.7 两次绘制背景

drawBackground()函数如程序清单3.14所示。
程序清单3.14 绘制游戏背景

drawBackground()函数被draw()函数调用,Snail Bait游戏会在每一个动画帧中调用draw()函数。drawBackground()函数使得坐标系向左平移backgroundOffset个像素,绘制背景两次,并将它们首尾相连,然后平移坐标系到drawBackground()函数调用前的初始位置。为了滚动背景,Snail Bait游戏会持续地增加backgroundOffset的值。增加该值的影响如图3.8所示,从右向左滚动的半透明区域代表图像不在屏幕上显示的部分。canvas元素坐标系从右向左移动。
持续地向左平移坐标系,会使canvas元素中的游戏背景表现出向左移动的效果,正如你在图3.8中看到的那样。
背景图像有1103像素宽,而游戏canvas元素只有800像素宽。当游戏开始时,backgroundOffset的值为零,两个背景唯一可见的部分是位于(0,0)处的图像的前四分之三,如图3.8顶部的截图所示。绘制在位置(background.width,0)上的剩余四分之一图像以及另一个图像,初始时是不可见的,因为它们位于canvas元素边界之外。
游戏开始一段时间后,backgroundOffset不再是零,坐标系向左平移很大一段距离,如图3.8中部的截图所示。然而,画在(background.width,0)处的背景还是不可见的。

图3.8 增加backgroundOffset值的影响

在滚动的最后阶段(图3.8的底部截图),backgroundOffset等于背景图像的宽度值,背景可见的部分和滚动开始时可见的部分是完全一样的。此时,Snail Bait游戏会重新将backgroundOffset的值设置为零,重新回到图3.8的顶部截图所示的状态。
有意思的是,位于(background.width,0)位置后四分之一处的背景图像是不可见的。因为canvas元素和背景图片的大小不匹配。如果两者有相同的宽度,画在位置(background.width,0)上后四分之一的背景图像,在特定的时间点上,是可以显示出来的。
前面的图像可能不是很明显,但好在背景图像有一个特点很适合作为游戏背景:图像左侧边缘和右侧边缘垂直方向的一列像素点是一样的,如图3.9所示。
如果没有一样的边缘,在两个背景图像交汇的地方,会产生一条明显的不连续线,就像图3.7和图3.8中的蓝色线那样。
目前滚动Snail Bait游戏背景还有一个问题没有解决:即游戏是如何调整backgroundOffset变量来控制背景滚动的?这个问题将留到下一节再解决,我们现在可以先不考虑潜在的帧速率变化,使用一个恒定的速率来滚动背景。
为了产生平滑的滚动效果,请确保背景图像具有一样的边缘。

时间: 2025-01-11 12:31:35

《HTML5 2D游戏编程核心技术》——第3章,第3.5节滚动游戏背景的相关文章

《HTML5 2D游戏编程核心技术》——第1章,第1.1节Snail Bait游戏

本节书摘来自华章出版社<HTML5 2D游戏编程核心技术>一书中的第1章,第1.1节,作者[美] 戴维·吉尔里,更多章节内容可以访问"华章计算机"公众号查看. 第1章 概 述 令人激动的是,开发人员可以使用软件开发技术使屏幕上出现任何想象的场景.与其他领域受一些物理条件的束缚不同,开发人员长期以来一直使用图形化API和UI工具包来实现富有创造性且引人注目的应用程序.可以说,最有创意的软件开发就是游戏编程.比起让游戏愿景变成现实,优秀的创意还可使我们通过少许努力便获得更多的回

《HTML5 2D游戏编程核心技术》——第1章,第1.2节HTML5游戏开发最佳实践

本节书摘来自华章出版社<HTML5 2D游戏编程核心技术>一书中的第1章,第1.2节HTML5游戏开发最佳实践,作者[美] 戴维·吉尔里,更多章节内容可以访问"华章计算机"公众号查看. 1.2 HTML5游戏开发最佳实践 我们将在本书中持续地讨论一些关于游戏开发的最佳实践,首先介绍7个与HTML5有关的实践. 1)窗口失去焦点时暂停游戏. 2)窗口重新获得焦点时实现倒计时. 3)使用CSS实现UI特效. 4)对于运行缓慢的游戏做出检测和处理. 5)添加社交功能. 6)把所有

《HTML5 2D游戏编程核心技术》——第1章,第1.7节小结

1.7 小结Snail Bait游戏是一款HTML5平台游戏,是通过canvas元素的2D API实现的.正如你将在本书接下来的章节中看到的那样,这个API提供了一个强大且直观的功能函数集,通过这个函数集,你几乎可以实现任何一款能想象到的2D游戏.在这一章里,我们从一个最顶层了解了Snail Bait游戏的结构,这是为了获得一些比较直观的概念,并了解实现它的一些最佳实践.尽管通过阅读本章,你可以对游戏有一个直观的印象,但是如果试玩一下,将会对游戏有更好的理解,你可以在corehtml5games

《HTML5 2D游戏编程核心技术》——第3章,第3.1节滚动背景和监控帧频

第3章 图形和动画是视频游戏的基础.能够绘制图形和图像是创造平滑的.不闪烁的动画最重要的技能之一,也是游戏开发人员必须要掌握的能力. 动画会持续地绘制动画帧,一般每秒30-60次.这个速率称为动画帧速率.每一个动画帧如同连环画的一页,每帧几乎和上一帧一样,仅仅存在着微小的差别,这样就可以在游戏快速显示动画帧时,创造出运动的效果.更多有关连环画的内容请阅读3.2节. 图3.1显示了一个单独的动画帧截图.这个游戏版本会保持这一状态到本章结束,图中显示了背景和平台从右向左滚动时的动画帧速率. 平台在动

《HTML5 2D游戏编程核心技术》——第1章,第1.4节特别功能

1.4 Snail Bait游戏中的HTML和CSS Snail Bait游戏使用了HTML.CSS和JavaScript,其中大部分是JavaScript,事实上,本书接下来的章节主要关注JavaScript,只是偶尔谈及HTML和CSS.图1.12显示了游戏上半部白色轮廓中的HTML元素,以及它们对应的CSS代码. 图1.12 Snail Bait上半部对应的CSS Snail Bait游戏中的所有事件都发生在arena内,arena是一个HTML DIV元素.arena的margin属性值

《HTML5 2D游戏编程核心技术》——第1章,第1.5节开始Snail Bait游戏编程

1.5 开始Snail Bait游戏编程图1.16显示了Snail Bait游戏的初始文件集合.在本书中,我们将逐步增加更多的文件.但是现在,我们需要一个HTML文件来定义游戏中HTML元素的结构:一个CSS文件来定义这些元素的可见属性:一个JavaScript文件来定义游戏的逻辑:以及两张图像,一个作为背景,一个作为跑步小人. 图1.16 Snail Bait游戏的初始文件集合 图1.17显示了游戏的开始时间点,只绘制出了背景和跑步小人.开始时,跑步小人并不是一个sprite对象,而是直接绘制

《HTML5 2D游戏编程核心技术》——第3章,第3.4节计算帧速率

3.4 计算帧速率程序清单3.9列出了函数calculateFps()的具体代码,该函数在Snail Bait游戏中用于计算帧速率.程序清单3.9 计算帧速率帧速率表示为帧/秒,是一帧除以上一个动画帧和当前动画帧之间的时间间隔来计算的,时间以秒为单位.对前面算法做一个小小的修改,就可以实现一个帧速率读数器,如程序清单3.10所示.程序清单3.10 更新snailbaits-fps元素 程序清单3.10描述了一个重要的动画技术:以一个特定的速率,而不是动画速率来执行一个任务.如果每个动画帧都更新一

《HTML5 2D游戏编程核心技术》——第3章,第3.6节制作基于时间的运动

3.6 制作基于时间的运动游戏帧速率是会变化的,但是不能允许变化的帧速率影响到游戏中物体运动的速率,包括背景.可能干扰到游戏动画的任何噪声,都不应该成为影响生成平滑运动的原因.例如,不管潜在的动画帧速率是多少,Snail Bait游戏都会以每秒25个像素的速率滚动背景.运动必须是基于时间的,也即它仅仅依赖时间(例如,像素/秒),而不是动画帧速率.对于任何动画帧来说,使用基于时间的运动来计算需要移动的像素数量都是简单的:使用自上一动画帧以来经过的时间(以秒为单位)乘以物体运动的速率.当你使用上一个

《HTML5 2D游戏编程核心技术》——导读

目 录第1章 概述 1.1 Snail Bait游戏1.2 HTML5游戏开发最佳实践 1.2.1 窗口失去焦点时暂停游戏1.2.2 窗口重获焦点时实现倒计时功能1.2.3 使用CSS实现UI特效1.2.4 对游戏运行缓慢的状态做出检测和处理1.2.5 添加社交功能 1.2.6 将所有游戏图像放在单独的sprite表单中1.2.7 在服务器中存储高分榜和实时游戏数据1.3 特别功能 1.4 Snail Bait游戏中的HTML和CSS1.5 开始Snail Bait游戏编程 1.6 本书中使用的