cocos2dx 实现果冻,刀光等效果

本文介绍了如何在cocos2dx游戏中实现果冻和刀光特效。果冻效果借助box2d物理引擎,通过调整4个刚体节点的位置实现变形;刀光效果则根据移动轨迹动态计算网格并应用纹理。了解OpenGL基础知识对于实现这些高级效果至关重要。
摘要由CSDN通过智能技术生成

         随着cocos2dx的广泛应用,大量的游戏会有一些特效效果,比如割绳子中的绳子软体效果,切水果的刀光,扑鱼达人3的开场动画,闪电链效果等等,像这些高级效果,其实在cocos2dx的示例程序有些类似的影子,但是没有具体实现。比如说box2d的web效果,他就是实现果冻效果的一个原型,shader中的模糊,变色等等,目前市面上的一些高级效果可以在cocos2dx的sample中找到一些简单实现,但是还需要自己加工下。下面作为小白的我也要叙述下一些效果的实现原理,说错的地方,望各位不要喷啊~。大笑

      首先说一下果冻效果,果冻它是变形的,而且碰撞的时候,在碰撞点有挤压,所以呢,实现它还得用物理引擎,这里我用的是box2d。具体的做法实现可以参考l示例程序中的box2d web效果,这里就不多讲了。然后要让果冻随意变形,这个可以绘制一个4个顶点的网格然后附上对应的纹理,然后随着box2d的4个刚体改变顶点的位置,就可以看到变形效果啦。

b2CircleShape shape;
  shape.m_radius=4;

  b2BodyDef bd;
  bd.type = b2_dynamicBody;

  bd.position.Set(-6.0f, 6.0f);
  m_bodies[0] = m_world->CreateBody(&bd);
  m_bodies[0]->CreateFixture(&shape, 5.0f); m_bodies[0]->SetBullet(true);


  bd.position.Set(4.0f, 4.0f);
  m_bodies[1] = m_world->CreateBody(&bd);
  m_bodies[1]->CreateFixture(&shape, 5.0f); m_bodies[1]->SetBullet(true);


  bd.position.Set(6.0f, 14.0f);
  m_bodies[2] = m_world->CreateBody(&bd);
  m_bodies[2]->CreateFixture(&shape, 5.0f); m_bodies[2]->SetBullet(true);


  bd.position.Set(-4.0f, 16.0f);
  m_bodies[3] = m_world->CreateBody(&bd);
  m_bodies[3]->CreateFixture(&shape, 5.0f); m_bodies[3]->SetBullet(true);


b2Vec2 v1=m_bodies[0]->GetWorldCenter();
 b2Vec2 v2=m_bodies[1]->GetWorldCenter();
 b2Vec2 v3=m_bodies[2]->GetWorldCenter();
 b2Vec2 v4=m_bodies[3]->GetWorldCenter();
 
 adjust(v1,v3);  adjust(v2,v4);
 Vertex Vertices[] = {
  // Front
  { {480+v1.x*32,v1.y*32, 0}, {1, 1, 0, 1}, {1, 0}},
  { {480+v2.x*32,v2.y*32, 0}, {1, 1, 1,1}, {1, 1}},
  { {480+v3.x*32,v3.y*32, 0}, {1, 1, 1, 1}, {0, 1}},
  { {480+v4.x*32,v4.y*32, 0}, {0, 1, 1, 1}, {0, 0}}
 };

  刀光效果一般根据移动的轨迹动态计算出网格,然后给纹理,或者上色什么的。

  看过shader示例的 应该都感觉很炫吧,没错,这个东东确实可以实现很多高级效果,如果你算法底子好,那么可以搞出一些 绚丽的 画面。


以上种种都需要有opengl基础额,所以呢,想实现高级效果的朋友不妨发点时间看看opengl 的知识,而且对将来实现3d场景也有很多益处。

好了,先讲到这里了。 下面贴出果冻的全部实现代码:

//HelloWorld.h

class HelloWorld : public cocos2d::Layer
{
public:
      virtual bool init(); 
      void onEnter();
      void update(float dt);
      void onDraw();
      CustomCommand _customCommand;
      CREATE_FUNC(HelloWorld);
      Vec2 m_mouseWorld;
      b2MouseJoint* m_mouseJoint;
      b2Body* m_groundBody;
      GLESDebugDraw *m_debugDraw;
      b2World* m_world;
      CCTexture2D* texture2d;
      GLuint vertexBuffer;
      GLuint indexBuffer;
      GLProgram * pg;
      b2Body* m_bodies[8];
      void adjust(b2Vec2 &v1,b2Vec2 &v2);
      bool onTouchBegan(Touch* touch, Event* event);
      void onTouchMoved(Touch* touch, Event* event);
      void onTouchEnded(Touch* touch, Event* event);
};


//HelloWorld.cpp
#include "HelloWorldScene.h"

class QueryCallback : public b2QueryCallback
{
public:
 QueryCallback(const b2Vec2& point)
 {
  m_point = point;
  m_fixture = nullptr;
 }
 bool ReportFixture(b2Fixture* fixture)
 {
  b2Body* body = fixture->GetBody();
  if (body->GetType() == b2_dynamicBody)
  {
   bool inside = fixture->TestPoint(m_point);
   if (inside)
   {
    m_fixture = fixture;
    // We are done, terminate the query.
    return false;
   }
  }
  // Continue the query.
  return true;
 }
 b2Vec2 m_point;
 b2Fixture* m_fixture;
};
Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene =
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值