作业要求
- 控制板子左右移动
- 在顶部生成小砖块
- 使用关节固定球与板子
- 为板子、球、以及砖块设置物理属性
- 砖、球碰撞则消去砖头,球与地板碰撞则游戏结束
- 至少使用一种粒子效果(加在球上面,etc)
游戏演示
具体实现
HitBrick.h
#ifndef __HIT_BRICK_H__
#define __HIT_BRICK_H__
#include "cocos2d.h"
using namespace std;
USING_NS_CC;
class HitBrick : public Layer {
public:
static PhysicsWorld* world;
static cocos2d::Scene* createScene();
void setPhysicsWorld(PhysicsWorld * world);
virtual bool init();
void setJoint();
void addSprite();
void addPlayer();
void addListener();
void update(float dt);
void updateShip(float dt);
void BrickGeneraetd();
void onKeyPressed(EventKeyboard::KeyCode code, Event * event);
void onKeyReleased(EventKeyboard::KeyCode code, Event * event);
bool onConcactBegin(PhysicsContact & contact);
void preloadMusic();
void GameOver();
void loadAnimation(string filepath);
void replayCallback(Ref * pSender);
void exitCallback(Ref * pSender);
CREATE_FUNC(HitBrick);
private:
PhysicsWorld* m_world;
Size visibleSize;
Sprite* player;
Sprite* ship;
bool onBall;
Sprite* ball;
PhysicsJointPin * joint1;
int spHolded;
int spFactor;
enum Tag {SHIP, BALL, BOX, BOARD};
};
#endif // __HIT_BRICK_H__
HitBrick.cpp
#pragma execution_character_set("utf-8")
#include "HitBrick.h"
#include "cocos2d.h"
#include "SimpleAudioEngine.h"
#define database UserDefault::getInstance()
USING_NS_CC;
using namespace CocosDenshion;
void HitBrick::setPhysicsWorld(PhysicsWorld* world) { m_world = world; }
Scene* HitBrick::createScene() {
srand((unsigned)time(NULL));
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setAutoStep(true);
scene->getPhysicsWorld()->setGravity(Vec2(0, -300.0f));
auto layer = HitBrick::create();
layer->setPhysicsWorld(scene->getPhysicsWorld());
layer->setJoint();
scene->addChild(layer);
return scene;
}
bool HitBrick::init() {
if (!Layer::init()) {
return false;
}
visibleSize = Director::getInstance()->getVisibleSize();
auto edgeSp = Sprite::create();
auto boundBody = PhysicsBody::createEdgeBox(visibleSize, PhysicsMaterial(0.0f, 1.0f, 0.0f), 3);
edgeSp->setPosition(visibleSize.width / 2, visibleSize.height / 2);
edgeSp->setPhysicsBody(boundBody);
addChild(edgeSp);
preloadMusic();
addSprite();
addListener();
addPlayer();
BrickGeneraetd();
schedule(schedule_selector(HitBrick::update), 0.01f, kRepeatForever, 0.1f);
onBall = true;
spHolded =