试用Box2D制作打砖块

1. 目标

制作一个打砖块类型的游戏Demo

2. 使用技术

Cocos2dx 3.0  基于Box2D的Physics模块

3. 具体步骤

    3.1 建立Lesson1.h及Lesson1.cpp

     Lesson.h 内容如下:

#ifndef __LESSON1_H__
#define __LESSON1_H__

#include "cocos2d.h"
#include "VisibleRect.h"

using namespace cocos2d;
class Lesson1 : public cocos2d::Layer
{
public:
	void initPhysics();
        static cocos2d::Scene* createScene();
	CREATE_FUNC(Lesson1);
        bool init() override;
	void setPhyWorld(PhysicsWorld* world){this->world = world;} 
	// Touch process
	 bool onTouchBegan(Touch* touch, Event* pEvent);
	 void onTouchMoved(Touch* touch, Event* pEvent);
	 void onTouchEnded(Touch* touch, Event* pEvent);
	 // Collide callback
	 bool onContactBegin(PhysicsContact& contact);
	 void update(float dt);

	 void applyImpulse();

	 void applyImpulse_withbrick(Point p);

private:
	PhysicsWorld* world;
	int m_state;
};

#endif // __LESSON1_H__

Lesson1 就是一个普通的Layer,其中有一个方法用来产生一个场景,这是cocos2dx常见的编程方法。 onTouchXXX 系列方法是cocos2dx 3.0触摸回调方法。它的用法在Lesson1.cpp中可以看到。 onContactBegin是注册的一个检测碰撞信息的回调方法,通过它可以了解到具体的碰撞体信息。 update方法是我使用scheduleUpdate定制的

刷新方法,这里可以做一些每帧都需要处理的事情。 appleImpulse 和applyImpulse_withbrick是定制的帮助方法,其实更合适放在private里面,但是我们仅仅写个Demo,

所以不必过分注意系统的架构,比如面向对象或者MVC的方法。如果我们要做一个商业化的正规游戏,那么这些都是要考虑的。


介绍完头文件,接下来就进入实现文件的编写。

 3.2 首先是产生场景方法的编写:

Scene* Lesson1::createScene()
{
      auto scene = Scene::createWithPhysics();
      auto layer =  Lesson1::create();
      layer->setPhyWorld(scene->getPhysicsWorld());
      scene->addChild(layer);
      scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
      return scene;
}

可以看出,这里和普通的游戏产生场景的方法并不相同。我们无须面对Box2D的细节就完成了物理世界的构建。
 scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
这里我们仅仅通过一句代码就完成了Debug模式的构建,所谓DebugDraw,指的是Box2D本身并不支持绘图,这里使用的OpenGL ES来绘制出图形的线框模型,可以帮助我们

可视化的看到物体的外观。我们这个Demo的外观就是利用了这点,没有使用贴图。


3.3 接下来是层的初始化方法

bool Lesson1::init() 
{
       if ( !Layer::init() )
       {
           return false;
        }
	m_state = STATE_INIT;
	auto dispatcher = Director::getInstance()->getEventDispatcher();
	auto touchListener = EventListenerTouchOneByOne::create();
	touchListener->onTouchBegan = CC_CALLBACK_2(Less
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值