#include "HelloWorldScene.h"
#include "GameOverLayer.h"
using namespace cocos2d;
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////
CC_BREAK_IF(! CCLayer::init());
//////////////////////////////////////////////////////////////////////////
// add your codes below...
//////////////////////////////////////////////////////////////////////////
// 添加游戏名字 Add a label shows "Star Fighter".
// Create a label and initialize with string "Hello World".
CCLabelTTF* pLabel = CCLabelTTF::create("Star Fighter", "Arial", 36);
CC_BREAK_IF(! pLabel);
// Get window size and place the label upper.
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));
// Add the label to HelloWorld layer as a child layer.
this->addChild(pLabel, 1);
// 添加背景Add a splash screen, show the cocos2d splash image.
CCSprite* pSprite = CCSprite::create("bg_01.jpg");
CC_BREAK_IF(! pSprite);
// Place the sprite on the center of the screen
pSprite->setPosition(ccp(size.width/2, size.height/2));
// Add the sprite to HelloWorld layer as a child layer.
this->addChild(pSprite, 0);
//添加玩家player精灵
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *player = CCSprite::create("player.png");
player->setPosition(ccp(winSize.width / 2, 50));
this->addChild(player, 2);
this->_monsters = CCArray::create();
this->_monsters->retain();
this->_projectiles = CCArray::create();
this->_projectiles->retain();
this->schedule(schedule_selector(HelloWorld::gameLogic), 1);
this->setTouchEnabled(true);
this->schedule(schedule_selector(HelloWorld::update));
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav");
bRet = true;
} while (0);
//时创建怪物,在init函数返回之前,安装定时器,每秒执行一次
return bRet;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// "close" menu item clicked
CCDirector::sharedDirector()->end();
}
void HelloWorld::addMonster()
{
CCSprite *monster = CCSprite::create("Monster1.png");
//使敌人敌机从上面出现时,左右显示是完整的,并在屏幕上方随机产生
//如果其他游戏是Y轴可以把x统一改为Y即可
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
int minX = monster->getContentSize().width / 2;
int maxX = winSize.width - monster->getContentSize().width / 2;
int rangeX = maxX - minX;
int actualX = (rand() % rangeX) + minX;//随机位置产生敌人
//设置敌机坐标 并显示出来
monster->setPosition(ccp(actualX,winSize.height + monster->getContentSize().height / 2));
this->addChild(monster);
//使用随机函数控制飞机速度。改下面数字可以调整飞机速度,控制游戏难度,当然敌机、子弹的触碰区域大小等也会影响游戏难度。
int minDuration = 2.0;
int maxDuration = 5.0;
int rangeDuration = maxDuration - minDuration;
int actualDuration = (rand() % rangeDuration) + minDuration;
//即当整个飞机离开屏幕(注意默认锚点是图片的中心位置)
CCMoveTo *actionMove = CCMoveTo::create(actualDuration, ccp(actualX,-monster->getContentSize().height / 2));
CCCallFuncN *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished));
monster->runAction(CCSequence::create(actionMove, actionMoveDone, NULL));
//为怪物精灵添加标签,并加入到数组
monster->setTag(1);
_monsters->addObject(monster);
}
void HelloWorld::spriteMoveFinished(CCNode *sender) //回调函数spriteMoveFinished,进行删除精灵对象
{
CCSprite *sprite = (CCSprite*)sender;
this->removeChild(sprite, true);
if (sprite->getTag() == 1)
{
_monsters->removeObject(sprite);
//统计放跑敌机的数量,如果超过3个就失败
_life++;
if(_life>=3)
{
CCScene *gameOverScene = GameOverLayer::sceneWithWon(false);
CCDirector::sharedDirector()->replaceScene(gameOverScene);
}
}
else if (sprite->getTag() == 2)
{
_projectiles->removeObject(sprite);
}
}
void HelloWorld::gameLogic( float dt )
{
this->addMonster();
}
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CCTouch *touch = (CCTouch*)pTouches->anyObject();
CCPoint location = this->convertTouchToNodeSpace(touch);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *projectile = CCSprite::create("zd.png");
projectile->setPosition(ccp(winSize.width / 2, 50));
CCPoint offset = ccpSub(location, projectile->getPosition());
//关于子弹移动轨迹,主要是用了数学的勾股定理,平行线等分线段定理 CE:CB=DE:AB=CD:AC。
if (offset.y <= 0)
{
return;
}
this->addChild(projectile);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("shoot.mp3");
int realY = winSize.height + projectile->getContentSize().height / 2; //这里是子弹的消失点,也是理解该段的重点,即子弹如果没有碰撞则会在屏幕的尽头消失。
float ratio = (float)offset.x/ (float)offset.y;//offset.x,offset.y是上面CCPoint offset = ccpSub(location, projectile->getPosition());电脑算出来的。
int realX = (realY - projectile->getPosition().y) * ratio + projectile->getPosition().x;//利用等比例原理算出了realY的位置。
//原文该行(realX - projectile->getPosition().x) 直接写成了realX 错误 两侧的子弹会跟鼠标稍有偏差,偏差不大不仔细看不出来。
CCPoint realDest = ccp(realX, realY);//算出了预计子弹的消失点
//通过子弹经过的路径长度,等比例地控制子弹的运行时间
int offRealX = realX - projectile->getPosition().x;
int offRealY = realY - projectile->getPosition().y;
float length = sqrtf(offRealX * offRealX + offRealY * offRealY);
float velocity = 480 / 1;//修改480该数字可以调整子弹运行的快慢
float realMoveDuration = length / velocity;
projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, realDest),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)), NULL));
//如果横板游戏,发射点是x轴左侧的,就用该段。关于子弹移动轨迹,主要是用了数学的勾股定理,平行线等分线段定理 CE:CB=DE:AB=CD:AC。
//if (offset.x <= 0)
//{
// return;
//}
//this->addChild(projectile);
//int realX = winSize.width + projectile->getContentSize().width / 2; //这里是子弹的消失点,也是理解该段的重点,即子弹如果没有碰撞则会在屏幕的尽头消失。
//float ratio = (float)offset.y / (float)offset.x;//offset.x,offset.y是上面CCPoint offset = ccpSub(location, projectile->getPosition());电脑算出来的。
//int realY = (realX - projectile->getPosition().x) * ratio + projectile->getPosition().y;//利用等比例原理算出了realY的位置。
////原文该行(realX - projectile->getPosition().x) 直接写成了realX 错误 两侧的子弹会跟鼠标稍有偏差,偏差不大不仔细看不出来。
//CCPoint realDest = ccp(realX, realY);//算出了预计子弹的消失点
////通过子弹经过的路径长度,等比例地控制子弹的运行时间
//int offRealX = realX - projectile->getPosition().x;
//int offRealY = realY - projectile->getPosition().y;
//float length = sqrtf(offRealX * offRealX + offRealY * o
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源是基于SimpleGame开发的游戏。 SimpleGame是官方下载的cocos2d-2.0-x-2.0.4安装软件解压缩后可以看到的该例子,即在根目录下的Samples示例文件夹里面的SimpleGame。 我这里只是把他们横版的游戏,变成竖版,取消白色游戏背景改为用图片背景,而图片素材则换成微信飞机的图片。 此外将原本走掉1个就算输的游戏规则改为如果超过3个敌机跑到屏幕下方里,则玩家失败。飞机的速度和显示时间也稍做了调整。 此外本文修改了以上两文档中子弹路径算法的一个细微的小错漏。 这是本人博客关于该小游戏的制作教程:http://blog.csdn.net/u013174689/article/details/17997513
资源推荐
资源详情
资源评论
收起资源包目录
Star Fighter源码(cocos2d x 2.0.4+VS2010).rar (82个子文件)
Star Fighter源码
proj.win32
resource.h 503B
Star Fighter.win32.vcxproj.filters 2KB
res
Star Fighter.ico 47KB
Star Fighter.win32.vcxproj.user 920B
main.cpp 976B
Release.win32
cl.command.1.tlog 2B
CL.read.1.tlog 2B
CL.write.1.tlog 2B
Star Fighter.win32.unsuccessfulbuild 0B
Star Fighter.win32.lastbuildstate 62B
Star Fighter.win32.log 2KB
Debug.win32
cl.command.1.tlog 13KB
link.4528.write.1.tlog 2B
GameOverLayer.obj 111KB
link.4528-cvtres.read.1.tlog 2B
link.1604.read.1.tlog 2B
Star Fighter.win32.exe.embed.manifest.res 472B
rc.command.1.tlog 1KB
CL.read.1.tlog 180KB
vc100.idb 1.36MB
mt.read.1.tlog 518B
Star Fighter.win32.exe.intermediate.manifest 381B
link.1604.write.1.tlog 2B
Star Fighter.win32.exe.embed.manifest 406B
link-cvtres.read.1.tlog 2B
link.read.1.tlog 5KB
rc.read.1.tlog 3KB
link.write.1.tlog 2KB
CL.write.1.tlog 6KB
link.1604-cvtres.read.1.tlog 2B
link.4528.read.1.tlog 2B
vc100.pdb 636KB
link.10972.read.1.tlog 2B
Star Fighter.win32.lastbuildstate 60B
Star Fighter.win32.log 4KB
main.obj 68KB
link.command.1.tlog 3KB
Star Fighter.res 47KB
mt.write.1.tlog 450B
link.1604-cvtres.write.1.tlog 2B
HelloWorldScene.obj 131KB
Star Fighter.win32_manifest.rc 238B
link.10972-cvtres.write.1.tlog 2B
link.4528-cvtres.write.1.tlog 2B
link.10972-cvtres.read.1.tlog 2B
mt.command.1.tlog 522B
rc.write.1.tlog 754B
AppDelegate.obj 89KB
link-cvtres.write.1.tlog 2B
link.10972.write.1.tlog 2B
main.h 270B
Star Fighter.rc 2KB
Star Fighter.win32.vcxproj 9KB
Classes
AppDelegate.cpp 1KB
HelloWorldScene.h 1019B
HelloWorldScene.cpp 10KB
GameOverLayer.h 413B
AppDelegate.h 960B
GameOverLayer.cpp 2KB
Resources
shoot.mp3 9KB
bg_01.jpg 25KB
zd.png 3KB
Monster1.png 6KB
player.png 10KB
background-music-aac.wav 1.57MB
Debug.win32
Star Fighter.win32.ilk 911KB
libtiff.dll 513KB
glew32.dll 324KB
shoot.mp3 9KB
zlib1.dll 76KB
bg_01.jpg 25KB
iconv.dll 868KB
pthreadVCE2.dll 76KB
zd.png 3KB
Monster1.png 6KB
player.png 10KB
libxml2.dll 963KB
Star Fighter.win32.exe 132KB
libCocosDenshion.dll 65KB
Star Fighter.win32.pdb 1.31MB
background-music-aac.wav 1.57MB
libcocos2d.dll 2.04MB
共 82 条
- 1
资源评论
- 程序猿zee2014-02-25个人觉得还不错,学到了
- miaozhenglong2014-03-28真的很有用,学习了
小李00
- 粉丝: 151
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功