怎样制作基于cocos2d x官网-x的SLG游戏

怎样制作基于Cocos2d-x的SLG游戏-第6章 - 为程序员服务
为程序员服务
推荐团队博客
最近更新博客
怎样制作基于Cocos2d-x的SLG游戏-第6章
文章目录原创:
怎样制作基于Cocos2d-x的SLG游戏-第1章
怎样制作基于Cocos2d-x的SLG游戏-第2章
怎样制作基于Cocos2d-x的SLG游戏-第3章
怎样制作基于Cocos2d-x的SLG游戏-第4章
怎样制作基于Cocos2d-x的SLG游戏-第5章
怎样制作基于Cocos2d-x的SLG游戏-第6章
怎样制作基于Cocos2d-x的SLG游戏-第7章
前篇教程中我们已经创建好了播种界面,而本章我们将继续对单独的瓦片进行操作,完成在土地上播种的功能,同时我们将添加其他类似的界面来操作瓦片,如:清理界面(可以将树木、房屋等等从地图中清除),收获界面(收获成熟的农作物)等等。
再次说明,由于模拟经营类游戏的操作多样性,本系列教程将不会尽善尽美的实现整个SLG游戏的所有功能,这里只选取其中有代表的一些功能来实现,有兴趣的同学欢迎在本游戏的基础上进行扩展。本游戏最终将要实现的功能是这样的:
点击商品项和其他障碍物所在层(这里统称第2层)上的瓦片,将出现一个清理界面,该界面上有一把叉子,玩家点击叉子可将点击的瓦片从地图中移除,不过点击土块系瓦片除外。
点击空土块瓦片将出现上节中创建的播种界面,玩家选取播种层中的农作物选项,就可以在土块上栽种相应的种子。
种子种下去的同时,该处瓦片上将会生成一个计时面板,用于纪录种子多久后成熟。如果该处瓦片再次处于未选中状态,那这个计时面板将会隐藏起来,直到种子完全成熟后该处的计时界面才会被销毁。
种子成熟后,瓦片上的农作物将会变为相应的成熟作物。如果这时选中这些成熟的作物,那么将出现一个收获界面。收取作物后瓦片又将变为什么都没有的空土块。
以上就是对单独瓦片进行操作的全部功能,后面我们将会一一实现。
已经创建好播种界面,所以我们接下来首先来实现播种这项功能。
1、 根据游戏功能需求,定义如下的一个枚举类型来标示玩家所点击的瓦片类型:
typedef enum // 定义瓦片类型。如果需要扩展,可这这里定义更多类型。
GROUD = 1,
GROUD_CROP = 2,
CROP_HARVEST,
2、 接着在玩家开始触碰屏幕的地方(既onTouchesBegan函数中)判断所触碰瓦片的类型。如下,在onTouchesBegan函数的if (gid != 0)中添加以下一段代码:
switch (gid)
case 9: // 触碰到的是空土块
tileType = TileType::GROUD;
// 触碰到的是种了农作物幼苗的土块
tileType = TileType::GROUD_CROP;
// 触碰到种植有成熟农作物的土块
tileType = TileType::CROP_HARVEST;
// 其他情况,也就是可以被清除的其他瓦片类型
tileType = TileType::OTHER;
以上代码中的gid对应了下图中的瓦片项。
3、 当玩家松开手指的时候,创建播种界面。
在onTouchesEnded函数的if(press)中添加如下的代码:
if(tileType == GROUD)
auto panel = SeedChooseLayer::create();
panel-&setPosition(screenPos);
this-&addChild(panel, 10, SEEDPANEL_TAG);
其中SEEDPANEL_TAG是播种界面的标示,我们可以用它来判断播种界面是否存在,是否移除该界面等操作。其他界面也同样有着自己的标示,如下所示:
#define SEEDPANEL_TAG
#define HARVESTPANEL_TAG
#define REMOVEPANEL_TAG
4、 创建播种界面后,我们就该播种了。
不过首先请打开文件,我们来整理下瓦片层:在最底层的地图层上只放置草地瓦片,在草地层之上的层用来放置障碍物和商品项,最上层置空,用来设置提醒项。同时,修改之前的图层名字,规范代码逻辑(不然以后自己都看不懂自己写的什么),如下图所示:
打开游戏主场景GameScene,添加update函数,并实现它。如下所示:
void GameScene::update(float dt)
// 通过标示得到场景中的子节点
auto seedPanel = this-&getChildByTag(SEEDPANEL_TAG);
// 判断瓦片是否为空土块,并且是否已经创建好了播种界面
if(tileType == GROUD && seedPanel!= NULL)
// 得到选择的农作物类型
auto type = ((SeedChooseLayer*)seedPanel)-&getCurrType();
// 根据农作物类型种植相应的农作物
switch (type)
case WHEAT:
map-&getLayer("goodsLayer")-&setTileGID(18, touchObjectPos);
this-&removeChild(seedPanel);
case CORN:
map-&getLayer("goodsLayer")-&setTileGID(20, touchObjectPos);
this-&removeChild(seedPanel);
case CARROT:
map-&getLayer("goodsLayer")-&setTileGID(22, touchObjectPos);
this-&removeChild(seedPanel);
不要忘了在init函数中加上scheduleUpdate(),这样才会每一帧都调用update()。
5、 当玩家触摸到屏幕其他地方时,一定要把已有的播种界面清除,以确保场景中最多只有一个播种界面。所以回到onTouchesBegan函数中,清除已有播种界面。
auto seedPanel = this-&getChildByTag(SEEDPANEL_TAG);
if(seedPanel){
this-&removeChild(seedPanel);
现在运行我们的代码,就可以像下图一样在土地上播种庄稼了。
接下来我们创建一个清理界面,用来移除除土块以外的其他瓦片。它同播种界面原理一样,其定义如下:
class RemoveLayer: public Layer
virtual bool init()
bool onTouchBegan(Touch *touch, Event *event);
CREATE_FUNC(RemoveLayer);
CC_SYNTHESIZE(bool, remove, Remove);
该界面只有一个叉子供玩家选择,所以我们用布尔类型的变量来标示玩家是否选中它。其事件回调函数代码如下:
bool RemoveLayer::onTouchBegan(Touch *touch, Event *event)
auto target = static_cast&Sprite*&(event-&getCurrentTarget());
Point locationInNode = target-&convertTouchToNodeSpace(touch);
Size size = target-&getContentSize();
Rect rect = Rect(0, 0, size.width, size.height);
if (rect.containsPoint(locationInNode))
target-&setOpacity(180);
// 判断是否选中叉子
if (target == fork)
实现了清理界面后,按照创建和销毁播种界面的思路把清理界面添加到游戏场景中,既在onTouchesEnded中创建清理面板,在onTouchesBegan中销毁该清理面板,并在update函数中检测更新:
if(NULL != removePanel && tileType == OTHER)
if(((RemoveLayer*)removePanel)-&getRemove() == true)
map-&getLayer("goodsLayer")-&removeTileAt(touchObjectPos);
this-&removeChild(removePanel);
这样一来,我们就可以移除地图中的看不顺眼的瓦片了。
运行游戏,当前效果如下图所示:
此时点击长有幼苗的土块,将会出现一个记录庄稼成熟时间的面板出现,当时间到时,庄稼将会成熟。这个时候如果再点击庄稼,玩家就可以所获它了。
由于计时面板的创建有别于其他小界面的创建,所以这里我们先跳过这一步,先来创建收获面板。
收获界面同清理界面基本是一致的,它将会在庄稼成熟的时候被创建,其定义如下:
class HarvestLayer: public Layer
virtual bool init()
bool onTouchBegan(Touch *touch, Event *event);
CREATE_FUNC(HarvestLayer);
CC_SYNTHESIZE(bool, harvest, Harvest);
Sprite* harvestS
变量harvest用来标示玩家是否选中收获项,HarvestLayer的实现很简单,这里就不赘述了。
本章所用资源已更新,可进行下载,文章中的源代码将在本系列教程结束时上传,敬请期待。
相关文章推荐:cocos2d-x三国策略战争游戏源码
dotawar-master
SceneSetting.cpp
AppController.mm
RootViewController.mm
constraints
constraints
CMakeLists.txt
chipmunk-docs.html
LICENSE.txt
README.txt
base_nodes
draw_nodes
CMakeLists.txt
keypad_dispatcher
label_nodes
layers_scenes_transitions_nodes
menu_nodes
misc_nodes
particle_nodes
Simulation
AccelerometerDelegateWrapper.mm
CCAccelerometer.mm
CCApplication.mm
CCCommon.mm
CCDevice.mm
CCDirectorCaller.mm
CCEGLView.mm
CCFileUtilsIOS.mm
CCImage.mm
CCThread.mm
EAGLView.mm
third_party
script_support
sprite_nodes
data_support
image_support
user_default
CCUserDefault.mm
zip_support
text_input_node
tilemap_parallax_nodes
touch_dispatcher
CocosDenshion
SimpleAudioEngine.mm
CocosDenshion.xcodeproj
project.pbxproj
extensions
AssetsManager
Components
CCControlExtension
CCEditBoxImplIOS.mm
CCEditBoxImplMac.mm
CCScrollView
LocalStorage
physics_nodes
libwebsockets
cocos2dx_support
CCLuaObjcBridge.mm
AudioEngine.lua
CCBReaderLoad.lua
ActorsPack1.plist
ActorsPack1.png
CloseNormal.png
CloseSelected.png
Default.png
fps_images-hd.png
fps_images-ipadhd.png
fps_images.png
GameDate.plist
GameUI01.plist
GameUI01.png
GameUI02.plist
GameUI02.png
grass_ground.png
health_bar_green.png
health_bar_red.png
HelloWorld.png
Icon-72.png
Icon-Small-50.png
Icon-Small.png
Icon-Small@2x.png
Icon@2x.png
Info.plist
iTunesArtwork
Level0.tmx
actorData.lua
Prefix.pch
涓夊浗war.xcodeproj
project.xcworkspace
xcshareddata
涓夊浗war.xccheckout
xcuserdata
ericwang.xcuserdatad
UserInterfaceState.xcuserstate
sev.xcuserdatad
UserInterfaceState.xcuserstate
contents.xcworkspacedata
xcuserdata
ericwang.xcuserdatad
xcschememanagement.plist
涓夊浗war.xcscheme
sev.xcuserdatad
xcdebugger
Breakpoints_v2.xcbkptlist
xcschememanagement.plist
涓夊浗war.xcscheme
project.pbxproj
Level0.tmx
dotawar-master
._AppController.mm
._RootViewController.mm
constraints
._constraints
._chipmunk
constraints
._CMakeLists.txt
._constraints
._chipmunk-docs.html
._LICENSE.txt
._README.txt
base_nodes
draw_nodes
._ChangeLog
._CMakeLists.txt
keypad_dispatcher
label_nodes
layers_scenes_transitions_nodes
menu_nodes
misc_nodes
particle_nodes
Simulation
._AccelerometerDelegateWrapper.mm
._CCAccelerometer.mm
._CCApplication.mm
._CCCommon.mm
._CCDevice.mm
._CCDirectorCaller.mm
._CCEGLView.mm
._CCFileUtilsIOS.mm
._CCImage.mm
._CCThread.mm
._EAGLView.mm
._Simulation
third_party
._libraries
._third_party
script_support
sprite_nodes
data_support
image_support
user_default
._CCUserDefault.mm
zip_support
._component
._data_support
._image_support
._tinyxml2
._user_default
._zip_support
text_input_node
tilemap_parallax_nodes
touch_dispatcher
._base_nodes
._draw_nodes
._keypad_dispatcher
._label_nodes
._layers_scenes_transitions_nodes
._menu_nodes
._misc_nodes
._particle_nodes
._platform
._script_support
._sprite_nodes
._textures
._text_input_node
._tilemap_parallax_nodes
._touch_dispatcher
CocosDenshion
._SimpleAudioEngine.mm
CocosDenshion.xcodeproj
._project.pbxproj
._CocosDenshion.xcodeproj
._proj.ios
extensions
AssetsManager
Components
CCControlExtension
._CCEditBoxImplIOS.mm
._CCEditBoxImplMac.mm
CCScrollView
._CCControlExtension
._CCEditBox
._CCScrollView
LocalStorage
physics_nodes
._AssetsManager
._CCBReader
._Components
._LocalStorage
._physics_nodes
libwebsockets
cocos2dx_support
._CCLuaObjcBridge.mm
._platform
._AudioEngine.lua
._CCBReaderLoad.lua
._cocos2dx_support
._chipmunk
._cocos2dx
._CocosDenshion
._extensions
._libwebsockets
._ActorsPack1.plist
._ActorsPack1.png
._CloseNormal.png
._CloseSelected.png
._Default.png
._fps_images-hd.png
._fps_images-ipadhd.png
._fps_images.png
._GameDate.plist
._GameUI01.plist
._GameUI01.png
._GameUI02.plist
._GameUI02.png
._grass_ground.png
._health_bar_green.png
._health_bar_red.png
._HelloWorld.png
._Icon-72.png
._Icon-Small-50.png
._Icon-Small.png
._Icon-Small@2x.png
._Icon.png
._Icon@2x.png
._Info.plist
._iTunesArtwork
._Level0.tmx
._actor.lua
._actorData.lua
._Prefix.pch
._Resources
涓夊浗war.xcodeproj
project.xcworkspace
xcshareddata
._涓夊浗war.xccheckout
xcuserdata
sev.xcuserdatad
._UserInterfaceState.xcuserstate
._sev.xcuserdatad
._contents.xcworkspacedata
._xcshareddata
._xcuserdata
xcuserdata
sev.xcuserdatad
xcdebugger
._Breakpoints_v2.xcbkptlist
._xcschememanagement.plist
._涓夊浗war.xcscheme
._xcdebugger
._xcschemes
._sev.xcuserdatad
._project.xcworkspace
._xcuserdata
._.DS_Store
._Level0.tmx
._README.md
._涓夊浗war
._涓夊浗war.xcodeproj
._dotawar-master
源代码说明.txt
/****************************************************************************
Copyright 2012 cocos2d-x.org
Copyright 2011 Jeff Lamarche
Copyright 2012 Goffredo Marocchi
Copyright 2012 Ricardo Quesada
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the &Software&), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED &AS IS&, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN false EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include &CCDirector.h&
#include &CCGLProgram.h&
#include &ccGLStateCache.h&
#include &ccMacros.h&
#include &platform/CCFileUtils.h&
#include &support/data_support/uthash.h&
#include &cocoa/CCString.h&
#include &kazmath/GL/matrix.h&
#include &kazmath/kazmath.h&
NS_CC_BEGIN
typedef struct _hashUniformEntry
// hash entry
} tHashUniformE
CCGLProgram::CCGLProgram()
: m_uProgram(0)
, m_uVertShader(0)
, m_uFragShader(0)
, m_pHashForUniforms(NULL)
, m_bUsesTime(false)
memset(m_uUniforms, 0, sizeof(m_uUniforms));
CCGLProgram::~CCGLProgram()
CCLOGINFO(&cocos2d: %s %d deallocing 0x%X&, __FUNCTION__, __LINE__, this);
// there is no need to delete the shaders. They should have been already deleted.
CCAssert(m_uVertShader == 0, &Vertex Shaders should have been already deleted&);
CCAssert(m_uFragShader == 0, &Fragment Shaders should have been already deleted&);
if (m_uProgram)
ccGLDeleteProgram(m_uProgram);
tHashUniformEntry *current_element, *
// Purge uniform hash
HASH_ITER(hh, m_pHashForUniforms, current_element, tmp)
HASH_DEL(m_pHashForUniforms, current_element);
free(current_element-&value);
free(current_element);
bool CCGLProgram::initWithVertexShaderByteArray(const GLchar* vShaderByteArray, const GLchar* fShaderByteArray)
m_uProgram = glCreateProgram();
CHECK_GL_ERROR_DEBUG();
m_uVertShader = m_uFragShader = 0;
if (vShaderByteArray)
if (!compileShader(&m_uVertShader, GL_VERTEX_SHADER, vShaderByteArray))
CCLOG(&cocos2d: ERROR: Failed to compile vertex shader&);
// Create and compile fragment shader
if (fShaderByteArray)
if (!compileShader(&m_uFragShader, GL_FRAGMENT_SHADER, fShaderByteArray))
CCLOG(&cocos2d: ERROR: Failed to compile fragment shader&);
if (m_uVertShader)
glAttachShader(m_uProgram, m_uVertShader);
CHECK_GL_ERROR_DEBUG();
if (m_uFragShader)
glAttachShader(m_uProgram, m_uFragShader);
m_pHashForUniforms = NULL;
CHECK_GL_ERROR_DEBUG();
bool CCGLProgram::initWithVertexShaderFilename(const char* vShaderFilename, const char* fShaderFilename)
const GLchar * vertexSource = (GLchar*) CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()-&fullPathForFilename(vShaderFilename).c_str())-&getCString();
const GLchar * fragmentSource = (GLchar*) CCString::createWithContentsOfFile(CCFileUtils::sharedFileUtils()-&fullPathForFilename(fShaderFilename).c_str())-&getCString();
return initWithVertexShaderByteArray(vertexSource, fragmentSource);
const char* CCGLProgram::description()
return CCString::createWithFormat(&&CCGLProgram = &
CC_FORMAT_PRINTF_SIZE_T
& | Program = %i, VertexShader = %i, FragmentShader = %i&&,
(size_t)this, m_uProgram, m_uVertShader, m_uFragShader)-&getCString();
bool CCGLProgram::compileShader(GLuint * shader, GLenum type, const GLchar* source)
if (!source)
const GLchar *sources[] = {
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32 && CC_TARGET_PLATFORM != CC_PLATFORM_LINUX && CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
(type == GL_VERTEX_SHADER ? &p\n& : &pre\n&),
&uniform mat4 CC_PM\n&
&uniform mat4 CC_MVM\n&
&uniform mat4 CC_MVPM\n&
&uniform vec4 CC_T\n&
&uniform vec4 CC_SinT\n&
&uniform vec4 CC_CosT\n&
&uniform vec4 CC_Random01;\n&
&//CC INCLUDES END\n\n&,
*shader = glCreateShader(type);
glShaderSource(*shader, sizeof(sources)/sizeof(*sources), sources, NULL);
glCompileShader(*shader);
glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
if (! status)
glGetShaderiv(*shader, GL_SHADER_SOURCE_LENGTH, &length);
GLchar* src = (GLchar *)malloc(sizeof(GLchar) * length);
glGetShaderSource(*shader, length, NULL, src);
CCLOG(&cocos2d: ERROR: Failed to compile shader:\n%s&, src);
if (type == GL_VERTEX_SHADER)
CCLOG(&cocos2d: %s&, vertexShaderLog());
CCLOG(&cocos2d: %s&, fragmentShaderLog());
free(src);
return (status == GL_TRUE);
void CCGLProgram::addAttribute(const char* attributeName, GLuint index)
glBindAttribLocation(m_uProgram, index, attributeName);
void CCGLProgram::updateUniforms()
m_uUniforms[kCCUniformPMatrix] = glGetUniformLocation(m_uProgram, kCCUniformPMatrix_s);
m_uUniforms[kCCUniformMVMatrix] = glGetUniformLocation(m_uProgram, kCCUniformMVMatrix_s);
m_uUniforms[kCCUniformMVPMatrix] = glGetUniformLocation(m_uProgram, kCCUniformMVPMatrix_s);
m_uUniforms[kCCUniformTime] = glGetUniformLocation(m_uProgram, kCCUniformTime_s);
m_uUniforms[kCCUniformSinTime] = glGetUniformLocation(m_uProgram, kCCUniformSinTime_s);
m_uUniforms[kCCUniformCosTime] = glGetUniformLocation(m_uProgram, kCCUniformCosTime_s);
m_bUsesTime = (
m_uUniforms[kCCUniformTime] != -1 ||
m_uUniforms[kCCUniformSinTime] != -1 ||
m_uUniforms[kCCUniformCosTime] != -1
m_uUniforms[kCCUniformRandom01] = glGetUniformLocation(m_uProgram, kCCUniformRandom01_s);
m_uUniforms[kCCUniformSampler] = glGetUniformLocation(m_uProgram, kCCUniformSampler_s);
this-&use();
// Since sample most probably won't change, set it to 0 now.
this-&setUniformLocationWith1i(m_uUniforms[kCCUniformSampler], 0);
bool CCGLProgram::link()
CCAssert(m_uProgram != 0, &Cannot link invalid program&);
GLint status = GL_TRUE;
glLinkProgram(m_uProgram);
if (m_uVertShader)
glDeleteShader(m_uVertShader);
if (m_uFragShader)
glDeleteShader(m_uFragShader);
m_uVertShader = m_uFragShader = 0;
glGetProgramiv(m_uProgram, GL_LINK_STATUS, &status);
if (status == GL_FALSE)
CCLOG(&cocos2d: ERROR: Failed to link program: %i&, m_uProgram);
ccGLDeleteProgram(m_uProgram);
m_uProgram = 0;
return (status == GL_TRUE);
void CCGLProgram::use()
ccGLUseProgram(m_uProgram);
const char* CCGLProgram::logForOpenGLObject(GLuint object, GLInfoFunction infoFunc, GLLogFunction logFunc)
GLint logLength = 0, charsWritten = 0;
infoFunc(object, GL_INFO_LOG_LENGTH, &logLength);
if (logLength & 1)
char *logBytes = (char*)malloc(logLength);
logFunc(object, logLength, &charsWritten, logBytes);
CCString* log = CCString::create(logBytes);
free(logBytes);
return log-&getCString();
const char* CCGLProgram::vertexShaderLog()
return this-&logForOpenGLObject(m_uVertShader, (GLInfoFunction)&glGetShaderiv, (GLLogFunction)&glGetShaderInfoLog);
const char* CCGLProgram::fragmentShaderLog()
return this-&logForOpenGLObject(m_uFragShader, (GLInfoFunction)&glGetShaderiv, (GLLogFunction)&glGetShaderInfoLog);
const char* CCGLProgram::programLog()
return this-&logForOpenGLObject(m_uProgram, (GLInfoFunction)&glGetProgramiv, (GLLogFunction)&glGetProgramInfoLog);
// Uniform cache
bool CCGLProgram::updateUniformLocation(GLint location, GLvoid* data, unsigned int bytes)
if (location & 0)
bool updated =
tHashUniformEntry *element = NULL;
HASH_FIND_INT(m_pHashForUniforms, &location, element);
if (! element)
element = (tHashUniformEntry*)malloc( sizeof(*element) );
element-&location =
element-&value = malloc( bytes );
memcpy(element-&value, data, bytes );
HASH_ADD_INT(m_pHashForUniforms, location, element);
if (memcmp(element-&value, data, bytes) == 0)
memcpy(element-&value, data, bytes);
GLint CCGLProgram::getUniformLocationForName(const char* name)
CCAssert(name != NULL, &Invalid uniform name& );
CCAssert(m_uProgram != 0, &Invalid operation. Cannot get uniform location when program is not initialized&);
return glGetUniformLocation(m_uProgram, name);
void CCGLProgram::setUniformLocationWith1i(GLint location, GLint i1)
bool updated =
updateUniformLocation(location, &i1, sizeof(i1)*1);
if( updated )
glUniform1i( (GLint)location, i1);
void CCGLProgram::setUniformLocationWith2i(GLint location, GLint i1, GLint i2)
GLint ints[2] = {i1,i2};
bool updated =
updateUniformLocation(location, ints, sizeof(ints));
if( updated )
glUniform2i( (GLint)location, i1, i2);
void CCGLProgram::setUniformLocationWith3i(GLint location, GLint i1, GLint i2, GLint i3)
GLint ints[3] = {i1,i2,i3};
bool updated =
updateUniformLocation(location, ints, sizeof(ints));
if( updated )
glUniform3i( (GLint)location, i1, i2, i3);
void CCGLProgram::setUniformLocationWith4i(GLint location, GLint i1, GLint i2, GLint i3, GLint i4)
GLint ints[4] = {i1,i2,i3,i4};
bool updated =
updateUniformLocation(location, ints, sizeof(ints));
if( updated )
glUniform4i( (GLint)location, i1, i2, i3, i4);
void CCGLProgram::setUniformLocationWith2iv(GLint location, GLint* ints, unsigned int numberOfArrays)
bool updated =
updateUniformLocation(location, ints, sizeof(int)*2*numberOfArrays);
if( updated )
glUniform2iv( (GLint)location, (GLsizei)numberOfArrays, ints );
void CCGLProgram::setUniformLocationWith3iv(GLint location, GLint* ints, unsigned int numberOfArrays)
bool updated =
updateUniformLocation(location, ints, sizeof(int)*3*numberOfArrays);
if( updated )
glUniform3iv( (GLint)location, (GLsizei)numberOfArrays, ints );
void CCGLProgram::setUniformLocationWith4iv(GLint location, GLint* ints, unsigned int numberOfArrays)
bool updated =
updateUniformLocation(location, ints, sizeof(int)*4*numberOfArrays);
if( updated )
glUniform4iv( (GLint)location, (GLsizei)numberOfArrays, ints );
void CCGLProgram::setUniformLocationWith1f(GLint location, GLfloat f1)
bool updated =
updateUniformLocation(location, &f1, sizeof(f1)*1);
if( updated )
glUniform1f( (GLint)location, f1);
void CCGLProgram::setUniformLocationWith2f(GLint location, GLfloat f1, GLfloat f2)
GLfloat floats[2] = {f1,f2};
bool updated =
updateUniformLocation(location, floats, sizeof(floats));
if( updated )
glUniform2f( (GLint)location, f1, f2);
void CCGLProgram::setUniformLocationWith3f(GLint location, GLfloat f1, GLfloat f2, GLfloat f3)
GLfloat floats[3] = {f1,f2,f3};
bool updated =
updateUniformLocation(location, floats, sizeof(floats));
if( updated )
glUniform3f( (GLint)location, f1, f2, f3);
void CCGLProgram::setUniformLocationWith4f(GLint location, GLfloat f1, GLfloat f2, GLfloat f3, GLfloat f4)
GLfloat floats[4] = {f1,f2,f3,f4};
bool updated =
updateUniformLocation(location, floats, sizeof(floats));
if( updated )
glUniform4f( (GLint)location, f1, f2, f3,f4);
void CCGLProgram::setUniformLocationWith2fv(GLint location, GLfloat* floats, unsigned int numberOfArrays)
bool updated =
updateUniformLocation(location, floats, sizeof(float)*2*numberOfArrays);
if( updated )
glUniform2fv( (GLint)location, (GLsizei)numberOfArrays, floats );
void CCGLProgram::setUniformLocationWith3fv(GLint location, GLfloat* floats, unsigned int numberOfArrays)
bool updated =
updateUniformLocation(location, floats, sizeof(float)*3*numberOfArrays);
if( updated )
glUniform3fv( (GLint)location, (GLsizei)numberOfArrays, floats );
void CCGLProgram::setUniformLocationWith4fv(GLint location, GLfloat* floats, unsigned int numberOfArrays)
bool updated =
updateUniformLocation(location, floats, sizeof(float)*4*numberOfArrays);
if( updated )
glUniform4fv( (GLint)location, (GLsizei)numberOfArrays, floats );
void CCGLProgram::setUniformLocationWithMatrix4fv(GLint location, GLfloat* matrixArray, unsigned int numberOfMatrices)
bool updated =
updateUniformLocation(location, matrixArray, sizeof(float)*16*numberOfMatrices);
if( updated )
glUniformMatrix4fv( (GLint)location, (GLsizei)numberOfMatrices, GL_FALSE, matrixArray);
void CCGLProgram::setUniformsForBuiltins()
kmMat4 matrixP;
kmMat4 matrixMV;
kmMat4 matrixMVP;
kmGLGetMatrix(KM_GL_PROJECTION, &matrixP);
kmGLGetMatrix(KM_GL_MODELVIEW, &matrixMV);
kmMat4Multiply(&matrixMVP, &matrixP, &matrixMV);
setUniformLocationWithMatrix4fv(m_uUniforms[kCCUniformPMatrix], matrixP.mat, 1);
setUniformLocationWithMatrix4fv(m_uUniforms[kCCUniformMVMatrix], matrixMV.mat, 1);
setUniformLocationWithMatrix4fv(m_uUniforms[kCCUniformMVPMatrix], matrixMVP.mat, 1);
if(m_bUsesTime)
CCDirector *director = CCDirector::sharedDirector();
// This doesn't give the most accurate global time value.
// Cocos2D doesn't store a high precision time value, so this will have to do.
// Getting Mach time per frame per shader using time could be extremely expensive.
float time = director-&getTotalFrames() * director-&getAnimationInterval();
setUniformLocationWith4f(m_uUniforms[kCCUniformTime], time/10.0, time, time*2, time*4);
setUniformLocationWith4f(m_uUniforms[kCCUniformSinTime], time/8.0, time/4.0, time/2.0, sinf(time));
setUniformLocationWith4f(m_uUniforms[kCCUniformCosTime], time/8.0, time/4.0, time/2.0, cosf(time));
if (m_uUniforms[kCCUniformRandom01] != -1)
setUniformLocationWith4f(m_uUniforms[kCCUniformRandom01], CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1());
void CCGLProgram::reset()
m_uVertShader = m_uFragShader = 0;
memset(m_uUniforms, 0, sizeof(m_uUniforms));
// it is already deallocated by android
//ccGLDeleteProgram(m_uProgram);
m_uProgram = 0;
tHashUniformEntry *current_element, *
// Purge uniform hash
HASH_ITER(hh, m_pHashForUniforms, current_element, tmp)
HASH_DEL(m_pHashForUniforms, current_element);
free(current_element-&value);
free(current_element);
m_pHashForUniforms = NULL;
Copyright(C)
OKBASE.NET All Rights Reserved 好库网 版权所有}

我要回帖

更多关于 cocos2d x游戏开发 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信