PlayLayer.h
PlayLayer.cpp
Player.h
Player.cpp
Fire.h
Fire.cpp
Enemy.h
Enemy.cpp
PlayLayer.h
#include <stdio.h>
#include "cocos2d.h"
#include "Player.h"
#include "Enemy.h"
#include "Fire.h"
using namespace cocos2d;
class PlayLayer:public Layer{
public:
static cocos2d::Scene* scene();
virtual bool init();
CREATE_FUNC(PlayLayer);
Player* player;//玩家对象
virtual bool onTouchBegan(Touch *touch, Event *unused_event);
virtual void onTouchMoved(Touch *touch, Event *unused_event);
virtual void onTouchEnded(Touch *touch, Event *unused_event);
virtual void onTouchCancelled(Touch *touch, Event *unused_event);
virtual void update(float t);//时间调度
cocos2d::Point magicPoint;//玩家位置
Label* scoreLabel;//分数文字
Label* scoreNumberLabel;//分数数字Label
__Array* enemyArray;
__Array* fireArray;
void stopMove();//令isMove为false
void myUpdate(float t);//创建敌人的时间调度器
void enemyUpdate(float t);//出现敌人调用的随机时间调度器
void knockUpdate(float t);//碰撞检测的时间调度器
};
PlayLayer.cpp
#include "PlayLayer.h"
#include "Data.h"
Scene* PlayLayer::scene(){
auto scene = Scene::create();
auto layer = PlayLayer::create();
scene->addChild(layer);
return scene;
}
bool PlayLayer::init(){
if(!Layer::init()){
return false;
}
enemyArray = __Array::create();
enemyArray->retain();
fireArray = __Array::create();
fireArray->retain();
//触摸监听
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(PlayLayer::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(PlayLayer::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(PlayLayer::onTouchEnded, this);
listener->onTouchCancelled = CC_CALLBACK_2(PlayLayer::onTouchCancelled, this);
listener->setSwallowTouches(true);
dispatcher->addEventListenerWithSceneGraphPriority(listener, this);
//玩家
player = new Player();
player->setPosition(Vec2(50,40));
player->ignoreAnchorPointForPosition(false);
player->setAnchorPoint(Point(0.5,0.5));
this->addChild(player,2);
player->PlayerMove();
playerScore = 0;
//循环背景
auto bg1 = Sprite::create("background.png");
bg1->setTag(100);
bg1->setAnchorPoint(Point(0,0.5));
bg1->setPosition(Vec2(0,100));
this->addChild(bg1,1);
auto bg2 = Sprite::create("background.png");
bg2->setTag(101);
bg2->setAnchorPoint(Point(0,0.5));
bg2->setPosition(Vec2(300,100));
this->addChild(bg2,1);
//分数
scoreLabel = Label::createWithTTF("fonts/pixel3.ttf", "SCORE");
scoreLabel->setPosition(Vec2(30,150));
this->addChild(scoreLabel,3);
char number[20] ;
sprintf(number, "%d",playerScore);
scoreNumberLabel = Label::createWithTTF("fonts/pixel3.ttf", number);
scoreNumberLabel->setPosition(Vec2(75,150));
this->addChild(scoreNumberLabel,3);
//时间调度器
scheduleUpdate();
//创建敌人的时间调度器
this->schedule(CC_CALLBACK_1(PlayLayer::enemyUpdate, this),1.0,"enemyUpdate");
//碰撞检测的时间调度器
this->schedule(CC_CALLBACK_1(PlayLayer::knockUpdate, this),"knockUpdate");
return true;
}
void PlayLayer::update(float t){
//创建循环背景
auto bg1 = this->getChildByTag(100);
bg1->setPosition(Vec2(bg1->getPosition().x-5,bg1->getPosition().y));
auto bg2 = this->getChildByTag(101);
bg2->setPosition(Vec2(bg2->getPosition().x-5,bg2->getPosition().y));
if (bg1->getPosition().x <= -bg1->getContentSize().width) {
bg1->setPosition(300, 100);
}
if (bg2->getPosition().x <= -bg2->getContentSize().width) {
bg2->setPosition(300, 100);
}
if ( enemyArray->count() > 0 ) {
for (int i = 0; i < enemyArray->count(); i++) {
Enemy* enemy = (Enemy *)enemyArray->getObjectAtIndex(i);
if (enemy->getPosition().x < -10) {
enemyArray->removeObject(enemy);
this->removeChild(enemy);
}
enemy->setPosition(Vec2(enemy->getPosition().x-5,enemy->getPosition().y));
}
}
for (int i = 0 ; i<fireArray->count(); i++) {
Fire* fire = (Fire*)fireArray->getObjectAtIndex(i);
if (fire->getPosition().x < 10) {
fireArray->removeObject(fire);
this->removeChild(fire);
}
}
playerScore++;
char number[20] ;
sprintf(number, "%d",playerScore);
scoreNumberLabel->setString(number);
}
void PlayLayer::enemyUpdate(float t){
float time = rand()%3 ;
this->scheduleOnce(CC_CALLBACK_1(PlayLayer::myUpdate, this),time,"myUpdate");//创建敌人的时间调度器
}
void PlayLayer::myUpdate(float t){//创建敌人的时间调度器
Enemy* enemy = new Enemy();
for (int i = 0;i<enemyArray->count(); i++) {
Enemy* enemy1 = (Enemy *)enemyArray->getObjectAtIndex(i);
if (enemy->getPosition().x<enemy1->getPosition().x+64 &&
enemy->getPosition().x>enemy1->getPosition().x-64) {
//如果两个障碍物太近(在其周围64像素点内)则不创建
return;
}
}
int enemyY = rand()%3*40 +30;
enemy->setPosition(Vec2(270,enemyY));
this->addChild(enemy,1);
enemyArray->addObject(enemy);
}
void PlayLayer::knockUpdate(float t){
for (int i = 0; i <enemyArray->count(); i++) {
Enemy* enemy = (Enemy*)enemyArray->getObjectAtIndex(i);//获得障碍物
if(player->boundingBox().intersectsRect(enemy->boundingBox()) &&
player->getPosition().y == enemy->getPosition().y + 10){//如果人和物在一行且发生碰撞
playerScore = 0;//分数归零
//删除障碍物
enemyArray->removeObject(enemy);
this->removeChild(enemy);
}
}
for (int j = 0; j<enemyArray->count(); j++) {
Enemy* enemy = (Enemy*)enemyArray->getObjectAtIndex(j);//获得障碍物
for (int k = 0; k<fireArray->count(); k++) {
Fire* fire = (Fire*)fireArray->getObjectAtIndex(k);
if(fire->boundingBox().intersectsRect(enemy->boundingBox()) &&
fire->getPosition().y == enemy->getPosition().y + 10){
player->isMove = false;
enemyArray->removeObject(enemy);
this->removeChild(enemy);
fireArray->removeObject(fire);
this->removeChild(fire);
}
}
}
}
bool PlayLayer::onTouchBegan(Touch *touch, Event *unused_event){
/*
//点击移动相关
player->stopAllActions();
auto distance = sqrt(pow(player->getPosition().x-touch->getLocation().x, 2)+pow(player->getPosition().y-touch->getLocation().y, 2));
auto time = distance/100;
auto move = MoveTo::create(time, touch->getLocation());
player->runAction(move);
player->PlayerMove();
player->isMove = true;
*/
return true;
}
void PlayLayer::onTouchMoved(Touch *touch, Event *unused_event){
/*
//随点击点移动
player->stopAllActions();
player->PlayerMove();
auto distance = sqrt(pow(player->getPosition().x-touch->getLocation().x, 2)+pow(player->getPosition().y-touch->getLocation().y, 2));
auto time = distance/100;
auto move = MoveTo::create(time, touch->getLocation());
player->runAction(move);
if(player->getPosition() == touch->getLocation()){
player->stopAllActions();
}
*/
if(player->isMove == true)//如果人物移动中则返回
return;
player->isGo = true;
if(touch->getStartLocation().y < touch->getLocation().y){//如果向上滑动
if(player->getPosition().y >= 120){//如果人物在顶端则返回
return;
}else{
player->isMove = true;
auto move = MoveTo::create(0.5f, Vec2(50,player->getPosition().y+40));//向上移动100
auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove, this));
auto seq = Sequence::create(move,call, NULL);
player->runAction(seq);
}
}
if(touch->getStartLocation().y > touch->getLocation().y){//如果向下滑动
if(player->getPosition().y <= 40){//如果人物在底端则返回
return;
}else{
player->isMove = true;
auto move = MoveTo::create(0.5f, Vec2(50,player->getPosition().y-40));//向上移动100
auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove, this));
auto seq = Sequence::create(move,call, NULL);
player->runAction(seq);
}
}
}
void PlayLayer::onTouchEnded(Touch *touch, Event *unused_event){
if(player->isGo == true){//如果是Move则令其状态变回false,然后返回
player->isGo = false;
return;
}
while (touch->getLocation().x < 100) {//点击屏幕左侧 人物跳跃
if (player->isMove == true) {
return;
}
player->isMove = true;
auto jump = JumpTo::create(0.5, player->getPosition(), 32, 1);
auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove,this));
auto seq = Sequence::create(jump,call, NULL);
player->runAction(seq);
}
while (touch->getLocation().x > 140) {//点击屏幕右侧 放出火焰
if (player->isMove == true) {
return;
}
player->isMove = true;
auto fire = new Fire();
int y =player->getPosition().y;
fire->setPosition(Vec2(60,y));
this->addChild(fire,2);
auto fireMove = MoveTo::create(2, Vec2(260,y));
auto fireRotate = RotateTo::create(2, 360*8);
auto spawn = Spawn::create(fireMove,fireRotate, NULL);
auto call = CallFunc::create(CC_CALLBACK_0(PlayLayer::stopMove,this));
auto seq = Sequence::create(DelayTime::create(0.5),call, NULL);
fire->runAction(spawn);
fire->runAction(seq);
fireArray->addObject(fire);
log("fire");
}
}
void PlayLayer::onTouchCancelled(Touch *touch, Event *unused_event){
}
void PlayLayer::stopMove(){
player->isMove = false;
}
Player.h
#include <stdio.h>
#include "cocos2d.h"
using namespace cocos2d;
class Player:public Sprite{
public:
Player();
~ Player();
void PlayerMove();
bool isMove;
bool isGo;
};
Player.cpp
#include "Player.h"
Player::Player(){
Sprite::initWithFile("magic02.png");
isMove = false;
isGo = false;
}
Player::~ Player(){
}
void Player::PlayerMove(){
auto cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("magicAll.plist", "magicAll.png");
Vector<SpriteFrame*>vec;
char name[20];
for(int i=1;i<=4;i++){
sprintf(name, "magic0%d.png",i);
auto frame = cache->getSpriteFrameByName(name);
vec.pushBack(frame);
}
auto animation = Animation::createWithSpriteFrames(vec,0.1f);
auto animate = Animate::create(animation);
auto seq = Sequence::create(animate, NULL);
auto repeat = RepeatForever::create(seq);
this->runAction(repeat);
}
Fire.h
#include <stdio.h>
#include "cocos2d.h"
using namespace cocos2d;
class Fire:public Sprite{
public:
Fire();
~ Fire();
};
Fire.cpp
#include "Fire.h"
Fire::Fire(){
Sprite::initWithFile("fire.png");
}
Fire::~ Fire(){
}
Enemy.h
#include <stdio.h>
#include "cocos2d.h"
using namespace cocos2d;
class Enemy:public Sprite{
public:
Enemy();
~ Enemy();
};
Enemy.cpp
#include "Enemy.h"
Enemy::Enemy(){
Sprite::initWithFile("glasses.png");
}
Enemy::~ Enemy(){
}