#include "GameScene.h"
#include "GameOverScene.h"
USING_NS_CC;
using namespace CocosDenshion;
Scene* GameScene::createScene()
{
// //创建物理世界的场景
auto scene = Scene::createWithPhysics();
//PhysicsWorld* phyWorld = scene->getPhysicsWorld();
//phyWorld->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
// 'layer' is an autorelease object
auto layer = GameScene::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
bool GameScene::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
score = 0; //初始化分数
status = 1 ; //初始化游戏状态
//添加分数
//auto label = Label::createWithTTF("","fonts/MarkerFelt.ttf", 24);
auto label = cocos2d::Label::createWithSystemFont("分数:0","Arial",24);
label ->setTag(100);
label->setPosition(Vec2(0, origin.y + visibleSize.height - label->getContentSize().height/2));
label->setHorizontalAlignment(kCCTextAlignmentRight);
label->setAnchorPoint(Vec2(0,0.5));
this->addChild(label, 1);
//播放背景音乐
SimpleAudioEngine::getInstance()->playBackgroundMusic("sounds/game_music.wav");
//创建滚动背景
//背景精灵
auto bg1 = Sprite::create("background.png");
bg1->setPosition(Vec2(origin.x + visibleSize.width/2,0));
bg1->setAnchorPoint(Vec2(0.5,0));
bg1->setTag(101);
this->addChild(bg1,0);
//第二张背景图,是跟在第一张的上面,无缝连接,两张图形成不间断的地图滚动
auto bg2 = Sprite::create("background.png");
bg2->setPosition(Vec2(origin.x + visibleSize.width/2, bg1->getPositionY()+bg1->getContentSize().height));
bg2->setAnchorPoint(Vec2(0.5,0));
bg2->setTag(102);
this->addChild(bg2,0);
//背景滚动的定时器,0.01执行一次传入的函数
this->schedule(schedule_selector(GameScene::backgroundMove),0.01);
//创建我机
auto plane = Sprite::create("hero1.png");
plane->setPosition(visibleSize.width/2+origin.x,200);
plane->setTag(103);
//设置碰撞属性
//碰撞掩码,用于判断是否可以与其他物体碰撞,判断逻辑为两者的碰撞掩码进行逻辑与,如为零则不会碰撞,否则会
//这里只有我机、敌机、子弹,子弹和敌机可以碰撞,敌机和我机可以碰撞,我机和子弹不可以碰撞,以次可以设置它们的掩码分别为0x01(0001)、0x03(0011)、0x02(0010)
auto planeBody = PhysicsBody::createBox(plane->getContentSize());
planeBody->setContactTestBitmask(0x0003);
planeBody->setCategoryBitmask(0x0001);
planeBody->setCollisionBitmask(0x0007);
planeBody->setGravityEnable(false);
plane->setPhysicsBody(planeBody);
this->addChild(plane);
Animation * animation = Animation::create();
SpriteFrame * spriteFrame1 = SpriteFrame::create("hero1.png",Rect(0,0,102,126));
SpriteFrame * spriteFrame2 = SpriteFrame::create("hero2.png",Rect(0,0,102,126));
animation->addSpriteFrame(spriteFrame1);
animation->addSpriteFrame(spriteFrame2);
animation->setDelayPerUnit(0.15f);
Animate * animate = Animate::create(animation);
plane->runAction(RepeatForever::create(animate));
//触摸事件注册,要通过回调函数来控制飞机的坐标
setTouchEnabled(true);
//设置为单点触碰
setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
//我机发射子弹
this->schedule(schedule_selector(GameScene::bulletCreate),0.3);
//让子弹飞和让敌机飞
this->schedule(schedule_selector(GameScene::objectMove),0.01);
//敌机创建
this->schedule(schedule_selector(GameScene::enemyCreate),0.5);
/*
//添加暂停按钮
auto mpauseItem = MenuItemImage::create( "game_pause_nor.png", "game_pause_pressed.png", CC_CALLBACK_1(GameScene::gamePause, this));
mpauseItem->setPosition(Vec2(visibleSize.width + origin.x - mpauseItem->getContentSize().width/2, visibleSize.height + origin.y - mpauseItem->getContentSize().height/2));
//添加继续按钮
auto mresumeItem = MenuItemImage::create( "game_resume_nor.png", "game_resume_pressed.png", CC_CALLBACK_1(GameScene::gameResume, this));
mresumeItem->setPosition(Vec2(visibleSize.width/2 + origin.x - mresumeItem->getContentSize().width/2, visibleSize.height/2 + origin.y - mresumeItem->getContentSize().width/2));
auto mcloseItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png",CC_CALLBACK_1(GameScene::gameClose, this));
mcloseItem->setPosition(Vec2(origin.x + visibleSize.width/2 + mcloseItem->getContentSize().width/2 ,visibleSize.height/2 + origin.y + mcloseItem->getContentSize().height/2));
//把菜单项添加到菜单精灵中
auto mmenu = Menu::create(mpauseItem,mresumeItem,mcloseItem, NULL);
mmenu->setPosition(Vec2::ZERO);
//把菜单精灵添加到当前的层中
this->addChild(mmenu);
*/
return true;
}
//层进入的时候会调用该函数,进行物理世界的碰撞检测
void GameScene::onEnter()
{
Layer::onEnter();
auto listener = EventListenerPhysicsContact::create();
listener -> onContactBegin = [=](PhysicsContact& contact)
{
auto spriteA = (Sprite *)contact.getShapeA()->getBody()->getNode();
auto spriteB = (Sprite *)contact.getShapeB()->getBody()->getNode();
int tag1 = spriteA->getTag();
int tag2 = spriteB->getTag();
Vec2 vec1 = spriteA->getPosition();
Vec2 vec2 = spriteB->getPosition();
//敌机和子弹碰撞碰撞
if(tag1 + tag2 == 210 || tag1 + tag2 == 211) //敌机105或104 子弹106 我机103
{
SimpleAudioEngine::getInstance()->playEffect("sounds/use_bomb.wav");
//加分,如果是104则是小敌机500分,105是大敌机1000分
if(tag1 == 104 || tag2 == 104)
{
score += 500;
}
else
{
score += 1000;
}
auto scoreSpire = (Label *)this->getChildByTag(100);
scoreSpire->setString(String::createWithFormat("分数:%d",score)->_string);
//粒子特效
auto * system = ParticleSystemQuad::create("particle_texture.plist");
if(tag1 == 104 || tag1 == 105)
{
//移除敌机和子弹
enemyList.eraseObject(spriteA);
bulletList.eraseObject(spriteB);
system->setPosition(vec1);
//启动动画
this->planeBomb(vec1,tag1);
}
else
{
enemyList.eraseObject(spriteB);
bulletList.eraseObject(spriteA);
//启动动画
this->planeBomb(vec2,tag2);
system->setPosition(vec2);
}
//粒子特效加入层中
this->addChild(system);
spriteA->removeFromParent();
spriteB->removeFromParent();
}
//敌机与我机碰撞
else if(tag1 + tag2 == 207 || tag1+tag2 == 208)
{
SimpleAudioEngine::getInstance()->playEffect("sounds/game_over.wav");
//修改游戏状态为结束状态3
status = 3;
//停止所有的定时器
stopAllSchedule();
//游戏结束逻辑
if(tag1 == 103)
{
this->planeBomb(vec2,tag2);
this->planeBomb(vec1,tag1);
}
else
{
this->planeBomb(vec1,tag1);
this->planeBomb(vec2,tag2);
}
//使用UserDefault存储些用户数据分数,用法比较简单,map的使用方法,
UserDefault * userDefault = UserDefault::getInstance();
int topScore = userDefault->getIntegerForKey("topScore");
if(topScore < score)
{
userDefault->setIntegerForKey("topScore",score);
}
else
userDefault->setIntegerForKey("topScore",topScore);
userDefault->setIntegerForKey("currentScore",score);
spriteA->removeFromParent();
spriteB->removeFromParent();
}
else{}
return true;
};
//注册监听器
EventDispatcher * eventDispatcher = Director::getInstance()->getEventDispatcher();
eventDispatcher ->addEventListenerWithSceneGraphPriority(listener,this);
}
//暂停游戏
void GameScene::gamePause(Ref * pSender)
{
}
//继续游戏
void GameScene::gameResume(Ref * pSender)
{
}
猩先生带你打飞机源码4
需积分: 9 22 浏览量
2015-03-07
17:41:33
上传
评论
收藏 11KB RAR 举报
Mr_xin321
- 粉丝: 14
- 资源: 5
最新资源
- 基于双向 LSTM 中文微博情感分类项目功能实现
- PHP新闻管理系统设计与实现 毕业设计
- STM32单片机FPGA毕设电路原理论文报告汽车电动助力转向单片机控制系统设计与试验研究
- STM32单片机FPGA毕设电路原理论文报告气压传感器神经网络算法及单片机实现
- 西南交大-大学物理A作业-2019-带参考答案
- c++语言大作业,校区人员管理系统framework.zip
- 多目标优化算法集合,包含使用手册
- c语言程序设计大作业 课程设计 高分大作业98分.zip
- STM32单片机FPGA毕设电路原理论文报告频率的测量在单片机设计中的应用
- 音频转码工具(用于将微信语音 amr 格式转换为 mp3 格式以便在 html5 的 audio 标签中进行播放).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈