cocos如何能按PS的图来很ip地址精确位置查询快速的对准位置?

cocos2d-x(73)
图片变灰, 采用shader就可以实现, &
有2中方法,
1, &像CCSprite一样create
2. &把CCSprite传进来, 并把图片要不要变灰的flag传进来, 具体实现看代码和后面的使用方法
-----------------------------------------
GraySprite.h
GraySprite.h
Created by rekoo on 13-7-23.
#ifndef __goddess__GraySprite__
#define __goddess__GraySprite__
#include &cocos2d.h&
#include &cocos-ext.h&
USING_NS_CC;
USING_NS_CC_EXT;
class GraySprite : public CCSprite
GraySprite();
~GraySprite();
bool initWithTexture(CCTexture2D* texture, const CCRect&
void draw();
void initProgram();
void listenBackToForeground(CCObject *obj);
static GraySprite* create(const char *pszFileName);
#endif /* defined(__goddess__GraySprite__) */
GraySprite.cpp
GraySprite.cpp
Created by rekoo on 13-7-23.
// 用shader创建灰度图, 用法跟sprite一样
lua用法: local sprite = GraySprite:create(&pic.png&)
#include &GraySprite.h&
GraySprite::GraySprite()
GraySprite::~GraySprite()
GraySprite* GraySprite::create(const char *pszFileName)
GraySprite* pRet = new GraySprite();
if (pRet && pRet-&initWithFile(pszFileName))
pRet-&autorelease();
CC_SAFE_DELETE(pRet);
void GraySprite::listenBackToForeground(CCObject *obj)
setShaderProgram(NULL);
initProgram();
bool GraySprite::initWithTexture(CCTexture2D* texture, const CCRect& rect)
if( CCSprite::initWithTexture(texture, rect) )
CCSize s = getTexture()-&getContentSizeInPixels();
this-&initProgram();
void GraySprite::initProgram()
GLchar * fragSource = (GLchar*) CCString::createWithContentsOfFile(
CCFileUtils::sharedFileUtils()-&fullPathForFilename(&Shaders/example_Blur.fsh&).c_str())-&getCString();
GLchar * pfrag =
&#ifdef GL_ES \n \
#endif \n\
uniform sampler2D u_ \n \
varying vec2 v_texC \n \
varying vec4 v_fragmentC \n \
void main(void) \n \
float alpha = texture2D(u_texture, v_texCoord).a; \n \
float grey = dot(texture2D(u_texture, v_texCoord).rgb, vec3(0.299,0.587,0.114)); \n \
gl_FragColor = vec4(grey, grey, grey,alpha); \n \
CCGLProgram* pProgram = new CCGLProgram();
pProgram-&initWithVertexShaderByteArray(ccPositionTextureColor_vert, pfrag);
setShaderProgram(pProgram);
pProgram-&release();
CHECK_GL_ERROR_DEBUG();
getShaderProgram()-&addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
getShaderProgram()-&addAttribute(kCCAttributeNameColor, kCCVertexAttrib_Color);
getShaderProgram()-&addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
CHECK_GL_ERROR_DEBUG();
getShaderProgram()-&link();
CHECK_GL_ERROR_DEBUG();
getShaderProgram()-&updateUniforms();
void GraySprite::draw()
ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );
ccBlendFunc blend = getBlendFunc();
ccGLBlendFunc(blend.src, blend.dst);
getShaderProgram()-&use();
getShaderProgram()-&setUniformsForBuiltins();
ccGLBindTexture2D( getTexture()-&getName());
// Attributes
#define kQuadSize sizeof(m_sQuad.bl)
long offset = (long)&m_sQ
int diff = offsetof( ccV3F_C4B_T2F, vertices);
glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
// texCoods
diff = offsetof( ccV3F_C4B_T2F, texCoords);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
diff = offsetof( ccV3F_C4B_T2F, colors);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
CC_INCREMENT_GL_DRAWS(1);
--------------------------------
1. &GraySprite * gs = GraySprite::create(&01.png&);
剩下跟CCSprite一样, 设置位置, addChild等等
2. CCSprite * cs = CCSprite::create(&02.png&);
GraySprite::setGray(cs, 1); & //变灰
GraySprite::setGray(cs, 0); &//原色
-----------------------------
把GraySprte暴露出去, lua就可以调用, 很方便
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:76317次
积分:1114
积分:1114
排名:千里之外
转载:178篇
(1)(1)(5)(1)(1)(8)(3)(3)(16)(137)(2)(1)5834人阅读
Cocos2d-x学习笔记(30)
button.cpp
buttontest
#include &MyButtonScene.h&
#include &SimpleAudioEngine.h&
using namespace cocos2d;
using namespace CocosD
bool MyButton::init()
if(!CCLayer::init())
CCSize size=CCDirector::sharedDirector()-&getWinSize();
//获得屏幕的大小
CCMenuItemImage *menuImage1=CCMenuItemImage::create(&CloseNormal.png&, &CloseSelected.png&, this,menu_selector(MyButton::menuCloseCallback1));
menuImage1-&setPosition(ccp(CCDirector::sharedDirector()-&getWinSize().width-20,20));
CCMenu *menu=CCMenu::create(menuImage1,NULL);
menu-&setPosition(CCPointZero);
this-&addChild(menu,2);
CCSprite *nsprite=CCSprite::create(&HelloWorld.png&);
nsprite-&setPosition(ccp(size.width/2,size.height/2));
this-&addChild(nsprite,0);
//CCLabelTTF *pttf=CCLabelTTF::create(&hah&, &Thonburi&, 50);
//pttf-&setPosition(CCDirector::sharedDirector()-&getWinSize().width/2,120);
CCMenuItemFont *fontpttf=CCMenuItemFont::create(&pttf&,this,menu_selector(MyButton::menuCloseCallback1));
this-&addChild(fontpttf,1);
this-&setScale(0.5);
//实现横排列图标及透明度切换
for (int i=0; i&2; i++) {
CCMenuItemImage *menuImage2=CCMenuItemImage::create(&btn-about-normal.png&, &btn-about-selected.png&,this,menu_selector(MyButton::menuCloseCallback1));
CCMenuItemImage *menuImage3=CCMenuItemImage::create(&btn-highscores-normal.png&, &btn-highscores-selected.png&,this,menu_selector(MyButton::menuCloseCallback1));
CCMenuItemImage *menuImage4=CCMenuItemImage::create(&btn-play-normal.png&, &btn-play-selected.png&,menuImage2,menu_selector(MyButton::menuCloseCallback2));
menuImage2-&setTag(2); //添加标签,以便后期调用
menuImage2-&setEnabled(false);//设置按钮不可用
CCMenu *menu2=CCMenu::create(menuImage2,menuImage3,menuImage4,NULL);
CCSize size=CCDirector::sharedDirector()-&getWinSize();
menu2-&setPosition(ccp(size.width/4, size.height/4));
menu2-&alignItemsHorizontally();
menu2-&setOpacity(128);
//设置透明度
this-&addChild(menu2,1,100+i);
//实现图标的竖排排列
CCMenuItemImage *menuImage8=CCMenuItemImage::create(&btn-about-normal.png&, &btn-about-selected.png&,this,menu_selector(MyButton::menuCloseCallback3));
CCMenuItemImage *menuImage9=CCMenuItemImage::create(&btn-highscores-normal.png&, &btn-highscores-selected.png&,this,menu_selector(MyButton::menuCloseCallback4));
CCMenuItemImage *menuImage10=CCMenuItemImage::create(&btn-play-normal.png&, &btn-play-selected.png&,this,menu_selector(MyButton::menuCloseCallback5));
CCMenu *menu4=CCMenu::create(menuImage8,menuImage9,menuImage10,NULL);
menu4-&alignItemsVerticallyWithPadding(200);
//menu3-&setPosition(ccp()
menu4-&setTag(20);
this-&addChild(menu4,1);
//实现文字之间的切换(回调函数实现透明度的改变)
CCMenuItemFont::setFontSize(34);
CCMenuItemToggle *toggle= CCMenuItemToggle::createWithTarget(
menu_selector(MyButton::menuCloseCallback1),CCMenuItemFont::create(&on&),
CCMenuItemFont::create(&off&),
toggle-&setSelectedIndex(0);
toggle-&setPosition(ccp(size.width/4*3,size.height/4*3));
CCMenu *menu5=CCMenu::create(toggle,NULL);
this-&addChild(menu5,2);
//实现图片之间点击切换
CCMenuItemImage *image1=CCMenuItemImage::create(&btn-about-normal.png&, &btn-about-selected.png&);
CCMenuItemImage *image2=CCMenuItemImage::create(&btn-highscores-normal.png&, &btn-highscores-selected.png&);
CCMenuItemImage *image3=CCMenuItemImage::create(&btn-play-normal.png&, &btn-play-selected.png&);
CCMenuItemToggle *togglee=CCMenuItemToggle::createWithTarget(this,
menu_selector(MyButton::menuCallback),
CCMenu *ccmenuu=CCMenu::create(togglee,NULL);
//实现三者之间的顺序切换
ccmenuu-&setPosition(ccp(CCDirector::sharedDirector()-&getWinSize().width/2-120,CCDirector::sharedDirector()-&getWinSize().height/2));
this-&addChild(ccmenuu,2);
//精灵相关
int idx=(int )(CCRANDOM_0_1()*);
//CCRANDOM_0_1()为系统定义的宏,实现产生0-1之间的随机数
int x=(idx%5)*85;
int y= (idx/5)*121;
CCSprite *sprite=CCSprite::create(&grossini_dance_atlas.png&,CCRectMake(x, y, 85, 121));
//从图片中截取部分,构成精灵
this-&addChild(sprite,2);
sprite-&setPosition(ccp(size.width/2+70,size.height/2));
CCActionInterval *newaction=CCMoveTo::create(13,ccp(size.width/2-120,size.height/2));
//设置动作,移动到指定位置
sprite-&runAction(CCRepeatForever::create(newaction));
//执行动作
setTouchEnabled(true);
//设置接收触摸事件
CCSpriteBatchNode *batchsprite=CCSpriteBatchNode::create(&grossini_dance_atlas.png&, 50);
//设置精灵批处理,预计产生50个精灵
this-&addChild(batchsprite,2,11);
batchsprite-&setPosition(ccp(size.width/2,size.height/2));
CCSprite *sprite1=CCSprite::createWithTexture(batchsprite-&getTexture(),CCRectMake(x, y, 85, 121));
CCSprite *sprite2=CCSprite::createWithTexture(batchsprite-&getTexture(),CCRectMake(0, 0, 85, 121));
this-&addChild(sprite1);
this-&addChild(sprite2);
sprite2-&setPosition(ccp(size.width/2, size.height/2));
//sprite1-&
CCActionInterval*
float random = CCRANDOM_0_1();
if( random & 0.20 )
action = CCScaleBy::create(3, 2);
else if(random & 0.40)
action = CCRotateBy::create(3, 360);
else if( random & 0.60)
action = CCBlink::create(1, 3);
else if( random & 0.8 )
action = CCTintBy::create(2, 0, -255, -255);
action = CCFadeOut::create(2);
//sprite1-&runAction(action);
CCFiniteTimeAction *actionback=CCSequence::create(action,action-&reverse(),NULL);
//设置动作集合,顺序依次执行
sprite1-&runAction(CCRepeat::create(actionback,6));
//重复6次执行动作
CCActionInterval* action1=CCFadeIn::create(2);
CCActionInterval* action2=CCJumpTo::create(2, CCPointMake(300, 0), 80, 5);
sprite1-&runAction(CCSequence::create(action1,action1-&reverse(),NULL));
sprite2-&runAction(CCRepeatForever::create(action2));
CCSprite *sprite3=CCSprite::create(&grossini_dance_atlas.png&,CCRectMake(0, 0, 85, 121));
addChild(sprite3);
CCPointArray *array=CCPointArray::create(20);
//创建点集合
array-&addControlPoint(ccp(0,0));
array-&addControlPoint(ccp(size.width/2-30,0));
array-&addControlPoint(ccp(size.width/2-30,size.height-80));
array-&addControlPoint(ccp(0,size.height-80));
array-&addControlPoint(ccp(0,0));
CCCardinalSplineBy *action3=CCCardinalSplineBy::create(3 ,array, 2);
//在三秒内在这几个点之间来回,最后一个参数为张力,1为正方形,大于1为内陷的正方形,小于1为外凸的正方形(内陷外凸是针对直线来说的)
CCActionInterval *reverserv=action3-&reverse();
CCFiniteTimeAction *seq=CCSequence::create(action3,reverserv,NULL);
sprite3-&runAction(CCRepeat::create(seq,5));
CCSprite *sprite4=CCSprite::create(&grossini_dance_atlas.png&,CCRectMake(0, 0, 85, 121));
addChild(sprite4,2);
CCAction *action4=CCSpawn::create(CCJumpBy::create(9,CCPointMake(300, 0) ,50 , 50),CCRotateBy::create(9, 720),NULL);//动作集合,同时执行
sprite4-&runAction(action4);
void MyButton::menuCallback(CCLayer *pSender)
void MyButton::menuCloseCallback1(CCLayer *pSender)
CCMenu* menu = (CCMenu*)(((CCNode*)(pSender))-&getParent());
GLubyte opacity = menu-&getOpacity();
if( opacity == 128 )
menu-&setOpacity(255);
menu-&setOpacity(128);
void MyButton::menuCloseCallback2(CCLayer *pSender)
CCMenuItemImage *image=(CCMenuItemImage*)pSender-&getParent()-&getChildByTag(2);
if(image-&isEnabled())
image-&setEnabled(false);
image-&setEnabled(true);
void MyButton::menuCloseCallback3(CCLayer *pSender)
float kwidth=pSender-&getScale();
if(kwidth&=1.0)
pSender-&setScale(2*kwidth);
pSender-&setScale(kwidth/2);
void MyButton::menuCloseCallback4(CCLayer *pSender)
float tmpskew=pSender-&getSkewX();
if(tmpskew==0)
pSender-&setSkewX(-45);
pSender-&setSkewX(45);
// pSender-&setSkewY(0);
void MyButton::menuCloseCallback5(CCLayer *pSender)
CCMenuItemFont *newfont=CCMenuItemFont::create(&点击继续&,(CCMenu*)pSender-&getParent(),menu_selector(MyButton::menuCloseCallback6) );
newfont-&setColor(ccc3(255, 0, 0));
newfont-&setPosition(ccp(CCDirector::sharedDirector()-&getWinSize().width/2,CCDirector::sharedDirector()-&getWinSize().height/2));
CCMenu *newmenu=CCMenu::create(newfont,NULL);
this-&addChild(newmenu,3);
CCMenu *menu=(CCMenu*)pSender-&getParent();
menu-&setEnabled(false);
menu-&setOpacity(128);
void MyButton::menuCloseCallback6(CCLayer *pSender)
CCMenuItemFont *font=(CCMenuItemFont*)pS
//font-&setColor(ccc3(255, 255, 255));
CCMenu *clicked=(CCMenu*)this-&getParent()-&getChildByTag(20);
clicked-&setOpacity(255);
clicked-&setEnabled(true);
font-&setVisible(false);
//CCDirector::sharedDirector()-&resume();
CCScene* MyButton::scene()
CCScene *scene=CCScene::create();
CCLayer *layer=MyButton::create();
scene-&addChild(layer);
void MyButton::menuCloseCallback(cocos2d::CCLayer *pSender)
CCDirector::sharedDirector()-&end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
CCLog(&点击过了&);
bool mySprite::init()
CCSize size=CCDirector::sharedDirector()-&getWinSize();
int idx=(int )(CCRANDOM_0_1()*);
int x=(idx%5)*85;
int y= (idx/5)*121;
CCSprite *sprite=CCSprite::create(&grossini_dance_atlas.png&,CCRectMake(x, y, 85, 121));
this-&addChild(sprite,2);
sprite-&setPosition(ccp(size.width/2,size.height/2));
//欢迎转载,转载请注明出处:
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:266313次
积分:3212
积分:3212
排名:第9552名
原创:57篇
转载:18篇
评论:62条
(2)(1)(1)(1)(2)(1)(3)(1)(3)(3)(5)(2)(11)(6)(6)(8)(4)(5)(11)cocos2d-x 关于旋转和移动的一点小技巧 - 推酷
cocos2d-x 关于旋转和移动的一点小技巧
你犯困吗,恩,给你讲个笑话提提神~
一對情侶去從林遊玩,被食人族捉住。食人族首領心情很好,說你們如果想活命,就吃掉對方的大便。在他們回來的路上,女人終於忍不住停下,坐到石頭上哭起來。男人摟住她的肩膀。女人別過臉去,幽幽的說:你不愛我,要不然剛才你不會拉這麼多。
(能呵呵吗?)
================================================================================
一般在游戏中我们避免不了处理旋转或者子弹发射什么的, 就比如塔防游戏来说吧,我们需要判断敌人往哪里走,炮塔就往哪里转,转完然后朝着一个方向发射子弹 (
是一个方向而不是朝一个点,就比如保卫萝卜,子弹穿过怪物继续朝那个方向飞行,直到飞往屏幕外才移除),
下面来简单分析一下实现的过程,需要涉及到一点点平面向量的数学知识。
(注意匀速)
1. 旋转 : 朝着某个点的方向匀速旋转
2.发射:让子弹朝着某个点的方向匀速移动
我们来分步骤实现,先实现旋转功能:
嗯,现在假设平面中有点A和点B,A是炮塔,B是敌人,现在我们需要让炮塔A的方向朝着敌人B旋转,因为炮塔放置的时候方向向上,所以
我们要旋转的角度为α
现在首先,我们创建敌人和塔
auto enemy = Sprite::create(&enemy.png&);
enemy-&setPostion(Point(100,200));
this-&addChild(enemy);
auto tower = Sprite::create(&tower.png&);
tower-&setPostion(Point(200,100));
this-&addChild(tower);
我们让塔旋转瞄准敌人,
只是为了能射它一脸(呵呵?)
//让塔的方向旋转对准敌人
//射击方向向量
Point shootVector = enemy-&getPosition() - tower-&getPosition();
//向量标准化(即向量长度为1)
Point normalizedVector = ccpNormalize(shootVector) ;
//算出旋转的弧度
float radians = atan2(normalizedVector.y, - normalizedVector.x);
//将弧度转换成角度
float degree = CC_RADIANS_TO_DEGREES(radians);
//匀速旋转需要我们设置一下速度,这里假设旋转速度为 2π (rad/s)
float rotateSpeed = 2 * M_PI;
//那么旋转1弧度所用时间为
float rotate_1rad_time = 1 / rotateS
//所以旋转的时长为
float rotateDuration = fabs(radians * rotate_1rad_time);
//最后执行旋转
_sprite-&runAction(RotateTo::create(rotateDuration,degree- 90));
需要 注意一下
(1)假设点A为塔,B为敌。 则 向量 &shootVector = OB -OA = AB &
(2)atan2(y,x)是就是反正切函数, 算出的是 &点(x,y)与x轴正方向的夹角,返回的是角的弧度值
(3)所以degree算出的角度其实是与x轴正方向的夹角
(4)由于炮塔方向向上,所以 &【旋转的角度 &α 】= degree - 90
如果你想不起来什么是反正切,那没关系,看下面假设和图 (再想不起来我只能呵呵了)
假设&tan(α) = y / x , 则有&α = arctan(y / x)
旋转完后接下来我们再实现射击功能:
假设有塔,子弹和敌人,位置如图,我们需要
把子弹由位置A沿着AB方向 匀速射到C(C点在屏幕外)
我们先创建敌人,塔和子弹
auto enemy = Sprite::create(&enemy.png&);
enemy-&setPostion(Point(100,200));
this-&addChild(enemy);
auto tower = Sprite::create(&tower.png&);
tower-&setPostion(Point(200,100));
this-&addChild(tower);
//子弹,和塔在一个位置
auto tower = Sprite::create(&bullet.png&);
tower-&setPostion(Point(200,100));
this-&addChild(tower);
然后这次我们真的射它一脸
(再次呵呵)
//射击方向向量
Point shootVector = enemy-&getPosition() - bullet-&getPosition();
//向量标准化(即向量长度为1)
Point normalizedVector = ccpNormalize(shootVector);
//移动长度向量
Point overShootVector = normalizedVector * 900;
//超出屏幕的点
Point offScreenPoint = bullet-&getPosition() + overShootV
//假设速度为500(pix/s)
float moveSpeed = 500;
//移动时间
float moveDuration = overShootVector / moveS
//执行设计
auto move = MoveTo::create(moveDuration,offScreenPoint);
CallFunc* moveDone = CallFunc::create(CC_CALLBACK_0(shootFinish,this,bullet));
bullet-&runAction(Sequence::create(move,moveDone,NULL));
射击结束后移除子弹
//射击结束后移除
void HelloWorld::shootFinish(Node* pNode){
Sprite* bullet = (Sprite*)pN
if(bullet != NULL)
bullet-&stopAllActions();
this-&removeChild(bullet);
稍稍解释一下 :
(1)shootVector就是向量AB。
(2)overShootVector = (AB向量标准化)& 900 即得到 &AC。比如说你设置的分辨率为 800 x 400 ,那么你可以用
标准化向量 & 你最大分辨率再大一点,这样子向量就会超出屏幕之外而且长度又固定。
(3)然后根据向量OC = OA + AC , 算出要移动到的点 offScreenPoint(即点C)。
(4)设置一下速度,长度一定了,所以时间 = 长度 / 速度 。
=====================================================
其实也没啥东西,纯属小白教程。。
转载请注明出处:http://blog.csdn.net/shun_fzll/article/details/
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致2782人阅读
1.将gif图片用PS打开
2.文件-》导出-》渲染视频-》。。。
3.然后你就看懂了。。。
偷一些gif动画做游戏素材也是极好的
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1500662次
积分:18978
积分:18978
排名:第455名
原创:80篇
转载:1878篇
评论:110条
(1)(1)(24)(16)(43)(27)(7)(54)(12)(48)(18)(13)(6)(4)(64)(2)(1)(3)(28)(56)(51)(59)(16)(44)(12)(4)(84)(70)(60)(84)(63)(14)(10)(68)(73)(84)(10)(9)(44)(91)(41)(116)(153)(180)(101)(3)

我要回帖

更多关于 双位置初始对准 的文章

 

随机推荐