`
zha_zi
  • 浏览: 590190 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

html5 俄罗斯方块 ----kinetic 应用开发介绍实现算法 2

 
阅读更多

    我在开发俄罗斯方块的时候大致把整个游戏分拆成了三个大的组件

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;
			} 
		}
	};
}
  • 大小: 2.8 KB
  • 大小: 3.1 KB
  • 大小: 3.2 KB
  • 大小: 3.1 KB
  • 大小: 2.8 KB
分享到:
评论

相关推荐

    html5 俄罗斯方块 ----kinetic 应用开发介绍 1

    **HTML5俄罗斯方块——基于KineticJS的应用开发** HTML5是现代网页开发的重要标准,它引入了许多新的特性和API,使得开发者可以构建更丰富、更动态的网页应用。在这个项目中,我们将深入探讨如何使用HTML5和...

    navigation-kinetic-devel.rar_kinetic_ros导航_ros算法_路径规划ros

    在“navigation-kinetic-devel.rar”这个压缩包中,我们聚焦于ROS Kinetic版本的导航功能,这涉及到一系列的ROS节点、环境配置以及路径规划算法。 ROS Kinetic是ROS的一个重要分支,它基于Ubuntu 16.04 LTS(Xenial...

    android_apps-kinetic_andorid_slam_

    《Android SLAM技术在清洁机器人应用中的实现》 在当今的智能硬件领域,自主导航与定位已经成为机器人技术的重要组成部分,特别是在家庭服务机器人的应用中。SLAM(Simultaneous Localization And Mapping,即同时...

    navigation-kinetic-devel.zip

    《Ubuntu16.04导航包:navigation-kinetic-devel.zip详析》 在Linux操作系统,尤其是Ubuntu 16.04这样的长期支持版本中,开发者和机器人技术爱好者经常需要处理各种软件包,以实现特定的功能。navigation-kinetic-...

    ddynamic_reconfigure-kinetic-devel.zip

    在ROS Kinetic版本中,它被称为ddynamic_reconfigure,这个压缩包"ddynamic_reconfigure-kinetic-devel.zip"显然是为ROS Kinetic开发环境准备的源代码或者开发库。 ROS是一个开源操作系统,专门用于设计和实现...

    ROS-Robot-Programming-CN (ros kinetic版本学习资料 中文版)pdf

    它提供了一种分布式计算框架,能够支持机器人硬件的抽象化处理、设备驱动程序的开发、传感器数据的获取、常用机器人算法的实现,以及高级应用的编写。 - **特点**: - 分布式架构:ROS 基于节点的概念构建,每个节点...

    opencv3_kinetic_3.3.1-5.tar.gz

    2. **进入目录**:进入解压后的目录,例如`cd opencv3-release-release-kinetic-opencv3`。 3. **配置**:使用`cmake`进行配置,指定安装路径和其他选项,如`cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_...

    ros-kinetic-libg2o_2016.4.24.orig.tar.gz

    在本案例中,我们关注的是 "ros-kinetic-libg2o",这是一个针对ROS Kinetic Kame版本的库,名为libg2o。 libg2o,全称Generic Graph Optimization,是一个C++库,专门用于处理优化问题,特别是在机器人领域,如SLAM...

    ros-kinetic-serial_1.2.1-0xenial-20191214-001149+0000_amd64.deb

    ros-kinetic-serial_1.2.1-0xenial-20191214-001149+0000_amd64.deb

    catkin-kinetic-devel.zip

    总结一下,"catkin-kinetic-devel.zip"是ROS Kinetic版本下的一个catkin工作空间开发版本,包含了构建和运行ROS项目所需的环境和配置。使用这个工作空间,开发者能够有效地组织和管理ROS软件包,进行机器人软件的...

    kinect v2驅動,ROS-kinetic下的kinect驅動,以及libfreenect2

    ROS-Kinetic下的Kinect驱动通常包括iai_kinect2包,这是一个用于ROS的完整Kinect V2栈,提供了从设备读取和发布图像、深度数据和IMU数据的功能。 iai_kinect2是ROS社区开发的一个包,它不仅包含了驱动,还有一系列...

    智能车-基于ROS-Kinetic平台搭建实物机器人两轮差速自动导航定位小车-优质项目实战.zip

    5. 实现SLAM算法,进行地图构建和车辆定位。 6. 调试和优化系统性能,测试智能车在不同环境下的表现。 通过这个项目,不仅可以掌握ROS的基本用法,还能深入了解两轮差速驱动的智能车控制系统,以及自动导航和定位的...

    universal-robot-kinetic-devel.zip

    为了开始仿真,你需要首先解压`universal_robot-kinetic-devel.zip`文件,这将包含上述所有必要的ROS包。然后,根据你的工作空间设置,将这些包源码导入到ROS环境中,并执行编译步骤。这通常涉及`catkin_make`或`...

    遗传算法路径规划的ROS实现

    在ROS的navigation-kinetic-devel中,使用现成的RAstar接口,编写遗传算法路径规划程序。能完成小车自主寻路,效率略低于Astar算法。

    Kinetic 参数详解

    总结,Kinetic.js为HTML5 Canvas开发提供了强大的工具,通过理解其核心概念、参数和实例,开发者可以轻松创建出丰富的动态Web图形应用。无论是简单的示例还是复杂的项目,Kinetic.js都能提供灵活且高效的解决方案。

    基于racecar模型的智能车仿真系统

    本文介绍在MIT的racecar模型基础上搭建slam,仿真实现2019年室外光电创意组比赛。 报错controllers相关 sudo apt-get install ros-kinetic-controller-manager sudo apt-get install ros-kinetic-gazebo-ros-control...

Global site tag (gtag.js) - Google Analytics