js+canvas实现纸牌游戏


Posted in Javascript onMarch 16, 2020

本文实例为大家分享了js+canvas实现纸牌游戏的具体代码,供大家参考,具体内容如下

废话不多说,先上地址

运行截图

js+canvas实现纸牌游戏

js+canvas实现纸牌游戏

最后如果完成了会有结束动画,我技术比较渣,难以玩到结束,就不上完成动画截图了。

游戏介绍

好吧,可能有些好学生在做上机实验时没有玩纸牌游戏,所以容我介绍一下这个游戏,这个游戏是win7自带的一个纸牌类游戏,游戏规则是:将牌按一定的规则码放,最终将所有的牌牌面朝上胜利。有两个地方可以用来码牌,上:以A开头,即将码放的牌的花色相同,且牌面值比原来的牌面大1,则可以码放成功;下:以K开头,即将码放的牌的颜色不同,且牌面值比原来的牌面小1,则可以成功码放。

支持的操作

点击、拖拽相比微软纸牌,增加了点击牌自动找到合适的位置的码放方式,所以整个游戏大部分操作只需要点击就可以了。

设计思路

1. 游戏运行驱动

游戏以玩家操作(鼠标点击与移动)为驱动。
点击与移动鼠标时,通过记录鼠标的位置与状态,可以得到以下四个事件(按下、移动、弹起、单击)。
首先,需要注册鼠标点击、移动和弹起事件

function BindEvent()
  {
   $(window).bind("mousedown touchstart", function (e)
   {
    e.preventDefault();
    var x;
    var y;
    if (e.type == "touchstart")
    {
     x = e.originalEvent.changedTouches[0].clientX;
     y = e.originalEvent.changedTouches[0].clientY;
    }
    else
    {
     x = e.clientX;
     y = e.clientY;
    }
    if (isPlayingAnimation)
    {
     return;
    }
    ActionDown(x, y - 50);
   });

   $(window).bind("mousemove touchmove", function (e)
   {
    e.preventDefault();
    var x;
    var y;
    if (e.type == "touchmove")
    {
     x = e.originalEvent.changedTouches[0].clientX;
     y = e.originalEvent.changedTouches[0].clientY;
    }
    else
    {
     x = e.clientX;
     y = e.clientY;
    }
    if (isPlayingAnimation)
    {
     return;
    }
    ActionMove(x, y - 50);
   });

   $(window).bind("mouseup touchend", function (e)
   {
    e.preventDefault();
    var x;
    var y;
    if (e.type == "touchend")
    {
     x = e.originalEvent.changedTouches[0].clientX;
     y = e.originalEvent.changedTouches[0].clientY;
    }
    else
    {
     x = e.clientX;
     y = e.clientY;
    }
    if (isPlayingAnimation)
    {
     return;
    }
    ActionUp(x, y - 50);
   });
  }

然后在弹起事件里面检测鼠标在弹起之前移动了多少距离,如果移动的距离很小,可以忽略不计,则认为这是一次点击操作。

注意:这里事件注册不是在每张牌上,因为52张牌实际上都画在canvas上,然而52张牌的坐标都是知道的,所以通过计算就可以知道用选择了哪些牌,正在将牌移到哪里。等玩家松手后就可以实现码放操作。

2. 界面设计

顶栏用于显示积分、时间

<div id="titleContainer">
  <div>Score:<span id="score">0</span></div>
  <div>Timer:<span id="timer">00:00:00</span></div>
</div>

接下来就是桌面

<div id="deskTop">
  <canvas id="canvasBack"></canvas>
  <canvas id="canvasFont"></canvas>
</div>

可以看到,桌面有两个canvas,一前一后,这实际上是将游戏画面分为了两层,玩家看到的画面是两个画面叠加在一起的。

之所以用两个层,主要是为了避免实时绘制整个界面,鼠标选中一些牌后将要实施移动操作,这时实际上只有被鼠标选中的那些牌的位置在变化,而桌上剩余的牌实际上没有任何变化,这时如果还实时绘制后面的没有变化的牌有些浪费。所以把鼠标选中的那些牌拿出来,放到canvasFont层里面,这样,两个层都不用实时绘制,被鼠标选中的牌在移动的时候只需要移动他们被绘制在的canvasFont就可以了。

3. 流程

js+canvas实现纸牌游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
自己的js工具_Form 封装
Aug 21 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
Dec 08 Javascript
javascript中使用正则表达式清理table样式的代码
Apr 01 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
Jan 01 Javascript
javascript DOM的详解及实例代码
Mar 06 Javascript
移动端使用localResizeIMG4压缩图片
Apr 22 Javascript
js学习心得_一个简单的动画库封装tween.js
Jul 14 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 Javascript
微信小程序利用button控制条件标签的变量问题
Mar 15 #Javascript
JS apply用法总结和使用场景实例分析
Mar 14 #Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 #Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 #Javascript
js实现的订阅发布者模式简单示例
Mar 14 #Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 #Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 #Javascript
You might like
使PHP自定义函数返回多个值
2006/11/26 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
php实现的Timer页面运行时间监测类
2014/09/24 PHP
PHP fclose函数用法总结
2019/02/15 PHP
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python实现telnet客户端的方法
2015/04/15 Python
python对json的相关操作实例详解
2017/01/04 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
什么是lambda函数
2013/09/17 面试题
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
创联软件面试题笔试题
2012/10/07 面试题
移动通信行业实习自我鉴定
2013/09/28 职场文书
师范大学音乐表演专业求职信
2013/10/23 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
考试诚信承诺书
2014/05/23 职场文书
爱心捐款感谢信
2015/01/20 职场文书
2015初中团委工作总结
2015/07/28 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
frg-100简单操作(设置)说明
2022/04/05 无线电