在线斯诺克html5,用HTML 5打造斯诺克桌球俱乐部

本文介绍了如何利用HTML5技术来打造一款非常酷的斯诺克桌球游戏,文章中详细地列出了开发的全过程,并解说了实现这个游戏的几个关键点。在文章末尾我向大家提供了游戏的在线实例页面和源码下载链接,如果你只是想玩玩(需要使用支持HTML5的浏览器,建议使用Chrome 12, Internet Explorer 9 或者 Fire Fox 5及其以上版本),那你可以跳过正文拉到页面最底端去玩玩那个游戏或者下载源码,但我建议你好好看看实现过程,对我们学习HTML5非常有帮助。

毫无疑问,我们已经目睹了HTML5背后的那场伟大的Web开发革命。经过那么多年HTML4的统治,一场全新的运动即将完全改变现在的Web世界。正是他释放出来的现代化气息和丰富的用户体验,让它很快地成为了一个独特的插件运行在类似Flash和Silverlight的框架之上。

如果你是一个非常年轻的开发者,也许你是刚刚在开始学习HTML5,所以可能你并没有注意到他有太大的变化。在任何时候,我希望这篇文章能够帮助到你,当然,也希望像我一样的老手能从中学到一些新的花样。

你的点评对我来说非常重要,所以我很期待你的来信。当然能让我更兴奋的是当你在那个游戏画面上右击时暗暗地说一句“Hey,这居然不是Flash!也不是Silverlight!”

系统要求

想要使用本文提供的HTML5桌球应用,你必须安装下面的这些浏览器:Chrome 12, Internet Explorer 9 or Fire Fox 5

d084054ae488bb3f881f96a7f3175fad.png

游戏规则

f890b67337de8c7966cba0c1037c34cd.png

也许你已经知道这是一个什么样的游戏了,是的,这是“英式斯诺克”,实际上更确切的说是“简易版英式斯诺克”,因为没有实现所有的斯诺克游戏规则。你的目标是按顺序将目标球灌入袋中,从而比其他选手得到更多的分数。轮到你的时候,你就要出杆了:根据提示,你必须先打进一个红色球得到1分,如果打进了,你就可以继续打其他的球 - 但是这次你只能打彩色球了(也就是除红色球以外的球)。如果成功打进,你将会得到各自彩球对应的分数。然后被打进的彩球会回到球桌上,你可以继续击打其他的红球。这样周而复始,直到你失败为止。当你把所有的红球都打完以后,球桌上就只剩下6个彩球了,你的目标是将这6个彩球按以下顺序依次打入袋中:黄(2分)、绿(3分)、棕(4分)、蓝(5分)、粉(6分)、黑(7分)。如果一个球不是按上面顺序打进的,那它将会回到球桌上,否则,它最终会留在袋里。当所有球都打完后,游戏结束,得分最多的人胜出。

犯规处理

为了处罚你的犯规,其他选手将会得到你的罚分:

◆ 白球掉入袋中罚4分

◆ 白球第一次击中的球是错误的话罚第一个球的分值

◆ 第一个错误的球掉入袋中罚第一个球的分值

◆ 处罚的分数至少是4

下面的这段代码展示了我是如何来计算犯规的:

varstrokenBallsCount=0;

console.log('strokenBalls.length: ' + strokenBalls.length);

for (vari=0; i

varball=strokenBalls[i];

//causing the cue ball to first hit a ball other than the ball on

if (strokenBallsCount== 0) {

if (ball.Points != teams[playingTeamID - 1].BallOn.Points) {

if (ball.Points== 1 || teams[playingTeamID - 1].BallOn.Points== 1 ||

fallenRedCount== redCount) {

if (teams[playingTeamID - 1].BallOn.Points<4) {

teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1]

.FoulList.length] = 4;

$('#gameEvents').append('

Foul 4 points :  Expected ' +

teams[playingTeamID - 1].BallOn.Points + ', but hit ' + ball.Points);

}

else {

teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1]

.FoulList.length] = teams[playingTeamID - 1].BallOn.Points;

$('#gameEvents').append('

Foul ' + teams[playingTeamID - 1]

.BallOn.Points + ' points :  Expected ' + teams[playingTeamID - 1]

.BallOn.Points + ', but hit ' + ball.Points);

}

break;

}

}

}

strokenBallsCount++;

}

//Foul: causing the cue ball to miss all object balls

if (strokenBallsCount== 0) {

teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1].FoulList.length] = 4;

$('#gameEvents').append('

Foul 4 points :  causing the cue ball

to miss all object balls');

}

for (vari=0; i

varball=pottedBalls[i];

//causing the cue ball to enter a pocket

if (ball.Points== 0) {

teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1].FoulList.length] = 4;

$('#gameEvents').append('

Foul 4 points :  causing the cue ball

to enter a pocket');

}

else {

//causing a ball different than the target ball to enter a pocket

if (ball.Points != teams[playingTeamID - 1].BallOn.Points) {

if (ball.Points== 1 || teams[playingTeamID - 1].BallOn.Points== 1

||fallenRedCount== redCount) {

if (teams[playingTeamID - 1].BallOn.Points<4) {

teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1]

.FoulList.length] = 4;

$('#gameEvents').append('

Foul 4 points : '

+ ball.Points + ' was potted, while ' + teams[playingTeamID - 1]

.BallOn.Points + ' was expected');

$('#gameEvents').append('

ball.Points: ' + ball.Points);

$('#gameEvents').append('

teams[playingTeamID - 1]

.BallOn.Points: ' + teams[playingTeamID - 1].BallOn.Points);

$('#gameEvents').append('

fallenRedCount: ' + fallenRedCount);

$('#gameEvents').append('

redCount: ' + redCount);

}

else {

teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1]

.FoulList.length] = teams[playingTeamID - 1].BallOn.Points;

$('#gameEvents').append('

Foul ' + teams[playingTeamID - 1]

.BallOn.Points + ' points : ' + ball.Points + ' was potted, while '

+ teams[playingTeamID - 1].BallOn.Points + ' was expected');

}

}

}

}

}

得分

我们根据下面的规则来计算得分:红(1分)、黄(2分)、绿(3分)、棕(4分)、蓝(5分)、粉(6分)、黑(7分)。代码如下:

if (teams[playingTeamID - 1].FoulList.length== 0) {

for (vari=0; i

varball=pottedBalls[i];

//legally potting reds or colors

wonPoints += ball.Points;

$('#gameEvents').append('

Potted +' + ball.Points + ' points.');

}

}

else {

teams[playingTeamID - 1].FoulList.sort();

lostPoints=teams[playingTeamID - 1].FoulList[teams[playingTeamID - 1].FoulList.length - 1];

$('#gameEvents').append('

Lost ' + lostPoints + ' points.');

}

teams[playingTeamID - 1].Points += wonPoints;

teams[awaitingTeamID - 1].Points += lostPoints;

选手的闪动动画头像

ee0220d896f938396923960b1b696e7a.png

游戏是有两位选手参与的,每一位选手都有自己的昵称和头像,选手的昵称我们就简单地以“player 1”和“player 2”来命名了(也许让用户自己输入会更漂亮)。每位选手的头像是一只正在打桌球的可爱小狗。当轮到其中一位选手时,他的头像就会有一闪一闪的动画效果,同时对手的头像会停止闪动。

这个效果我们是通过改变img元素的CSS3属性opacity的值来实现的:我们使用jquery的animatio函数让opacity的值在0-1.0之间变化。

function animateCurrentPlayerImage() {

varotherPlayerImageId=0;

if (playingTeamID== 1)

otherPlayerImageId='player2Image';

else

otherPlayerImageId='player1Image';

varplayerImageId='player'+ playingTeamID + 'Image';

$('#' + playerImageId).animate({

opacity: 1.0

}, 500, function () {

$('#' + playerImageId).animate({

opacity: 0.0

}, 500, function () {

$('#' + playerImageId).animate({

opacity: 1.0

}, 500, function () {

});

});

});

$('#' + otherPlayerImageId).animate({

opacity: 0.25

}, 1500, function () {

});

}

力量控制条

a14e14130ff980e10b513486118b6922.png

一个优秀的斯诺克选手都能很好地把握住每一杆的力度.不同的技巧需要不同的击球方式:直接的,间接的,或者利用边角的等等。不同方向和不同力度的组合可以构造成千上万种可能的路径。幸运的是,这个游戏提供了一个非常漂亮的力度控制条,可以帮助选手在击球前调整他们的球杆。

为了达到这一点,我们使用了HTML5的meter元素标签,它可以完成测量距离的工作。meter标签最好在知道这次测量的最小值和最大值的情况下使用。在我们的这个例子中,这个值在0到100之间,因为IE9不支持meter,所以我用了一张背景图来替代,这样效果也是一样的。

#strengthBar { position: absolute; margin:375px 0 0 139px;

width: 150px; color: lime; background-color: orange;

z-index: 5;}

当你点击了力度条后,你实际上是选择了一个新的力度。一开始你可能不是很熟练,但在真实世界中,这是需要时间来训练自己的能力的。点击力度条的代码如下:

$('#strengthBar').click(function (e) {

varleft= $('#strengthBar').css('margin-left').replace('px', '');

varx=e.pageX - left;

strength= (x / 150.0);

$('#strengthBar').val(strength * 100);

});

db8500700f4b52e3a38d3c0fd2058bf7.png

在当前选手的头像框里面,你会注意到有一个小球,我叫他“ball on”,就是当前选手在规定时间内应该要击打的那个球。如果这个球消失了,那选手将失去4分。同样如果选手第一次击中的球不是框内显示的球,那他也将失去4分。

这个“ball on”是直接将canvas元素覆盖在用户头像上的,所以你在头像上看到的那个球,他看起来像是在标准的div上盖了一个img元素,但是这个球并不是img实现的。当然我们也不能直接在div上画圆弧和直线,这就是为什么我要将canvas覆盖到头像上的原因了。看看代码吧:

varplayer1BallOnContext=player1BallOnCanvas.getContext('2d');

varplayer2BallOnContext=player2BallOnCanvas.getContext('2d');

.

.

.

function renderBallOn() {

player1BallOnContext.clearRect(0, 0, 500, 500);

player2BallOnContext.clearRect(0, 0, 500, 500);

if (playingTeamID== 1) {

if (teams[0].BallOn != null)

drawBall(player1BallOnContext, teams[0].BallOn, new Vector2D(30, 120), 20);

}

else {

if (teams[1].BallOn != null)

drawBall(player2BallOnContext, teams[1].BallOn, new Vector2D(30, 120), 20);

player1BallOnContext.clearRect(0, 0, 133, 70);

}

}

旋转屋顶上的电风扇

在这个游戏中这把电风扇纯属拿来玩玩有趣一把的。那为什么这里要放一把电风扇?是这样的,这个游戏的名字叫HTML5斯诺克俱乐部,放一把电风扇就有俱乐部的气氛了,当然,我也是为了说明如何实现CSS3的旋转。

实现这个非常简单:首先我们需要一张PNG格式的电扇图片。只是我们并没有用电扇本身的图片,我们用他的投影。通过显示风扇在球桌上的投影,让我们觉得它在屋顶上旋转,这样就达到了我们目的:

#roofFan { position:absolute; left: 600px; top: -100px; width: 500px; height: 500px;

border: 2px solid transparent; background-image: url('/Content/Images/roofFan.png');

background-size: 100%; opacity: 0.3; z-index: 2;}

.

.

.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分

jpa jsfPrimefaces AutoComplete&#xff0c;JSF转换器 这篇文章从第一部分和第二部分继续。 JSF拥有Converter工具&#xff0c;可以帮助我们从用户视图中获取一些数据并将其转换为从数据库或缓存中加载的对象。 在“ com.converter”包中&#xff0c;创建以下类&#xff1a;…

会话保持 (转)

http://www.cnblogs.com/kellyseeme/p/7599061.html 理论部分 会话也就是session&#xff0c;主要存储在服务器端&#xff0c;用来识别用户的身份。 在浏览器中向服务端发送请求的时候&#xff0c;不是http协议就是https协议&#xff0c;而两种协议在发送请求的时候&#xff0c…

win7链接html线到屏幕上,为你解决win7系统html文件图标变成空白的具体技巧 - win7吧...

我们经常在电脑上安装应用软件&#xff0c;难免会遇到诸如win7系统html文件图标变成空白的状况&#xff0c;对于大多电脑用户而言&#xff0c;大家几乎都是首次看到win7系统html文件图标变成空白这种状况&#xff0c;其实小编的经验是碰到win7系统html文件图标变成空白的问题别…

计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...

随着科技的发展、产业结构的不断优化&#xff0c;许多单位对计算机相关专业人才需求量越来越大&#xff0c;计算机专业毕业生就业情况普遍不差。加上计算机学科本身就给人一种“格局很高”的感觉&#xff0c;所以该专业成为了当下最热门的专业之一&#xff0c;每年高考都会有一…

服务引用代理类_在代理类中引用动态代理

服务引用代理类在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff…

Java中特质模式的定义

在本文中&#xff0c;我将介绍特征的概念&#xff0c;并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例。 我将首先提出一个虚构的案例&#xff0c;其中可以使用特征来减少重复&#xff0c;然后以使用Java 8的特征模式示例实现为结尾。 假设您正在开发留言…

计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...

计算机在开启远程桌面的时候选中了“仅允许运行使用网络级别身份验证的远程桌面计算机连接”&#xff0c;于是连接时提示错误如下&#xff1a;远程计算机需要网络级别身份验证&#xff0c;而您的计算机不支持该验证&#xff0c;请联系您的系统管理员或者技术人员来获得帮助解决…

前端笔记----定位

一.定位分三种&#xff1a;相对定位&#xff0c;绝对定位和固定定位。 1.相对定位&#xff1a;元素所占据的文档流的位置保留&#xff0c;元素本身相对自身原位置进行偏移&#xff1b; 如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

线程并发库和线程池的作用_并发–顺序线程和原始线程

线程并发库和线程池的作用不久前&#xff0c;我参与了一个项目&#xff0c;该项目的报告流程如下&#xff1a; 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新组合成最终报告&#xff0c;并返…

ipad2018编写html,IT教程:ipad6是ipad2018吗

科技就如同电灯发出的光一样&#xff0c;点亮我们的世界&#xff0c;点亮我们的生活&#xff0c;这一段时间以来ipad6是ipad2018吗的消息络绎不绝是什么原因呢?接下来就让我们一起了解一下吧。大家好&#xff0c;我是智能客服时间君&#xff0c;上述问题将由我为大家进行解答。…

流的多层次分组

1.简介 使用Java 8流&#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中&#xff0c;我们将看到如何从简单的单级分组到更复杂的&#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象&#xff1a;人和宠物。 人类 public cla…

冈仁波齐

昨日看了《冈仁波齐》&#xff0c;其实第一次听这部电影还是在网易云看到朴树的新歌《No Fear In My Heart》时知道有这样一部电影的&#xff1b; 抱着好奇心去看&#xff0c;发现这确实是一部不错的电影&#xff0c;具体好在哪里我也不是说得很清楚&#xff0c;只知道我在看电…

四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...

原标题&#xff1a;全网首发&#xff01;四川省本科二批次2019年对口高职投档录取线出炉四川省2019年高校招生本科录取接近尾声&#xff0c;二本批次征集志愿于8月1日进行。与此同时&#xff0c;专科批相关录取工作也进入我们视野。四川省各高校2019年对口高职调档线我省高职院…

app engine_App Engine中的Google Services身份验证,第1部分

app engine这篇文章将说明如何构建一个简单的Google App Engine&#xff08;GAE&#xff09;Java应用程序&#xff0c;该应用程序可以针对Google进行身份验证&#xff0c;并利用Google的OAuth授权访问Google的API服务&#xff08;例如Google Docs&#xff09;。 此外&#xff0…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分&#xff0c;我自己不是很喜欢&#xff0c;所以做了一点小改动。 他这里也没有做响应式布局&#xff0c;所以样式就不抄他的&#xff0c…

计算机在智慧交通的应用论文,智能交通的毕业论文

智能交通的毕业论文智能运输系统的研究许多国家都投入了巨大的人力和物力,并成为继航空航天、军事领域之后高新技术应用最集中的领域。下面为大家分享了有关智能交通的论文&#xff0c;欢迎欣赏&#xff01;摘 要&#xff1a;八十年代以来&#xff0c;世界一些发达国家纷纷投入…

MySQL5.5安装教程

1、 官网下载mysql5.5 下载地址&#xff1a; http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、 安装mysql5.5 注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1&#xff09; 打开下载的mysql-5.5.53-winx64.msi &#xff08;2&#xff09; 点…

计算机上平方米的单位,word怎么写平方米 word中平方米的单位怎么打

1、以Word2010版本为例&#xff0c;在文档中输入了平方米的单位&#xff0c;但是数字2不在上方&#xff1b;2、首先选中数字2&#xff0c;然后点击页面上方的上标图标&#xff0c;如下图所示&#xff1b;3、点击上标图标后&#xff0c;就会发现数字2在字母的右上方了&#xff0…

SQL Server 索引重建手册

注意&#xff1a;索引重建前建议把数据库切换为完整模式&#xff0c;否则索引复制会在数据文件中进行&#xff0c;导致数据文件很大&#xff0c;而数据文件的收缩比日志文件的收缩要困难的多&#xff0c;且会对业务造成影响。步骤一:查询索引碎片&#xff0c;脚本如下&#xff…

apache camel_令人印象深刻的第一个Apache Camel版本

apache camel在准备下周的CamelOne会议时&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印…