HTML5 游戏开发实战 | 扑克翻牌

您所在的位置:网站首页 实战flash游戏开发 HTML5 游戏开发实战 | 扑克翻牌

HTML5 游戏开发实战 | 扑克翻牌

2023-05-29 06:52| 来源: 网络整理| 查看: 265

需要强调的是,setTimeout函数只执行code一次。如果要多次调用,可以让code自身再次调用setTimeout函数。

例如,下面代码调用setTimeout函数实现1小时倒计时。

< body>

< divid= "timer">

< type= "text/java"language= "java">

vard1= newDate; //年月日时分秒

vard2=d1.getTime+ 60* 60* 1000

varendDate= newDate(d2)

functiondaoJiShi( )

{

varnow= newDate; //获取当前时间

//now返回自 1970年1月1日 00:00:00 以来的总毫秒数

varoft= Math.round((endDate-now)/ 1000);

varofd= parseInt(oft/ 3600/ 24); //天

varofh= parseInt((oft%( 3600* 24))/ 3600); //小时

varofm= parseInt((oft% 3600)/ 60); //分

varofs=oft% 60; //秒

document.getElementById( 'timer').innerHTML= '还有 '+ofd+ ' 天 '+ofh+ ' 小时 '+ofm+ ' 分钟 '+ofs+ ' 秒';

if(ofs< 0){ document.getElementById( 'timer').innerHTML= '倒计时结束!'; return;};

setTimeout( 'daoJiShi', 1000); //自身再次调用daoJiShi函数

};

daoJiShi;

2.使用setInterval函数实现倒计时功能

由于setTimeout函数只能执行代码code一次,想要多次调用code可以使用setInterval函数。setInterval函数可按照指定的周期(以毫秒计)来调用需要重复执行的函数代码。

setInterval函数的语法如下:

setInterval(function,interval [,arg1,arg2,…,argn])

其中,function参数可以是一个匿名函数或是一个函数名,interval是设定的调用function的时间间隔,单位为毫秒(默认值为10毫秒),arg1,arg2,…,argn为可选参数,是传递给function的参数。

下面的例子是每隔1秒调用一次匿名函数。

setInterval( function{trace( "每隔1秒钟我就会显示一次")} , 1000);

其中,function{}是没有函数名的函数,称为匿名函数,后面的1000是时间间隔,单位是毫秒,即1秒。

下面的例子用于展示如何带参数运行。

functionshow1{

trace( "每隔1秒显示一次");

}

functionshow2(str){ //带参数函数show2

trace(str);

}

setInterval(show1, 1000);

setInterval(show2, 2000, "每隔2秒我就会显示一次"); //调用带参数函数show2

setInterval函数会不停地调用函数,直到clearInterval函数被调用或窗口被关闭。由setInterval函数返回的ID值可用作clearInterval(ID)函数的参数。在游戏开发中,常常使用setInterval函数制作游戏动画或其他间隔性渲染效果。

varintervalID=setInterval(show1, 1000);

clearInterval(intervalID); //取消该定时设置

例如,下面代码用setInterval函数实现1小时倒计时。

扑克牌的显示与隐藏

游戏中使用的扑克牌牌面及背面采用1张图片(deck.png)存储,如图8-2所示。其中上面4行分别为4种花色的扑克牌,最后一行是扑克牌背面,每行高度为120px。如何分割显示某一张扑克牌,这里使用CSS3技术来实现。

■ 图8-2存储扑克牌的图片deck.png

例如,显示扑克牌背面图案可按如下代码写CSS类别。

.front

{

width: 80px; height: 120px;

background-image: url( "../images/deck.png");

background-position: 0- 480px;

z-index: 10;

}

类别.front的背景图片是deck.png,background-position设置背景图片的位置。例如,background-position: 0 0; 表示背景图片的左上角将与容器元素的左上角对应。该设置与background-position: left top; 或者background-position: 0% 0%; 设置的效果是一致的。

而background-position: 0-480px; 表示图片以容器左上角为参考向左偏移0px,向上偏移480px,从而正好是扑克牌背面图片区域。

z-index属性设置元素的堆叠(显示)顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素前面。z-index的值越大,元素的堆叠层级越高。

background简写属性可在一个声明中设置所有的背景属性。可以设置如下属性:background-color、background-position、background-size、background-repeat、background-origin、background-clip、background-attachment、background-image。如果不设置其中的某个值,也是允许的。例如:

background: #999url( "../images/deck.png") 0- 480px;

background: #ff0000url( 'smiley.gif');

显示扑克牌牌面图案可按如下代码写CSS类别。

其中:

.cardAJ{background-position:-800px 0;}

background-position: -800px 0; 表示图片以容器左上角为参考向左偏移800px,由于图片中每张牌宽度为80px,所以正好显示出黑桃J。

.cardBJ{background-position:-800px-120px;}

background-position: -800px-120px; 表示图片以容器左上角为参考向左偏移800px,向上偏移120px,所以正好显示出红桃J。

.cardCJ{background-position:-800px-240px;}

background-position: -800px-240px; 表示图片以容器左上角为参考向左偏移800px,向上偏移240px,所以正好显示出梅花J。

.cardDJ{background-position:-800px-360px;}

background-position: -800px-360px; 表示图片以容器左上角为参考向左偏移800px,向上偏移360px,所以正好显示出方块J。

因此, 就能显示出黑桃J,就能显示出红桃J,就能显示出梅花J,就能显示出方块J。同理,可以显示出其他牌的牌面,仅background-position中的偏移量不同。

z-index设置为8,所以牌面显示在扑克牌背面下方,被隐藏。

扑克牌的删除

扑克牌的删除利用设置透明度来实现。

.card-removed/*移除牌*/

{

opacity: 0;

}

opacity: 0设置div的不透明度为0。Opacity取值从0.0(完全透明)到1.0(完全不透明)。也可以使用visibility: hidden来实现,这两个效果都是让元素不显示,但visibility: hidden 是让元素不可见,但仍会占据页面上的空间。

添加删除类别Class

扑克牌的显示、隐藏和删除都是CSS中类别Class。需要将这些类别设置到HTML的标记元素(如 )上,jQuery中的addClass方法用于添加类别Class,而removeClass方法用于删除类别Class。

addClass(className)中的className为一个字符串,为指定元素添加这个className类别。removeClass(className)指定元素移除的一个或多个用空格隔开的样式名或类别。

举例说明:

有一个:

使用jQuery实现,当单击“中原工学院”的时候自动添加class="select",代码自动变成:

然后,单击“郑州大学”,代码又变成:

jQuery可以用下述代码实现:

jQuery代码中$("a")选择所有的元素,在元素的单击事件中,each方法遍历所有的元素并删除元素上的"select"类别。$(this)代表当前被单击的元素,$(this).addClass("select")是给当前被单击的元素增加"select"类别。

03

扑克翻牌游戏设计的步骤

设计CSS(matchgame.css)

根据程序设计的思路,设计如下的CSS文件。

body

{

text-align: center;

background-image: url( "../images/bg.jpg");

}

#game

{

width: 502px;

height: 462px;

margin: 0auto;

border: 1pxsolid #666;

border-radius: 10px;

background-image: url( "../images/table.jpg");

position: relative;

display: -webkit-box;

-webkit-box-pack:center;

-webkit-box-align:center;

}

#cards

{

width: 380px;

height: 400px;

position: relative;

margin: 30pxauto;

}

.card

{

width: 80px;

height: 120px;

position: absolute;

}

.face

{

width: 100%;

height: 100%;

border-radius: 10px;

position: absolute;

-webkit- backface-visibility: hidden;

-webkit- transition:all . 3s;

}

.front

{

background: #999url( "../images/deck.png") 0- 480px;

z-index: 10;

}

.back

{

background: #efefefurl( "../images/deck.png");

-webkit- transform-rotateY(-180deg);

z-index: 8;

}

.face:hover

{

-webkit- box-shadow: 0040px#aaa;

}

/*牌面定位样式*/

.cardAJ{ background-position: - 800px0;}

.cardAQ{ background-position: - 880px0;}

.cardAK{ background-position: - 960px0;}

.cardBJ{ background-position: - 800px- 120px;}

.cardBQ{ background-position: - 880px- 120px;}

.cardBK{ background-position: - 960px- 120px;}

.card-flipped.front

{

/*保证牌底在牌面下面,z-index值切换为小值*/

z-index: 8;

-webkit- transform: rotateY( 180deg);

}

.card-flipped.back

{

/*保证牌底在牌面上面,z-index值切换为大值*/

z-index: 10;

/*前面牌面已经翻过去,现在返回来*/

-webkit- transform: rotateY( 0deg);

}

/*移除牌*/

.card-removed

{

opacity: 0;

}

游戏页面index.html

在游戏页面中,整个游戏区域是一个id="cards"的,而每张牌的区域是一个class="card"的,其中含上下层两个,是上层显示牌面,是下层显示牌面。

< divclass= "face front">

< /div>

注意,最初仅仅有1张牌的区域,其余的23张牌的区域是页面加载后复制实现的。页面加载后,首先利用Array.sort方法将deck数组存储的牌随机排序,实现洗牌效果;然后调整CSS坐标属性"left"、"top",设置每张牌的区域在屏幕上的位置;最后在每张牌的区域中的下层添加类别(如.cardAJ、.cardBJ)就可以显示对应牌面。

< html>

< headlang= "en">

< metacharset= "UTF-8">

< title> html5扑克翻牌消除小游戏

< linkhref= "matchgame.css"rel= "stylesheet">

< body>

< type= "text/java"src= "matchgame.js">

< type= "text/java"src= "jquery-3.3.1.min.js">

< sectionid= "game">

< divid= "cards">

< divclass= "card">

< divclass= "face front">

< divclass= "face back">

< type= "text/java">

$( function( ) {

//实现随机洗牌

matchingGame.deck.sort(shuffle);

//alert(matchingGame.deck);

var$card=$( ".card");

for( vari= 0;i< 23;i++)

{

$card.clone.appendTo($( "#cards"));

}

//对每张牌进行设置

$( ".card").each( function( index)

{

//调整坐标

$( this).css({

"left":(matchingGame.cardWidth+ 20)*(index% 8)+ "px",

"top":(matchingGame.cardHeight+ 20)* Math.floor(index/ 8)+ "px"

});

//吐出一个牌号

varpattern=matchingGame.deck.pop;

//暂存牌号

$( this).data( "pattern",pattern);

//把其翻牌后的对应牌面附加上去

$( this).find( ".back").addClass(pattern);

//点击牌的功能函数挂接

$( this).click(selectCard);

});

});

< divstyle= "text-align:center;margin:50px 0; font:normal 44px/56px ">

< p> 扑克翻牌游戏

< divid= "timer">

< type= "text/java"language= "java">

varsuccess= false;

vard1= newDate; //年月日时分秒

vard2=d1.getTime+ 2* 60* 1000

varendDate= newDate(d2);

functiondaoJiShi( )

{

varnow= newDate; //获取当前时间

//now返回自 1970 年 1 月 1 日 00:00:00 以来的总毫秒数

varoft= Math.round((endDate-now)/ 1000);

varofd= parseInt(oft/ 3600/ 24);

varofh= parseInt((oft%( 3600* 24))/ 3600);

varofm= parseInt((oft% 3600)/ 60);

varofs=oft% 60;

document.getElementById( 'timer').innerHTML= '还有 '+ofm+ ' 分钟 '+ofs+ ' 秒';

if(success== true) return; //停止计时

if(ofs< 0){

document.getElementById( 'timer').innerHTML= '倒计时结束!';

if(success== false)alert( '你挑战失败了!');

return;

};

setTimeout( 'daoJiShi', 1000);

};

daoJiShi;

设计脚本

定义存储所有牌的数组deck。

varmatchingGame={};

matchingGame.cardWidth= 80; //牌宽

matchingGame.cardHeight = 120;

//存储所有的牌

matchingGame.deck=

[

"cardAK", "cardAK", "cardAQ", "cardAQ", "cardAJ", "cardAJ",

"cardBK", "cardBK", "cardBQ", "cardBQ", "cardBJ", "cardBJ",

"cardCK", "cardCK", "cardCQ", "cardCQ", "cardCJ", "cardCJ",

"cardDK", "cardDK", "cardDQ", "cardDQ", "cardDJ", "cardDJ"

]

//随机排序函数,返回-1或1

functionshuffle( )

{

//Math.random能返回0~1之间的数

returnMath.random> 0.5? -1: 1

}

单击牌事件的功能函数selectCard,实现翻牌的功能。被翻过的牌都已添加"card-flipped"类别,所以$(".card-flipped")获取所有的翻过牌的,数量超过1则说明已翻了两张牌,不能再翻牌,从而退出翻牌。

若翻动了两张牌,检测是否相同。

functionselectCard( ) { //翻牌功能的实现

var$fcard=$( ".card-flipped");

//翻了两张牌后退出翻牌

if($fcard.length> 1)

{

return;

}

$( this).addClass( "card-flipped");

//若翻动了两张牌,检测一致性

var$fcards=$( ".card-flipped");

if($fcards.length== 2)

{

setTimeout( function( ) {

checkPattern($fcards);}, 700);

}

}

//检测2张牌是否一致

functioncheckPattern( cards)

{

varpattern1 = $(cards[ 0]).data( "pattern"); //第一张牌牌面数据

varpattern2 = $(cards[ 1]).data( "pattern"); //第二张牌牌面数据

$(cards).removeClass( "card-flipped") //删除"card-flipped"类别

if(pattern1==pattern2)

{

$(cards).addClass( "card-removed") //透明效果

var$ fcards=$( ".card-removed");

if($ fcards.length== 24)

{

alert( "恭喜你成功了!");

succcess= true;

}

}

}

至此,完成扑克翻牌游戏。

04

参考书籍

HTML5网页游戏设计从基础到开发(第2版·微课视频版)

编辑推荐:11个游戏实战案例,提供视频、源代码、教学课件、教学大纲、扩展案例

技术背景

HTML5是 HyperText Markup Language 5 的缩写。HTML5 技术结合了 HTML4.01的相关标准并对其进行革新,符合现代网络发展要求。HTML5是互联网的下一代标准,是构建和呈现互联网内容的一种语言方式,被认为是互联网的核心技术之一。HTML5在2014年10月由万维网联盟(W3C)完成标准制定,仍处于完善之中。然而HTML5已经引起了业内的广泛兴趣,Chrome、Firefox、Opera、Safari等主流浏览器都已经支持HTML5技术,新Edge浏览器率先实现100%支持HTML5。

本书作者长期从事HTML5网页设计教学与应用开发,在长期的工作、学习中,积累了丰富经验和教训,能够了解在学习编程的时候需要什么样的书才能提高HTML5开发能力,以最少的时间投入得到最快的实际应用。

本书主要内容

本书分为基础篇和实战篇。

基础篇包括第1~6章,主要讲解HTML5的基础知识和相关新技术,如Java、Canvas API画图、CSS3和jQuery及其使用技巧;

实战篇包括第7~17章,综合应用前面技术,开发经典的大家耳熟能详的游戏,如人物拼图、扑克翻牌、推箱子、五子棋、黑白棋、俄罗斯方块、贪吃蛇、雷电飞机射击、Flappy Bird、中国象棋。通过本书读者将学会如何利用HTML5和Java、CSS3制作交互式游戏、平台类游戏,学会网页游戏设计。

本书特点

(1)内容全面,代码通用。本书所有案例的源代码通用性强,便于读者直接应用于大部分游戏的开发。

(2)理论夯实,案例丰富。每款游戏案例均提供详细的设计思路、关键技术分析以及具体的解决步骤方案,案例实用性强。返回搜狐,查看更多



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3