- 浏览: 594082 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
青春依旧:
html5教学哪家强!当然要上华清远见!
深入理解浏览器兼容性模式 -
ashur:
真机智,看得我都笑自己了
js 字符串转dom 和dom 转字符串 -
panghaoyu:
实现一个智能提示功能需要ajax、数据库、jsp/php、算法 ...
solr第一弹 autocomplete(自动补全) -
FakLove:
连线如何删除啊
基于html5 的拖拽连线 -
FakLove:
连线可以再删除吗?
基于html5 的拖拽连线
我在开发俄罗斯方块的时候大致把整个游戏分拆成了三个大的组件
1:图形构建与变换
2: 按键控制
3:摆位与等分
第一部分先介绍图形构建部分
我玩过好多版本的俄罗斯方块,有些图形种类比较多,但是最基本版的俄罗斯方块大致有其中图形
第一个和第七个各有一个反方向的
只要把图形的算法抽象好,如果移动和变换图形都会是很简单的事情,不然就会出现拖影和闪动的问题
我在构建图形的时候把图形拆分成了主要三部分
1:方块
2:点
3:方向
每一个图形都是由一个个方块堆积而成,一个个方块由一个坐标点绘制而成,在加上有方向的绘制就构成了一个完整的图形
一下代码中最为重要的是shape1 中各种变换图形的算法,
在shape1 中有arrayMoveU,arrayMoveD,arrayMoveL,arrayMoveR,
这四个数组就是控制图形变换的核心,
例如竖条的变换只有两种,一种横,一种竖,
方块只有一种原始形态,没有变换形态
而T型则有4中变换形态,但是没有是一种图形可以超过四种变换形态
还是例如竖条行arrayMoveU arrayMoveD 两种其实是一种,arrayMoveL arrayMoveR 也是一种
this.arrayMoveU=[new AspectUnit(Aspect.SOUTH,true),new AspectUnit(Aspect.SOUTH,false),new AspectUnit(Aspect.SOUTH,false)];
代表一个画笔,但是是除去头得画笔,应为每个画笔的头需要单独计算
arrayMoveU 的含义就代表 画笔连续往南画三个atom 所以就形成了一个竖条
this.arrayMoveL=[new AspectUnit(Aspect.EAST,true),new AspectUnit(Aspect.EAST,false),new AspectUnit(Aspect.EAST,false)];
arrayMoveL 的含义就代表 画笔连续往西画三个atom 所以就形成了一个横条
所有类型的图形变换其实就是靠定义不同的画笔走向绘制图形,
这样说仅仅是一个思想,因为涉及到图形坐标,方向,转轴,头点的计算,会涉及到大量的变量定义。
function Pos(x,y){
this.x=x; this.y=y; this.equals=function(p){ if(this.x==p.x&&this.y==p.y){ return true; } return false; } }
function Atom(p){ var rect=new Kinetic.Rect({ x: p.x, y: p.y, width: atomWidth, height: atomWidth, fill: "#00D2FF", stroke: "black", strokeWidth: 2 }); return rect; }
/**
绘制图形1 竖条 */ function Shape1(startAtomUnit,c,array){ //绘图轨迹数组当旋转方向为up 的时候绘图 new AspectUnit(Aspect.SOUTH,false); this.arrayMoveU=[new AspectUnit(Aspect.SOUTH,true),new AspectUnit(Aspect.SOUTH,false),new AspectUnit(Aspect.SOUTH,false)]; //绘图轨迹数组当旋转方向为down 的时候绘图 this.arrayMoveD=[new AspectUnit(Aspect.SOUTH,true),new AspectUnit(Aspect.SOUTH,false),new AspectUnit(Aspect.SOUTH,false)]; //绘图轨迹数组当旋转方向为left 的时候绘图 this.arrayMoveL=[new AspectUnit(Aspect.EAST,true),new AspectUnit(Aspect.EAST,false),new AspectUnit(Aspect.EAST,false)]; //绘图轨迹数组当旋转方向为right 的时候绘图 this.arrayMoveR=[new AspectUnit(Aspect.EAST,true),new AspectUnit(Aspect.EAST,false),new AspectUnit(Aspect.EAST,false)]; this.startAtomUnit=startAtomUnit; this.keepPoint=null; this.c=c; this.draw=function(){ switch(c){ case Circ.UP: this.drawU(startAtomUnit,array); break; case Circ.DOWN: this.drawD(startAtomUnit,array); break; case Circ.LEFT: this.drawL(startAtomUnit,array); break; case Circ.RIGHT: this.drawR(startAtomUnit,array); break; } }; this.drawU=function(){ for(var i=0;i<this.arrayMoveU.length;i++){ if(this.arrayMoveU[i].aspect==Aspect.EAST){ var au=null; if(!this.arrayMoveU[i].isPoint) au=new AtomUnit(false,Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveU[i].aspect==Aspect.WEST){ var au=null; if(!this.arrayMoveU[i].isPoint) au=new AtomUnit(false,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveU[i].aspect==Aspect.NORTH){ var au=null; if(!this.arrayMoveU[i].isPoint) au=new AtomUnit(false,Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveU[i].aspect==Aspect.SOUTH){ var au=null; if(!this.arrayMoveU[i].isPoint) au=new AtomUnit(false,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; } } }; this.drawD=function(){ for(var i=0;i<this.arrayMoveD.length;i++){ if(this.arrayMoveD[i].aspect==Aspect.EAST){ var au=null; if(!this.arrayMoveD[i].isPoint) au=new AtomUnit(false,Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveD[i].aspect==Aspect.WEST){ var au=null; if(!this.arrayMoveD[i].isPoint) au=new AtomUnit(false,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveD[i].aspect==Aspect.NORTH){ var au=null; if(!this.arrayMoveD[i].isPoint) au=new AtomUnit(false,Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveD[i].aspect==Aspect.SOUTH){ var au=null; if(!this.arrayMoveD[i].isPoint) au=new AtomUnit(false,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; } } }; this.drawL=function(){ for(var i=0;i<this.arrayMoveL.length;i++){ if(this.arrayMoveL[i].aspect==Aspect.EAST){ var au=null; if(!this.arrayMoveL[i].isPoint) au=new AtomUnit(false,Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveL[i].aspect==Aspect.WEST){ var au=null; if(!this.arrayMoveL[i].isPoint) au=new AtomUnit(false,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(false,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveL[i].aspect==Aspect.NORTH){ var au=null; if(!this.arrayMoveL[i].isPoint) au=new AtomUnit(false, Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(false, Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveL[i].aspect==Aspect.SOUTH){ var au=null; if(!this.arrayMoveL[i].isPoint) au=new AtomUnit(false,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(false,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; } } }; this.drawR=function(){ for(var i=0;i<this.arrayMoveR.length;i++){ if(this.arrayMoveR[i].aspect==Aspect.EAST){ var au=null; if(!this.arrayMoveR[i].isPoint) au=new AtomUnit(false, Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true, Atom(calE(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveR[i].aspect==Aspect.WEST){ var au=null; if(!this.arrayMoveR[i].isPoint) au=new AtomUnit(false,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calW(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveR[i].aspect==Aspect.NORTH){ var au=null; if(!this.arrayMoveR[i].isPoint) au=new AtomUnit(false,Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calN(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; }else if(this.arrayMoveR[i].aspect==Aspect.SOUTH){ var au=null; if(!this.arrayMoveR[i].isPoint) au=new AtomUnit(false,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); else au=new AtomUnit(true,Atom(calS(this.startAtomUnit)),false,Type.SHAPE1); array.push(au); this.startAtomUnit=au; } } }; }
发表评论
-
浏览器事件是冒泡还是捕获
2016-07-27 16:37 3033这是三种事件处理的模型 (1)冒泡型事件:事件按照从最特定 ... -
javascript 编程反思1 new 原理
2016-04-27 14:05 0我们在定义对象的时候通常使用两种方式 1:通过new 关键 ... -
javascript 设计模式1 单例模式
2015-06-15 15:10 0... -
facebook html5开发app 失败的原因,
2015-06-08 11:56 1963Here’s why the Facebook iOS a ... -
jQuery zepto 用法区别
2015-05-22 11:50 0以前都是用jQuery 因为移动项目中在使用zepto 基本 ... -
js 加载机制和defer async用法
2015-05-15 17:45 0这是今天我一个 ... -
grunt 不是内部命令
2015-05-04 19:21 1464grunt 不是内部命令!! ... -
你不知道的URL中#井号用法
2015-02-10 12:36 7091URL 中 # 井号的用法 ... -
JS 伪数组原理详解
2014-12-01 11:24 2494jav ... -
jquery 滚动条插件nanoScroller 的用法
2014-11-27 11:17 5709scroller 插件nanoSc ... -
h5,hybrid 开发中问题汇总
2014-10-17 11:26 8219H5开发问题总结 和jqu ... -
backbone中的 reuter 和histroy
2014-10-13 10:45 631Router和History (路由控制) Back ... -
animate 技术分析 raphael
2014-07-28 16:40 0Animate 什么是animate,一般我 ... -
Raphaeljs 插件实现任意SVG节点加载
2014-07-14 09:26 8638SVG 和Raphael http://rap ... -
ECMAScript 5
2014-07-08 14:36 1062新版本在给基本库带来 ... -
jQueryUI Widget 代码详解
2014-07-07 12:20 0为什么需要研究JqueryUI 中Widget 的代码 ... -
typescript 用法介绍
2014-07-01 09:58 1239前言 Typescript的形態 如何定義va ... -
window.eval 与eval 区别
2014-06-27 10:57 1090它们之间有区别吗? 开发过程中似乎很少有人去加个额外的win ... -
jQuery 学习分析系列1 jQuery是个什么东西
2014-06-23 10:06 0jQuery 的基本结构 过去使用jQuery ... -
Sizzle 引擎--原理与实践3
2014-06-18 14:05 792Sizzle引擎--原理与实践(三) 查找的入口对 ...
相关推荐
**HTML5俄罗斯方块——基于KineticJS的应用开发** HTML5是现代网页开发的重要标准,它引入了许多新的特性和API,使得开发者可以构建更丰富、更动态的网页应用。在这个项目中,我们将深入探讨如何使用HTML5和...
在“navigation-kinetic-devel.rar”这个压缩包中,我们聚焦于ROS Kinetic版本的导航功能,这涉及到一系列的ROS节点、环境配置以及路径规划算法。 ROS Kinetic是ROS的一个重要分支,它基于Ubuntu 16.04 LTS(Xenial...
《Android SLAM技术在清洁机器人应用中的实现》 在当今的智能硬件领域,自主导航与定位已经成为机器人技术的重要组成部分,特别是在家庭服务机器人的应用中。SLAM(Simultaneous Localization And Mapping,即同时...
《Ubuntu16.04导航包:navigation-kinetic-devel.zip详析》 在Linux操作系统,尤其是Ubuntu 16.04这样的长期支持版本中,开发者和机器人技术爱好者经常需要处理各种软件包,以实现特定的功能。navigation-kinetic-...
在ROS Kinetic版本中,它被称为ddynamic_reconfigure,这个压缩包"ddynamic_reconfigure-kinetic-devel.zip"显然是为ROS Kinetic开发环境准备的源代码或者开发库。 ROS是一个开源操作系统,专门用于设计和实现...
它提供了一种分布式计算框架,能够支持机器人硬件的抽象化处理、设备驱动程序的开发、传感器数据的获取、常用机器人算法的实现,以及高级应用的编写。 - **特点**: - 分布式架构:ROS 基于节点的概念构建,每个节点...
2. **进入目录**:进入解压后的目录,例如`cd opencv3-release-release-kinetic-opencv3`。 3. **配置**:使用`cmake`进行配置,指定安装路径和其他选项,如`cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_...
在本案例中,我们关注的是 "ros-kinetic-libg2o",这是一个针对ROS Kinetic Kame版本的库,名为libg2o。 libg2o,全称Generic Graph Optimization,是一个C++库,专门用于处理优化问题,特别是在机器人领域,如SLAM...
### Kinetic系列单片机知识点概述 #### 一、Kinetic系列单片机简介 ...通过以上介绍,我们可以看到Kinetic系列单片机凭借其高性能、高集成度和广泛的市场应用前景,在工业控制领域具有巨大的潜力和发展空间。
ros-kinetic-serial_1.2.1-0xenial-20191214-001149+0000_amd64.deb
总结一下,"catkin-kinetic-devel.zip"是ROS Kinetic版本下的一个catkin工作空间开发版本,包含了构建和运行ROS项目所需的环境和配置。使用这个工作空间,开发者能够有效地组织和管理ROS软件包,进行机器人软件的...
ROS-Kinetic下的Kinect驱动通常包括iai_kinect2包,这是一个用于ROS的完整Kinect V2栈,提供了从设备读取和发布图像、深度数据和IMU数据的功能。 iai_kinect2是ROS社区开发的一个包,它不仅包含了驱动,还有一系列...
### 飞思卡尔kinetic系列单片机模块介绍 #### 一、16位A/D转换模块 ##### 1. A/D转换基础知识 - **采样精度**:指的是数字量变化一个最小量时模拟信号的变化量,即采样位数。在16位A/D转换模块中,采样精度为16位...
为了开始仿真,你需要首先解压`universal_robot-kinetic-devel.zip`文件,这将包含上述所有必要的ROS包。然后,根据你的工作空间设置,将这些包源码导入到ROS环境中,并执行编译步骤。这通常涉及`catkin_make`或`...
在ROS的navigation-kinetic-devel中,使用现成的RAstar接口,编写遗传算法路径规划程序。能完成小车自主寻路,效率略低于Astar算法。
总结,Kinetic.js为HTML5 Canvas开发提供了强大的工具,通过理解其核心概念、参数和实例,开发者可以轻松创建出丰富的动态Web图形应用。无论是简单的示例还是复杂的项目,Kinetic.js都能提供灵活且高效的解决方案。
本文介绍在MIT的racecar模型基础上搭建slam,仿真实现2019年室外光电创意组比赛。 报错controllers相关 sudo apt-get install ros-kinetic-controller-manager sudo apt-get install ros-kinetic-gazebo-ros-control...
"visualization_tutorials-kinetic-devel"是ROS Kinetic版本中的一个视觉化教程项目,旨在帮助开发者学习如何在ROS环境中进行数据可视化。在这个压缩包中,包含了用于教学目的的源代码。 首先,我们要理解ROS的可视...