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 相关文章推荐
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
js 操作select相关方法函数
Dec 06 Javascript
JavaScript中的类继承
Nov 25 Javascript
jQuery使用元素属性attr赋值详解
Feb 27 Javascript
JS判断是否长按某一键的方法
Mar 02 Javascript
判断JS对象是否拥有某属性的方法推荐
May 12 Javascript
js时间查询插件使用详解
Apr 07 Javascript
jQuery实现的简单对话框拖动功能示例
Jun 05 jQuery
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
Mar 10 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 Javascript
JavaScript实现点击自制菜单效果
Feb 02 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
删除无限级目录与文件代码共享
2006/07/12 PHP
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
关于页面优化和伪静态
2009/10/11 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
Jquery插件编写简明教程
2014/03/25 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
如何理解transaction事务的概念
2015/05/27 面试题
餐饮主管岗位职责
2013/12/10 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
2014年教师节寄语
2014/04/03 职场文书
基层工作经验证明样本
2014/11/16 职场文书
品质保证书格式
2015/02/28 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
2015秋季开学典礼新闻稿
2015/07/17 职场文书
浅析Django接口版本控制
2021/06/26 Python
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS