Cocos2DX笔记----------使用opengl实现水果忍者刀刃轨迹

最近有个小需求,需要实现水果忍者刀刃的效果,网上找了很多实例代码,查了很多资料,终于捣鼓了出来。

效果图如下:

图1:

图2:

该算法还是比较简单的,先说说流程:

【收集轨迹点】主要是使用了cocos2dX中的ccTouchesBegan和ccTouchesMoved

ccTouchesBegan里面包含了刷新最近轨迹点的功能

ccTouchesMoved里面包含了添加轨迹点的功能

此时需要一个数组用于记录轨迹的ccpoint,我将它命名为mPointArray,用于存储这些轨迹点。每次手指按下时,就添加此时触摸点的位置作为下次计算渲染的开始,那么就要将它设置到

mPointArray的最后一位。然后通过ccTouchesMoved获取到相关的点,以此往前添加到mPointArray中。一般来说16个点就足够了。

【计算轨迹点】这个是算法的核心部分(对照了相关的demo的代码,发现类似做法,即构建多边形),其实轨迹是遵循了这样的形状:

其中三角形ABC(F)并不是必须的,因为它是用于轨迹的头部,作为一种修饰效果。重点还是A,C,D,E,F,G构成的四边形,根据opengl顶点渲染规则,我们需要4个三角形,即12个顶点,因此可以将这些顶点分割,注意,这个多边形是对称的,因此算法不会太复杂。

这些顶点可以被分割成中间顶点数组,顶部顶点数组以及底部顶点数组,核心的算法如下

CCPoint* p=mPointArray;

//中间顶点数组
CCPoint* centerVertex=new CCPoint[mIndex];
memcpy(centerVertex,p,sizeof(CCPoint)*mIndex);

//顶部顶点数组

CCPoint pt1=ccpSub(p[i],p[i-1]);
float angle1=ccpToAngle(pt1);
topVertex[count1].x =sinf(angle1) * w + p[i].x;
topVertex[count1].y =cosf(angle1) * w + p[i].y;

//底部顶点数组

CCPoint pt2=ccpSub(p[i],p[i-1]);

float angle2=ccpToAngle(pt2);

bottomVertex[count2].x =sinf(angle2) * w + p[i].x;
bottomVertex[count2].y =cosf(angle2) * -w + p[i].y;

然后在算法的尾部,需要对这些顶点进行排列(用于渲染三角形)和颜色填充。

另外需要知道的是opengl的渲染顶点的顺序是逆时针,顺时针顺序是剔除。

渲染就很简单了,都是固定的语法,所以就和源代码一起放上吧。

http://pan.baidu.com/s/1mg1F9lY

密码ozk7

Cocos2DX笔记----------使用opengl实现水果忍者刀刃轨迹,布布扣,bubuko.com

时间: 2024-10-10 13:20:36

Cocos2DX笔记----------使用opengl实现水果忍者刀刃轨迹的相关文章

Cocos2d-x 水果忍者划痕效果

网上找的一个关于水果忍者划痕的,效果还算凑合.其原理就是基于OpenGL绘制直线,因为版本号过老,此处笔者改动了一些方法,粘贴后可直接使用 适用于Cocos2d-x 2.2.1 .h文件里须要添?的代码: void draw(); void drawLine(); virtual void ccTouchesBegan(CCSet *pTouches,CCEvent *pEvent); virtual void ccTouchesMoved(CCSet *pTouches,CCEvent *pE

cocos2d-x笔记4: TextField不能删除内容,以及我的解决办法。。。

3.0正式版,win32下,TextField按下backspace键不能删除内容.网上搜了下,很早就有的问题了,正式版了竟然还不解决...真心无力吐槽啊!!!这种巨大而又明显的Bug... 从昨天突发奇想用Cocos2d做软件开始,经历了太多的摧残,简直听者伤心,闻者落泪... 已经去Cocoachina论坛反馈了,虽然基本白费口舌...思路就是监听按键事件,调用setText修改内容... 1 auto listener = EventListenerKeyboard::create();

cocos2d-x笔记3 : 3.0正式版调用CocoStudio

cocos2d已经有一万个新建工程的方式和一万个API改动了,而且相互不兼容...触控科技的程序员真心不怕被打哦... 网上搜到的做法大多已经不行了,原因在上一段哦... 同样都是3.0,Alpha版.Bata版.Rc版.正式版,它们调用CocoStudio的方法都不一样哦...(求超越哦...) 记录一下3.0正式版使用CocoStudio的方法,是正式版,也就是最新版哦.(当然,只相对本周而言哦...) 一.添加库: 1.右击解决方案 -> 添加 -> 现有项目 2.进入项目目录的coco

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco

作品展示,JavaScript 版水果忍者

点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 Raphael,效果很赞,赶紧来膜拜一下. https://github.com/ChineseDron/fruit-ninja 在线演示      源码下载

[cocos2dx笔记004] android增加静态库工程

(基于2.2.2版本) 这步比较麻烦,不像vs2013那样好设置.参考了很多文章.还是不能解决问题.只有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的mylib这个例子.[cocos2dx笔记003] Vs2013增加静态库工程首先进到external\mylib,用文本编辑器打Android.mk 并修改图中圈中的部分 修改结果如下 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :

水果忍者

转帖:https://github.com/ChineseDron/fruit-ninja 绘图上,仍然是采用了 vml+svg,这是我一直比较推荐的组合,不过不要一听 vml.svg 等就头大,市面上针对 vml.svg 封装的库还是瞒多的,我用得比较顺手的就 Raphael 了,她的 API 非常简单,支持链式调用,浏览器的兼容性一直很让人满意.在开发水果忍者时,我手贱升级了一把 Raphael 2.1.0,发现性能比较低,又一直找不到原因,无奈又得降回了 1.5,值得注意的是,2.1.0

java游戏制作之水果忍者

水果忍者的原理很简单,主要就是采用随机的方式是画面上面出现水果. package Fruitninja; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class

水果忍者激战版的开发心得

先放下载地址:http://dl.uu.cc/p2p/(在android 手机浏览器上输入后点击下载就OK) 去年8月份一開始接到任务,是要做一个手机间实时通信的桥梁,大家都知道国外的视频通话早已成熟,国内这坑爹的网速实在是坑爹(这高昂的费用既使能用也不敢用),在网速坑爹的时候想搞实时通信.在国内还是首义. 也不是没有类似的应用,比方微信对讲,YY语音等,但都是异步的,实时谈不上,在网络稍不好的情况下,延时是非常大的. 当然,实时通信也是有延时的,那延时大到多少就不算实时呢,我们觉得,仅仅要用户