cocos2d-x学习(3)---游戏实例开发:一个简单的射击游戏二

核心代码:

(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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hfreeman2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值