核心代码:
(1)GameSprite类-------游戏的基类
GameSprite.h
#pragma once
#include "cocos2d.h"
using namespace cocos2d;
//基本游戏父类包装类
class GameSprite : public CCNode
{
protected:
//核心变量:精灵
CCSprite *mysprite;
//state: 0 初始化, -1 不初始
int state;
public:
GameSprite(void);
GameSprite(char *s);
//构造方法
CCSprite * GameSprite::getsprite();
~GameSprite(void);
//设置位置
virtual void GameSprite::setPosition(CCPoint mypoint);
//获取大小
virtual CCSize GameSprite::getMySize();
//碰撞
virtual bool GameSprite::collision();
//设置状态
void GameSprite::setState(int mystate);
//获取状态
int GameSprite::getState();
//处理一些逻辑,在这个Demo中,主要是处理子弹的发射
virtual void GameSprite::tick();
};
GameSprite.cpp
#include "GameSprite.h"
#include "cocos2d.h"
using namespace cocos2d;
GameSprite::GameSprite(void)
{
}
GameSprite::~GameSprite(void)
{
}
GameSprite::GameSprite(char * s)
{
mysprite = CCSprite::spriteWithFile(s);
//mysprite = CCSprite::create(s);
}
void GameSprite::tick()
{
}
void GameSprite::setPosition(CCPoint mypoint)
{
mysprite->setPosition(mypoint);
}
CCSprite* GameSprite::getsprite()
{
return mysprite;
}
void GameSprite::setState(int mystate)
{
state = mystate;
}
int GameSprite::getState()
{
return state;
}
bool GameSprite::collision()
{
return false;
}
CCSize GameSprite::getMySize()
{
return mysprite->getContentSize();
}
(2)GamePlayer类--------玩家飞机类
GamePlayer.h
#pragma once
#include "GameSprite.h"
#include "cocos2d.h"
using namespace cocos2d;
//玩家飞机类
class GamePlayer : public GameSprite
{
private:
//变量:拖动渐隐效果
CCMotionStreak *mystreak;
//状态
int state;
public:
GamePlayer(void);
//构造方法
GamePlayer(char * s);
~GamePlayer(void);
//设置位置
virtual void GamePlayer::setPosition(CCPoint mypoint);
//判断是否碰撞
bool GamePlayer::iscollision(GameSprite *testsprite);
//碰撞
virtual bool GamePlayer::collision();
//获取变量拖动渐隐效果类
CCMotionStreak *GamePlayer::getstreak();
//获取大小
virtual CCSize GamePlayer::getMySize();
//处理一些逻辑,在这个Demo中,主要是处理子弹的发射
virtual void GamePlayer::tick();
};
GamePlayer.cpp
#include "GamePlayer.h"
#include "cocos2d.h"
using namespace cocos2d;
GamePlayer::GamePlayer(void)
{
}
GamePlayer::~GamePlayer(void)
{
}
GamePlayer::GamePlayer(char * s)
{
mysprite = CCSprite::spriteWithFile(s);
//mystreak = CCMotionStreak::streakWithFade(2, 2, s, 30, 30, ccc4(255,0,0,255) );
//mystreak = CCMotionStreak::streakWithFade(2.0f, 2.0f, 30.0f, ccc3(255, 255, 0), s);
mystreak = CCMotionStreak::create(1.0f, 20.0f, 20.0f, ccc3(255, 255, 0), s);
//streak = CCMotionStreak::create(2.0f, 1.0f, 50.0f, ccc3(255, 255, 0), "Images/Icon.png");
//mystreak = CCMotionStreak::streakWithFade(2, 2,30, 30, ccc4(255,0,0,255),s );
}
void GamePlayer::tick()
{
}
void GamePlayer::setPosition(CCPoint mypoint)
{
mysprite->setPosition(mypoint);
mystreak->setPosition(mypoint);
}
CCMotionStreak *GamePlayer::getstreak()
{
return mystreak;
}
//判断是否碰撞
bool GamePlayer::iscollision(GameSprite *testsprite)
{
CCSize ownsize = mysprite->getContentSize();
CCSize othersize = testsprite->getMySize();
CCPoint ownp = mysprite->getPosition();
CCPoint otherp = (testsprite->getsprite())->getPosition();
if(abs(ownp.x - otherp.x) <= ownsize.width/2 + othersize.width/2
&& abs(ownp.y - otherp.y) <= ownsize.height/2 + othersize.height/2){
return true;
}
return false;
}
bool GamePlayer::collision()
{
return false;
}
CCSize GamePlayer::getMySize()
{
return mysprite->getContentSize();
}
(3)GameEnemy------敌机类
GameEnemy.h
#pragma once
#include "gamesprite.h"
#include "GameSprite.h"
#include "GameBullet.h"
#include "cocos2d.h"
using namespace cocos2d;
//敌机类
class GameEnemy : public GameSprite
{
private:
//变量拖动渐隐效果类
CCMotionStreak *mystreak;
//敌机飞行路线
CCActionInterval* bezierTo1;
CCActionInterval* actionTo1;
CCActionInterval* actionTo2;
CCActionInterval* actionTo3;
ccBezierConfig bezier1;
ccBezierConfig bezier2;
//state=0 state = -1;
//bullettick=(0, 60);
//dead: state = -1; bullettick = 0;
//init: state = 0; bullettick = 0;
short bullettick;
//type = CCRANDOM_0_1() * 5;
//飞机类型
short type;
public:
GameEnemy(void);
//构造方法
GameEnemy(char * s);
~GameEnemy(void);
//设置死亡
void GameEnemy::setDead();
//重新开始
void GameEnemy::restart();
//设置位置
virtual void GameEnemy::setPosition(CCPoint mypoint);
//判断是还碰撞
bool GameEnemy::iscollision(GameSprite *testsprite);
//获取变量拖动渐隐效果类
CCMotionStreak *GameEnemy::getstreak();
//选择敌机类型
void GameEnemy::chooseflytype();
//碰撞
virtual bool GameEnemy::collision(GamePlayer * testsprite);
//获取大小
virtual CCSize GameEnemy::getMySize();
//敌机和子弹碰撞
bool GameEnemy::collisionwithbullet(GameBullet *testsprite);
//获取变量:bullettick
int GameEnemy::getBulletTick();
//处理一些逻辑,在这个Demo中,主要是处理子弹的发射
virtual void GameEnemy::tick();
};
GameEnemy.cpp
#include "GameEnemy.h"
#include <math.h>
GameEnemy::GameEnemy(void)
{
}
GameEnemy::~GameEnemy(void)
{
}
//初始化敌机(Enemy)
GameEnemy::GameEnemy(char * s)
{
mysprite = CCSprite::spriteWithFile(s);
mysprite->setPosition(ccp(122,600));
bezier1.controlPoint_1 = CCPointMake(-50,500);
bezier1.controlPoint_2 = CCPointMake(294,250);
bezier1.endPosition = CCPointMake(122,-20);
bezier2.controlPoint_1 = CCPointMake(294,300);
bezier2.controlPoint_2 = CCPointMake(-50,150);
bezier2.endPosition = CCPointMake(122,-20);
chooseflytype();
state = 0;
bullettick = 0;
}
//初始化敌机(Enemy)的类型
void GameEnemy::chooseflytype()
{
type = CCRANDOM_0_1() * 5;
switch(type){
case 0:
mysprite->initWithFile("e2.png");
bezierTo1 = CCBezierTo::actionWithDuration(6, bezier1);
mysprite->runAction(bezierTo1);
break;
case 1:
mysprite->initWithFile("e3.png");
bezierTo1 = CCBezierTo::actionWithDuration(6, bezier2);
mysprite->runAction(bezierTo1);
break;
case 2:
mysprite->initWithFile("e4.png");
actionTo1 = CCMoveTo::actionWithDuration(2, CCPointMake(430,300));
actionTo2 = CCMoveTo::actionWithDuration(2, CCPointMake(214,150));
actionTo3 = CCMoveTo::actionWithDuration(2, CCPointMake(222,-20));
mysprite->runAction(CCSequence::actions(actionTo1,actionTo2,actionTo3,NULL));
break;
case 3:
mysprite->initWithFile("e5.png");
actionTo1 = CCMoveTo::actionWithDuration(2, CCPointMake(414,300));
actionTo2 = CCMoveTo::actionWithDuration(2, CCPointMake(30,150));
actionTo3 = CCMoveTo::actionWithDuration(2, CCPointMake(222,-20));
mysprite->runAction(CCSequence::actions(actionTo1,actionTo2,actionTo3,NULL));
break;
case 4:
mysprite->initWithFile("e6.png");
actionTo1 = CCMoveTo::actionWithDuration(6, CCPointMake(422,-20));
mysprite->runAction(actionTo1);
break;
}
}
void GameEnemy::setDead()
{
mysprite->stopAllActions();
//mysprite->setIsVisible(false);
mysprite->setVisible(false);
state = -1;
bullettick = 0;
}
void GameEnemy::restart()
{
mysprite->setPosition(ccp(322,450));
//mysprite->setIsVisible(true);
mysprite->setVisible(true);
chooseflytype();
state = 0;
bullettick = 0;
}
//state -1 dead
//state 0 处理Enemy
void GameEnemy::tick()
{
switch(state){
case -1:
break;
case 0:
//逻辑主要是处理当敌机不在界面内时,让敌机重新生成
//并且对标志位bullettick,进行计数和清零
CCPoint mypoint = mysprite->getPosition();
if(mypoint.y <= -20){
mysprite->stopAllActions();
restart();
}else{
if(bullettick >= 60){
bullettick = 0;
}else{
bullettick ++;
}
}
break;
}
}
void GameEnemy::setPosition(CCPoint mypoint)
{
mysprite->setPosition(mypoint);
}
CCMotionStreak *GameEnemy::getstreak()
{
return mystreak;
}
int GameEnemy::getBulletTick()
{
return bullettick;
}
//判断Enemy是否与GameSprite碰撞
bool GameEnemy::iscollision(GameSprite *testsprite)
{
CCSize ownsize = mysprite->getContentSize();
CCSize othersize = testsprite->getMySize();
CCPoint ownp = mysprite->getPosition();
CCPoint otherp = (testsprite->getsprite())->getPosition();
if(abs(ownp.x - otherp.x) <= ownsize.width/2 + othersize.width/2
&& abs(ownp.y - otherp.y) <= ownsize.height/2 + othersize.height/2){
return true;
}
return false;
}
//判断Enemy是否与GamePlayer碰撞
bool GameEnemy::collision(GamePlayer *testsprite)
{
CCSize ownsize = mysprite->getContentSize();
CCSize othersize = testsprite->getMySize();
CCPoint ownp = mysprite->getPosition();
CCPoint otherp = (testsprite->getsprite())->getPosition();
if(abs(ownp.x - otherp.x) <= ownsize.width/2 + othersize.width/2 && abs(ownp.y - otherp.y) <= ownsize.height/2 + othersize.height/2){
if(ownp.y + ownsize.height/2 >= otherp.y - othersize.height/2
&& ownp.y - ownsize.height/2 <= otherp.y - othersize.height/2){
otherp.y = ownp.y + ownsize.height/2 + othersize.height/2;
testsprite->setPosition(ccp(otherp.x,otherp.y));
return true;
}
if(ownp.y + ownsize.height/2 >= otherp.y + othersize.height/2
&& ownp.y - ownsize.height/2 <= otherp.y + othersize.height/2){
otherp.y = ownp.y - ownsize.height/2 - othersize.height/2;
testsprite->setPosition(ccp(otherp.x,otherp.y));
return true;
}
if(ownp.x + ownsize.width/2 >= otherp.x - othersize.width/2
&& ownp.x - ownsize.width/2 <= otherp.x - othersize.width/2){
otherp.x = ownp.x + ownsize.width/2 + othersize.width/2;
testsprite->setPosition(ccp(otherp.x,otherp.y));
return true;
}
if(ownp.x + ownsize.width/2 >= otherp.x + othersize.width/2
&& ownp.x - ownsize.width/2 <= otherp.x + othersize.width/2){
otherp.x = ownp.x - ownsize.width/2 - othersize.width/2;
testsprite->setPosition(ccp(otherp.x,otherp.y));
return true;
}
}
return false;
}
//判断Enemy是否与子弹碰撞
bool GameEnemy::collisionwithbullet(GameBullet *testsprite)
{
CCSize ownsize = mysprite->getContentSize();
CCSize othersize = testsprite->getMySize();
CCPoint ownp = mysprite->getPosition();
CCPoint otherp = (testsprite->getsprite())->getPosition();
if(abs(ownp.x - otherp.x) <= ownsize.width/2 + othersize.width/2
&& abs(ownp.y - otherp.y) <= ownsize.height/2 + othersize.height/2){
return true;
}
return false;
}
CCSize GameEnemy::getMySize()
{
return mysprite->getContentSize();
}
(4)GameBullet-------子弹类
GameBullet.h
#pragma once
#include "gamesprite.h"
#include "GamePlayer.h"
#include "cocos2d.h"
using namespace cocos2d;
//子弹类
class GameBullet : public GameSprite
{
private:
//变量拖动渐隐效果类
CCMotionStreak *mystreak;
//type: 0 初始化子弹的位置为--mysprite->setPosition(ccp(ownp.x,ownp.y + 2)),也就是玩家的子弹
//type: 1 初始化子弹的位置为--mysprite->setPosition(ccp(ownp.x,ownp.y - 2)),也就是敌机的子弹
int type;
public:
GameBullet(void);
//构造方法
GameBullet(char * s);
~GameBullet(void);
//设置位置
virtual void GameBullet::setPosition(CCPoint mypoint);
//获取变量拖动渐隐效果类
CCMotionStreak *GameBullet::getstreak();
//碰撞
virtual bool GameBullet::collision(GamePlayer * testsprite);
//获取大小
virtual CCSize GameBullet::getMySize();
//设置类型
void GameBullet::setType(int mytype);
//获取类型
int GameBullet::getType();
//处理一些逻辑,在这个Demo中,主要是处理子弹的发射,更新子弹的位置
virtual void GameBullet::tick();
};
GameBullet.cpp
#include "GameBullet.h"
#include <math.h>
GameBullet::GameBullet(void)
{
}
GameBullet::~GameBullet(void)
{
}
GameBullet::GameBullet(char * s)
{
mysprite = CCSprite::spriteWithFile(s);
//mysprite->setAnchorPoint(ccp(0.5,0));
state = 0;
}
//更新子弹的位置
//state: 0 初始化子弹, -1 不初始化子弹
//type: 0 初始化子弹的位置为--mysprite->setPosition(ccp(ownp.x,ownp.y + 2)),也就是玩家的子弹
//type: 1 初始化子弹的位置为--mysprite->setPosition(ccp(ownp.x,ownp.y - 2)),也就是敌机的子弹
void GameBullet::tick()
{
switch(type){
case 0:
switch(state){
case -1:
break;
case 0:
CCPoint ownp = mysprite->getPosition();
mysprite->setPosition(ccp(ownp.x,ownp.y + 2));
break;
}
break;
case 1:
switch(state){
case -1:
break;
case 0:
CCPoint ownp = mysprite->getPosition();
mysprite->setPosition(ccp(ownp.x,ownp.y - 2));
break;
}
break;
}
}
void GameBullet::setType(int mytype)
{
type = mytype;
}
int GameBullet::getType()
{
return type;
}
void GameBullet::setPosition(CCPoint mypoint)
{
mysprite->setPosition(mypoint);
}
CCMotionStreak *GameBullet::getstreak()
{
return mystreak;
}
bool GameBullet::collision(GamePlayer *testsprite)
{
return false;
}
CCSize GameBullet::getMySize()
{
return mysprite->getContentSize();
}