当前位置: 编程技术>移动开发
本页文章导读:
▪讯息推送系统设计 消息推送系统设计
Push Notification系统设计
一. 数据库表设计
1. 设备令牌表device_token
device_id: 设备标识,主键
device_type: 设备类型iOS或Android,必须字段
device_token: 设备令牌,设备类型为.........
▪ coco2d-x 2.0学习系列(1):SimpleGame(3) coco2d-x 2.0学习系列(一):SimpleGame(3)
cocos2d-x 2.0 SimpleGame知识点总结。
1.创建一个层的基本模板
virtual bool init();
static cocos2d::CCScene* scene();
CREATE_FUNC(MYSCENE);
2.
CCDirector CCSprite CCArray .........
▪ coco2d-x 2.0学习系列(1):SimpleGame(2) coco2d-x 2.0学习系列(一):SimpleGame(2)
#ifndef __SIMPLE_GAME_H__
#define __SIMPLE_GAME_H__
#include "cocos2d.h"
class SimpleGame:public cocos2d::CCLayerColor{
public:
SimpleGame();
~SimpleGame();
//初始化函数
virtual bool init();
s.........
[1]讯息推送系统设计
来源: 互联网 发布时间: 2014-02-18
消息推送系统设计
收集和更新设备令牌 post_device_token
以device_id为条件,没有纪录则新增,有纪录则更新
user_id刚开始为空,用户登录后加入,用户登出后清空
Android拉取消息 get_notification
有消息时纪录到表Notification中
拉取时根据user_id和device_id进行匹配,2个字段任1个匹配即可。注意:user_id相同时要排除空user_id
客户端拉取后立即清除
iOS根据deviceToken直接发送;Android将消息纪录在Notification表中,等待拉取。
用户相关的消息,根据user_id为过滤条件,为用户发送消息。
Push Notification系统设计
一. 数据库表设计
1. 设备令牌表device_token
device_id: 设备标识,主键
device_type: 设备类型iOS或Android,必须字段
device_token: 设备令牌,设备类型为iOS时必须字段
user_id: 用户标识,可以为空
2. Android消息表notication
device_id: 设备标识
user_id: 用户标识
content: 消息体
二. 接口设计
请求参数: 同数据库表device_token
返回结果: 成功或失败标识
业务逻辑:
请求参数:
user_id: 用户标识,未注册用户或者已登出用户为空
device_id: 设备标识,必须参数
返回结果: 未推送消息列表
业务逻辑:
三. 推送消息
[2] coco2d-x 2.0学习系列(1):SimpleGame(3)
来源: 互联网 发布时间: 2014-02-18
coco2d-x 2.0学习系列(一):SimpleGame(3)
cocos2d-x 2.0 SimpleGame知识点总结。
1.创建一个层的基本模板
virtual bool init();
static cocos2d::CCScene* scene();
CREATE_FUNC(MYSCENE);
2.
CCDirector CCSprite CCArray CCNode CCPoint CCMenu 以及Action callfuncN_selector schedule CCMoveTo
3.坐标系统
4.碰撞问题
总个游戏代码不多,但是包括场景的创建 场景的切换 精灵的创建 精灵的移动
精灵的碰撞 精灵的销毁 音乐的播放等等。。
[3] coco2d-x 2.0学习系列(1):SimpleGame(2)
来源: 互联网 发布时间: 2014-02-18
coco2d-x 2.0学习系列(一):SimpleGame(2)
#ifndef __SIMPLE_GAME_H__
#define __SIMPLE_GAME_H__
#include "cocos2d.h"
class SimpleGame:public cocos2d::CCLayerColor{
public:
SimpleGame();
~SimpleGame();
//初始化函数
virtual bool init();
static cocos2d::CCScene* scene();
// 菜单响应函数
virtual void menuCloseCallback(cocos2d::CCObject* pSender);
CREATE_FUNC(SimpleGame);
//精灵移动结束回调函数
void spriteMoveFinished(cocos2d::CCNode* sender);
//定时添加精灵回调函数
void gameLogic(float dt);
//碰撞检测
void updateGame(float dt);
void registerWithTouchDispatcher();
//触摸事件
void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
protected:
cocos2d::CCArray *_targets;//敌人精灵集合
cocos2d::CCArray *_projectiles;//子弹精灵集合
int _projectilesDestroyed;//
void addTarget();//添加敌人精灵
};
#endif
#include "SimpleGameScene.h"
#include "GameOverScene.h"
#include "SimpleAudioEngine.h"
using namespace cocos2d;
SimpleGame::SimpleGame():
_targets(NULL)
,_projectiles(NULL)
,_projectilesDestroyed(0){}
SimpleGame::~SimpleGame(){
if(_targets){
_targets->release();
_targets=NULL;
}
if(_projectiles){
_projectiles->release();
_projectiles=NULL;
}
}
//创建场景并且添加层
CCScene* SimpleGame::scene(){
CCScene * scene = NULL;
do
{
scene = CCScene::create();
CC_BREAK_IF(! scene);
SimpleGame *layer = SimpleGame::create();
CC_BREAK_IF(! layer);
scene->addChild(layer);
} while (0);
return scene;
}
//初始化
bool SimpleGame::init(){
bool bRet = false;
do
{
//初始化带颜色的层
CC_BREAK_IF(! CCLayerColor::initWithColor( ccc4(255,255,255,255) ) );
//创建图片菜单item,并设置响应回调函数
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(SimpleGame::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// OpenGL view size
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
// visible origin of the OpenGL view in points
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
//设置pCloseItem位置
//#define ccp(__X__,__Y__) cocos2d::CCPointMake((float)(__X__), (float)(__Y__))
//宏ccp 返回point
/************************************************************************/
/*这个地方关联到coco2d-x坐标系
基本的两个坐标系:屏幕坐标系和GL坐标系。
屏幕坐标系x轴朝右,y轴朝下。默认原点在左上角。
O---------------->x
|
|
|
|
y
GL坐标系x轴朝右,y轴朝上。默认原点在左下角。
opengl
y|
|
|
|
|
O-------------------->x
setPosition设置的是GL坐标
setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2,
origin.y + pCloseItem->getContentSize().height/2));
这句实际上是把关闭按钮设置到到屏幕的右下角
y
|
|
|
| ____
| |__*_|
origin(x,y)---------------------------->x
*/
/************************************************************************/
pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2,
origin.y + pCloseItem->getContentSize().height/2));
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);//这里必须设置才能显示菜单
CC_BREAK_IF(! pMenu);
//菜单添加到层
this->addChild(pMenu, 1);
//创建英雄精灵
CCSprite *player = CCSprite::create("Player.png", CCRectMake(0, 0, 27, 40) );
//创建精灵
player->setPosition( ccp(origin.x + player->getContentSize().width/2,
origin.y + visibleSize.height/2) );
this->addChild(player);
//定时增加敌人精灵,每一秒新增一个
this->schedule( schedule_selector(SimpleGame::gameLogic), 1.0 );
//设置可触摸
this->setTouchEnabled(true);
_targets = new CCArray;
_projectiles = new CCArray;
//检测碰撞
this->schedule( schedule_selector(SimpleGame::updateGame) );
//播放背景音乐
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav", true);
bRet = true;
} while (0);
return bRet;
}
// 新增敌人精灵
void SimpleGame::addTarget()
{
CCSprite *target = CCSprite::create("Target.png", CCRectMake(0,0,27,40) );
CCSize winSize = CCDirector::sharedDirector()->getVisibleSize();
float minY = target->getContentSize().height/2;
float maxY = winSize.height - target->getContentSize().height/2;
int rangeY = (int)(maxY - minY);
int actualY = ( rand() % rangeY ) + (int)minY;
target->setPosition(
ccp(winSize.width + (target->getContentSize().width/2),
CCDirector::sharedDirector()->getVisibleOrigin().y + actualY) );
this->addChild(target);
// Determine speed of the target
int minDuration = (int)2.0;
int maxDuration = (int)4.0;
int rangeDuration = maxDuration - minDuration;
// srand( TimGetTicks() );
int actualDuration = ( rand() % rangeDuration ) + minDuration;
// 精灵移动action
CCFiniteTimeAction* actionMove = CCMoveTo::create( (float)actualDuration,
ccp(0 - target->getContentSize().width/2, actualY) );
CCFiniteTimeAction* actionMoveDone = CCCallFuncN::create( this,
callfuncN_selector(SimpleGame::spriteMoveFinished));
target->runAction( CCSequence::create(actionMove, actionMoveDone, NULL) );
// 敌人精灵加入ccarray
target->setTag(1);
_targets->addObject(target);
}
void SimpleGame::spriteMoveFinished(CCNode *sender)
{
CCSprite *sprite = (CCSprite *)sender;
this->removeChild(sprite, true);
if (sprite->getTag() == 1) // target
{
_targets->removeObject(sprite);
//游戏失败切换场景
GameOverScene *gameOverScene = GameOverScene::create();
gameOverScene->getLayer()->getLabel()->setString("You Lose :[");
CCDirector::sharedDirector()->replaceScene(gameOverScene);
}
else if (sprite->getTag() == 2) // projectile
{
_projectiles->removeObject(sprite);
}
}
void SimpleGame::gameLogic(float dt)
{
this->addTarget();//添加敌人精灵
}
void SimpleGame::menuCloseCallback(CCObject* pSender)
{
// 响应menu时间
CCDirector::sharedDirector()->end();
}
// 触摸屏幕 添加子弹
void SimpleGame::ccTouchesEnded(CCSet* touches, CCEvent* event)
{
// Choose one of the touches to work with
CCTouch* touch = (CCTouch*)( touches->anyObject() );
CCPoint location = touch->getLocation();
//触摸按下的坐标
CCLog("++++++++after x:%f, y:%f", location.x, location.y);
CCSize winSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCSprite *projectile = CCSprite::create("Projectile.png", CCRectMake(0, 0, 20, 20));
projectile->setPosition( ccp(origin.x+20, origin.y+winSize.height/2) );
// Determinie offset of location to projectile
float offX = location.x - projectile->getPosition().x;
float offY = location.y - projectile->getPosition().y;
// Bail out if we are shooting down or backwards
if (offX <= 0) return;
// Ok to add now - we've double checked position
this->addChild(projectile);
// Determine where we wish to shoot the projectile to
float realX = origin.x+winSize.width + (projectile->getContentSize().width/2);
float ratio = offY / offX;
float realY = (realX * ratio) + projectile->getPosition().y;
CCPoint realDest = ccp(realX, realY);
// Determine the length of how far we're shooting
float offRealX = realX - projectile->getPosition().x;
float offRealY = realY - projectile->getPosition().y;
float length = sqrtf((offRealX * offRealX) + (offRealY*offRealY));
float velocity = 480/1; // 480pixels/1sec
float realMoveDuration = length/velocity;
// 移动子弹action
projectile->runAction( CCSequence::create(
CCMoveTo::create(realMoveDuration, realDest),
CCCallFuncN::create(this,
callfuncN_selector(SimpleGame::spriteMoveFinished)),
NULL) );
// Add to projectiles array
projectile->setTag(2);
_projectiles->addObject(projectile);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
}
//碰撞检测
void SimpleGame::updateGame(float dt)
{
CCArray *projectilesToDelete = new CCArray;
CCObject* it = NULL;
CCObject* jt = NULL;
// for (it = _projectiles->begin(); it != _projectiles->end(); it++)
CCARRAY_FOREACH(_projectiles, it)//遍历ccarray
{
CCSprite *projectile = dynamic_cast<CCSprite*>(it);//动态转换类类型
//飞镖矩形区域
CCRect projectileRect = CCRectMake(
projectile->getPosition().x - (projectile->getContentSize().width/2),
projectile->getPosition().y - (projectile->getContentSize().height/2),
projectile->getContentSize().width,
projectile->getContentSize().height);
CCArray* targetsToDelete =new CCArray;
// for (jt = _targets->begin(); jt != _targets->end(); jt++)
CCARRAY_FOREACH(_targets, jt)
{
CCSprite *target = dynamic_cast<CCSprite*>(jt);
CCRect targetRect = CCRectMake(
target->getPosition().x - (target->getContentSize().width/2),
target->getPosition().y - (target->getContentSize().height/2),
target->getContentSize().width,
target->getContentSize().height);
// 碰撞检测,2个精灵区域相交,即为碰撞。
if (projectileRect.intersectsRect(targetRect))
{
targetsToDelete->addObject(target);
}
}
// for (jt = targetsToDelete->begin(); jt != targetsToDelete->end(); jt++)
CCARRAY_FOREACH(targetsToDelete, jt)
{
CCSprite *target = dynamic_cast<CCSprite*>(jt);
_targets->removeObject(target);
this->removeChild(target, true);
_projectilesDestroyed++;
if (_projectilesDestroyed >= 5)
{
GameOverScene *gameOverScene = GameOverScene::create();
gameOverScene->getLayer()->getLabel()->setString("You Win!");
CCDirector::sharedDirector()->replaceScene(gameOverScene);
}
}
if (targetsToDelete->count() > 0)
{
projectilesToDelete->addObject(projectile);
}
targetsToDelete->release();
}
// for (it = projectilesToDelete->begin(); it != projectilesToDelete->end(); it++)
CCARRAY_FOREACH(projectilesToDelete, it)
{
CCSprite* projectile = dynamic_cast<CCSprite*>(it);
_projectiles->removeObject(projectile);
this->removeChild(projectile, true);
}
projectilesToDelete->release();
}
void SimpleGame::registerWithTouchDispatcher()
{
// CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,0,true);
CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0);
}
最新技术文章: