在线斯诺克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…

html url js编码顺序,前端url编码

为什么要编码&#xff1a;Http协议中参数的传输是"keyvalue"这种简直对形式的&#xff0c;如果要传多个参数就需要用“&”符号对键值对进行分割如"?name1value1&name2value2"&#xff0c;这样在服务端在收到这种字符串的时候&#xff0c;会用“&a…

AWS SQS和Spring JMS集成

Amazon WEB服务为我们提供了SQS消息传递服务。 sqs的java sdk与JMS兼容。 因此&#xff0c;可以将SQS与spring提供的JMS集成框架集成在一起&#xff0c;而不是将SQS用作简单的spring bean。 我将使用spring-boot和gradle。 gradle文件&#xff1a; group com.gkatzioura.sq…

手势相关-解决手势冲突

解决UITableview点击事件与手势的冲突 1.签手势代理 <UIGestureRecognizerDelegate> 2.是tableview点击事件则屏蔽手势 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIS…

html动画用css还是js,javascript与css3动画结合使用小结

当Html5,css3已渐渐成为主流的时候&#xff0c;我还非常习惯的用js去做一些简单的动画。因为在桌面浏览器上&#xff0c; 并非所有的都支持css3。用户也倒是很奇怪&#xff0c;用户习惯并不是每个用户都可以被培养。总有不少人会觉得win7.win8没xp好用。但手机方面就大不一样了…

洛谷 P3146 [USACO16OPEN]248

P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The g…

java将HTML文件转化为pdf文件,如何使用Java将HTML网页转换为PDF文件

我一直在互联网上搜索如何使用Java将HTML页面转换为PDF文件。我发现了很多指针&#xff0c;简而言之&#xff0c;它们不起作用或难以实现。我也下载了一个商业产品&#xff0c;pdf4ml;该API是我很乐意与之合作的&#xff0c;除了当我在维基百科上检索一个简单的页面时&#xff…

java抽象类和模板模式_测试抽象类和模板方法模式

java抽象类和模板模式摘自Wikipedia&#xff0c;“模板方法定义了算法的程序框架。 子类可以覆盖一个或多个算法步骤&#xff0c;以允许不同的行为&#xff0c;同时确保仍然遵循总体算法。” 通常&#xff0c;此模式由两个或多个类组成&#xff0c;一个是提供模板方法&#xff…

第三章 使用单元测试测试简单的首页

3.1第一个Django应用&#xff0c;第一个单元测试 python3 manage.py startapp lists 创建一个应用 功能测试站在用户的角度从外部测试应用&#xff0c;而单元测试从程序员的角度从内部测试应用 3.2Django中的单元测试 打开新生成的的文件lists/tests.py 注&#xff1a;单元测试…

微型计算机应用领域及应用,自考“微型计算机应用基础”自考大纲(1)

I. 课程性质微型计算机应用基础是高等教育自学考试经济管理类各专业的一门必修的应用基础课程&#xff0c;同时它也适用于文、法、医、农各专业选修。了解计算机这一现代化工具的性能、特点和一般工作原理&#xff0c;掌握计算机基础知识&#xff0c;学会计算机的基本操作&…

Lambda的Lambda(如果可选)

因此&#xff0c;我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是&#xff0c;没有明显的方法可以在块中执行else操作&#xff0c;因为只有isPresent方法&#xff0c;除非您使用的是老式的if语句。 第二个问题当然是古老的板栗&#xff0c;即使您能够做到&#xff0c…

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

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

周赛。。。。

分糖果 分糖果 题意 要篮子里有不少于 n 块糖果&#xff0c;幼儿园的所有 n 个小朋友&#xff08;包括你自己&#xff09;都从篮子中拿走恰好一块糖&#xff0c;直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励。 思路 这个程…

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

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

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

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

HTML中confirm替换,Javascript直接Confirm()函数替换

我想替换Javascript Confirm()函数以允许自定义按钮,而不是Yes / Cancel.我尝试搜索,但是所有解决方案都是事件驱动的,例如jquery对话框(其中代码不等待响应,而是事件驱动的).有谁知道非事件驱动的解决方案.它必须在Safari和IE中都可以使用(因此没有vbscript).这是系统许多部分…

关于windows防火墙关不掉解决办法

建立一个.bat文件&#xff0c;写以下内容: echo off title 正在启动防火墙服务 sc config MpsSvc startauto net start MpsSvc pause 至此完毕&#xff0c;重启试试就知道了 转载于:https://www.cnblogs.com/ciscolee/p/7616588.html

Java中特质模式的定义

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

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

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