Cocos2dx3.2 Crazy Tetris 绘制不规则方块 遮罩(ClippingNode的使用)

前面已经思考了可能遇到的消除和面积判定问题,那么接下来的问题就是如何显示这些由于消除可能引出的不规则图形。

在这里,我使用了ClippingNode(遮罩)。关于ClippingNode网上的介绍都非常仔细,因此我在这里只是简单的说一下:

正如他的名字一样,他本身也是一个节点,因此可以参考我的最开始的一篇关于节点树的博文,使用他时,需要将其添加到另外一个节点中。

使用时需要注意的是要向其中添加模板(stencil)和底板。Stencil的意思就是类似模具一样的东西,可以想象,如果我们将模具的形状定义好,然后印在有一大片图案的底板上,那么就只会显示底板上模具形状的这一部分,或者是除了模具形状的其余部分。

添加模板的方法:

static ClippingNode* create(Node *stencil);

直接带模板的构造方法;

void setStencil(Node *stencil);

添加模板

添加底板直接使用AddChild方法即可。

简单的就说这么多,其余的功能可以参考网上的资料。

在这里,由于我们可以知道要显示图形的顶点信息,因此可以方便的由此构造出模板,进行不规则图形的显示。这一段代码当然应该放在BaseBlock方块类的初始化函数中,使其每次初始化时自动完成遮罩。

代码如下:

void BaseBlock::initForm(std::vector<cocos2d::Vec2 *> * shapeVecs, std::vector<int> * shapeVecAmount, int shapeAmount, Color4B color)
{
	Vec2 origin = Director::getInstance()->getVisibleOrigin();
	this->shapeAmount = shapeAmount;
	this->shapeVecAmount = shapeVecAmount;
	this->shapeVecs = shapeVecs;

	auto stencil = DrawNode::create();

	auto body = PhysicsBody::create();
	for(int i=0; i<shapeAmount; i++)
	{
		auto shape = PhysicsShapePolygon::create(shapeVecs->at(i), shapeVecAmount->at(i));
		shape->setRestitution(0.5);
		body->addShape(shape);
		stencil->drawPolygon(shapeVecs->at(i), shapeVecAmount->at(i), Color4F(1, 1, 0, 1), 0, Color4F(1, 1, 0, 1));
	}

	auto clipper = ClippingNode::create();
	clipper->setZOrder(0);
	clipper->setStencil(stencil);
	stencil->setPosition(stencil->getPositionX() + this->getContentSize().width/2, stencil->getPositionY() + this->getContentSize().height/2);
	this->color = color;
	auto back = LayerColor::create(this->color, this->getTextureRect().getMaxX(), this->getTextureRect().getMaxY());
	clipper->addChild(back);
	this->addChild(clipper);

	this->setPhysicsBody(body);
}

关于制作游戏相关其他博客的目录,我放在利用Cocos2dx3.2制作重力版俄罗斯方块(Crazy
Tetris)

时间: 2024-11-29 00:02:36

Cocos2dx3.2 Crazy Tetris 绘制不规则方块 遮罩(ClippingNode的使用)的相关文章

Cocos2dx3.2 Crazy Tetris 由于遮罩引起的部分手机白屏

上一章是说明使用ClipplingNode制作遮罩,以显示不规则图形.但是这样一直到Android端,却在部分手机中发生了问题. 具体问题表现为:白屏,只有边界(右上角)有矩形色块. 这里其实是框架对Android手机引用OennGL时,设置上没有启用stencil buff的问题. 解决方案,在onCreateView构造函数中添加: Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this); glSurface

Cocos2dx3.2 Crazy Tetris 游戏输入(键盘事件,重力事件,触摸屏事件)

游戏基本的逻辑功能之前已经完成,之后的问题就是如何去控制游戏中的方块.在电脑上,很显然就是使用键盘最为直接,而在手机上,考虑上要让操作方便,这里采用的是用重力感应控制左右移动,点击屏幕进行方块的旋转. 下面,就是加入这些事件的方法: 加入键盘事件,需要重写方法: virtual void onKeyPressed(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event); virtual void onKeyReleased(

Cocos2dx3.2 Crazy Tetris update 定时更新 游戏逻辑处理

现在,对于游戏的基本准备都已经做好,之后需要考虑的,就是游戏逻辑的处理,主要考虑一下几个方面: 1 判断方块是否已经落下停止,并下落新的方块: 2 方块落下后,判断是否符合消行条件,进行消行: 3 根据下落或者消行进行计分. 这些判断,需要定时处理,因此这里需要使用到默认更新的update. 在初始化中,需要调用: this->scheduleUpdate(); 如果需要停止更新,可以调用: this->unscheduleUpdate(); 这样,就可以在void update(float 

Cocos2d-x3.3利用TileMap绘制Polygon/PolyLine

tiled提供了多边形/折线的绘制, 在Cocos2dx3.3(不知道其他版本如何)中能够读取这些对象. 但是网上似乎没有Cocos2dx读取多边形/折线的相关教程. 今天尝试了PolyLine的绘制, 就在这里记录一下, 也希望能够帮到需要的人. 这里只介绍PolyLine的情况. Polygon情况是类似的. 在CCTMXXMLParse.cpp中,有方法 void TMXMapInfo::startElement(void *ctx, const char *name, const cha

WPF 如何绘制不规则按钮,并且有效点击范围也是不规则的

最近在做一个东西,如地图,点击地图上的某一区域,这一区域需要填充成其他颜色.区域是不规则的,而且点击该区域的任一点,都能够变色.普通的按钮只是简单的加载一幅图肯定是不行的.查了很多资料,终于把它搞定了.实现方法不是原创,也是参照了网上的实现. 具体的思想:就是根据图片文件来画这个按钮,画出的按钮,形状正好是该图片的样子. 这里的图片是有要求的,背景必须是透明的PNG图片,而且该图片必须是建立了路径的. 样式实现: <Style x:Key="ButtonStyle_Custom"

CSS3:优雅地绘制不规则ICON

早上在w3ctech上看到 中国第二届CSS Conf总结  的时候,,真是开心极了: 自从去年在慕课网上看了第一届CSS conf 视频之后,整个人都震惊了,原来还有大会是专门用来讨论CSS的,而且分享的CSS知识真是让我眼界大开: 我在博客园写的第一篇博文<布局神器Flexbox>便是受到第一届CSS conf的启发; 所以,算是结下了不解之缘:如今看到第二届分享的视频和PPT时,虽然才看到 <重拾 css 的乐趣(上)> 这一部分内容,但却很受启发 今天文章的主题是用css3

【Swing 4】方块绘制、删除与多按钮监听

其实这个问题酝酿好久了.不过一直找不到删除方块的正确姿势.这不,昨晚好不容易找到一个 通过双按钮注册同个接口来实现的方法.下午又折腾了好久,才算解决这个问题. 参考:http://blog.csdn.net/meditator_hkx/article/details/50734158 先来说说之前一直没有解决的问题.当我们通过下列代码产生一只小可爱时(我吐),表面上一切 正常.然而当我们移动它是 版本一 1 package demo; // 导入包名 2 3 import javax.swing

Cocos2dx3.2 CrazyTetris 单线裁剪 对于判断消除的思考(一)

由于不是规则的俄罗斯方块,在消除时,很可能产生不规则的图形,因此,如何判断是否达到消除条件,以及进行方块的裁剪将是本游戏的一个关键问题. 我在做这个游戏时,采用的是最直接的方法,也就是最笨的方法,直接进行裁剪判定.如果有比较好的算法,希望大家可以和我交流. 首先,接上一篇,由于我们创建的刚体模型,需要是凸多边形,因此,每个初始方块都由四个正方形小方块构成.如图: 而本游戏中,方块的旋转应该是任意的(而不是原版游戏中每次旋转都是90度).因此,当上面的方块停落时,很有可能是这样的方向: 因此,该方

是男人就下100层【第四层】——Crazy贪吃蛇(1)

贪吃蛇是一款很经典的游戏,这些经典游戏给我们的童年增加了不少乐趣,今天开始我们来一步一步的在Android设备上实现一款贪吃蛇游戏,我也是第一次写这个游戏,有可能会写错,或者走弯路,但是最终希望能有一个好的结果,接下来我们一起来一步步的摸着石头开发吧. 一.建立一个工程 二.自定义View(贪吃蛇界面) package com.example.crazysnake; import android.content.Context; import android.graphics.Canvas; i