Cocos2d入门 <四> fire bullet

本文介绍了一个使用Cocos2d-x开发的简单射击游戏实现方法,详细讲解了如何通过触摸事件创建子弹对象,并根据玩家触摸的位置计算子弹移动的方向和终点。此外,还介绍了如何设置子弹的移动速度及移动路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们需要我们的英雄 来发射子弹消灭敌人。

void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event)
{
	// Choose one of the touches to work with
	CCTouch* touch = (CCTouch*)( touches->anyObject() );
	CCPoint location = touch->locationInView();
	location = CCDirector::sharedDirector()->convertToGL(location);
	// Set up initial location of projectile
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	CCSprite *projectile = CCSprite::create("Projectile.png",  CCRectMake(0, 0, 20, 20));
	projectile->setPosition( ccp(20, winSize.height/2) );
    
	// Determinie offset of location to projectile
	int offX = location.x - projectile->getPosition().x;
	int 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
    int realX = winSize.width + (projectile->getContentSize().width/2);
	float ratio = (float)offY / (float)offX;
	int realY = (realX * ratio) + projectile->getPosition().y;
	CCPoint realDest = ccp(realX, realY);

	// Determine the length of how far we're shooting
	int offRealX = realX - projectile->getPosition().x;
	int offRealY = realY - projectile->getPosition().y;
	
	float length = sqrtf((offRealX * offRealX) + (offRealY*offRealY));

	float velocity = 480/1; // 480pixels/1sec
	float realMoveDuration = length/velocity;

	// Move projectile to actual endpoint
	 projectile->runAction( CCSequence::actions(CCMoveTo::create(realMoveDuration, realDest),
					CCCallFuncN::create(this, 
					callfuncN_selector(HelloWorld::spriteMoveFinished)), 
					NULL) );


}




// on "init" you need to initialize your instance
bool HelloWorld::init()
{
  ......	
	this->setTouchEnabled(true);
	// Call game logic about every second
	this->schedule( schedule_selector(HelloWorld::gameLogic), 1.0 );

    return true;
}


资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
<think>我们正在处理一个Cocos2d-x项目中的链接错误:LNK2019,具体是关于LuaHelper::execLuaFunc的未解析外部符号。首先,我们需要理解这个错误的原因:链接器在尝试将目标文件链接成可执行文件或动态库时,找不到LuaHelper::execLuaFunc函数的实现。可能的原因及解决方案:1.**函数声明但未定义**:在头文件中声明了`LuaHelper::execLuaFunc`,但在对应的源文件中没有定义(实现)。需要检查`LuaHelper`类的源文件(如`LuaHelper.cpp`)中是否实现了`execLuaFunc`函数。2.**编译单元未包含**:包含`execLuaFunc`实现的源文件没有被编译,或者没有被包含在项目中(例如,在VisualStudio中,该文件没有被添加到项目,或者被排除在编译之外)。需要检查项目文件,确保包含该函数实现的源文件被正确添加并参与编译。3.**名称修饰(NameMangling)问题**:如果函数声明和定义之间的调用约定不一致(比如一个声明为`__stdcall`而另一个是`__cdecl`),可能会导致名称修饰不一致。检查函数声明和定义是否完全一致(包括`const`、`static`等修饰符)。4.**库文件未链接**:如果`LuaHelper`类是在一个静态库中实现的,那么可能项目没有链接该静态库。需要在链接器设置中添加该库。5.**函数定义在条件编译中**:函数的定义可能在条件编译(如`#ifdef`)中,而当前编译条件没有满足,导致函数定义没有被编译。6.**函数签名不匹配**:检查头文件中的函数声明和源文件中的函数定义是否完全一致(参数类型、返回类型、函数名、命名空间等)。7.**C++与C混合编译问题**:如果函数是在C文件中实现,而在C++中使用,需要确保在C++中声明时使用了`extern"C"`。但这里看起来是C++函数,所以可能性较小。针对Cocos2d-x项目,特别要注意:-Cocos2d-x的Lua绑定部分,`LuaHelper`类通常位于`cocos2d/cocos/scripting/lua-bindings/manual`目录下。具体来说,`LuaHelper.h`和`LuaHelper.cpp`文件。因此,我们应检查:1.在项目中是否包含了`LuaHelper.cpp`(或者对应的平台实现文件)?2.在链接器的附加依赖项中是否包含了包含`LuaHelper`实现的库(如果它是库的一部分)?步骤:**步骤1:定位LuaHelper类的源文件**在Cocos2d-x项目中,找到`LuaHelper.h`和`LuaHelper.cpp`。通常路径为:-`cocos2d/cocos/scripting/lua-bindings/manual/LuaHelper.h`-`cocos2d/cocos/scripting/lua-bindings/manual/LuaHelper.cpp`**步骤2:检查LuaHelper.cpp中是否有execLuaFunc的实现**打开`LuaHelper.cpp`,搜索`execLuaFunc`,确保该函数有实现体。**步骤3:检查项目是否编译了LuaHelper.cpp**在项目设置中,确认`LuaHelper.cpp`被包含在编译源文件列表中。**步骤4:检查函数签名**比较头文件中的声明和源文件中的定义是否一致。例如:头文件(LuaHelper.h)中:```cppclassCC_DLLLuaHelper{public:staticvoidexecLuaFunc(conststd::string&funcName);};```源文件(LuaHelper.cpp)中:```cppvoidLuaHelper::execLuaFunc(conststd::string&funcName){//实现代码}```注意:`CC_DLL`宏可能会影响导出(在Windows上可能是`__declspec(dllexport)`或`__declspec(dllimport)`),确保在编译库时正确设置。**步骤5:检查链接库**如果`LuaHelper`类是在一个单独的库中(比如`libcocos2d`),那么确保在链接时链接了该库(例如:`libcocos2d.a`或`libcocos2d.lib`)。**步骤6:检查条件编译**查看`LuaHelper.cpp`中`execLuaFunc`的实现是否被条件编译指令包裹,确保当前编译条件满足。**步骤7:清理并重新构建**有时构建系统缓存问题,清理项目并重新构建。如果以上步骤都检查无误,那么可能需要查看更具体的构建日志,确定`LuaHelper.cpp`是否被编译,以及编译后的目标文件中是否包含`execLuaFunc`的符号。在Windows平台下,可以使用`dumpbin`工具检查目标文件或库文件中的符号:```dumpbin/SYMBOLSLuaHelper.obj|findstrexecLuaFunc```在Linux/macOS下,可以使用`nm`工具:```nmLuaHelper.o|grepexecLuaFunc```如果符号存在,则检查链接时是否包含了该目标文件或库;如果不存在,则说明编译过程中没有生成,回到步骤2和3。注意:在Cocos2d-x中,Lua模块可能需要启用,确保在项目配置中启用了Lua支持(例如:`USE_LUA=1`)。最后,如果问题仍然存在,请提供以下信息以便进一步诊断:-操作系统和开发环境(VS版本,AndroidNDK等)-Cocos2d-x版本-项目配置(特别是与Lua相关的配置)相关问题:1.如何检查目标文件中的符号?2.在VisualStudio中如何添加额外的链接库?3.Cocos2d-x中如何启用Lua支持?4.如何解决C++中的链接错误LNK2001?5.如何正确配置Cocos2d-x项目的构建脚本(如CMake)以包含Lua模块?</think>### Cocos2d-x LuaHelper::execLuaFunc LNK2019 链接错误分析 该链接错误表明编译器在生成可执行文件时找不到 `LuaHelper::execLuaFunc` 函数的实现。以下是系统级分析和解决方案: #### 🔍 错误原因分析 1. **函数实现缺失** - 声明存在于头文件(如 `LuaHelper.h`)但未在源文件(如 `LuaHelper.cpp`)中实现 - 常见于未正确重写父类虚函数时 $$ \text{声明} \neq \text{实现} \implies \text{LNK2019} $$ 2. **编译配置问题** - Lua绑定模块未包含在编译目标中(Android.mk/CMakeLists.txt配置错误) - 平台条件编译导致实现被排除(如 `#if COCOS2D_DEBUG` 分支) 3. **符号导出问题** - Windows平台缺少 `__declspec(dllexport)` 修饰符 - Android/iOS未启用必要的编译器标志(`-fvisibility=default`) 4. **链接顺序错误** - Lua库链接顺序不正确(应在依赖库之后) $$ \text{链接顺序}: \text{依赖库} > \text{Lua库} > \text{主模块} $$ #### 🛠️ 解决方案步骤 **1. 验证函数实现** ```cpp // LuaHelper.h 声明 class LuaHelper { public: static void execLuaFunc(const std::string& funcName); // [!code focus] }; // LuaHelper.cpp 实现检查 void LuaHelper::execLuaFunc(const std::string& funcName) { // [!code focus] // 必须存在此实现体 lua_State* L = ...; lua_getglobal(L, funcName.c_str()); lua_pcall(L, 0, 0, 0); } ``` **2. 检查编译配置** ```makefile # Android.mk 示例 LOCAL_SRC_FILES := $(LOCAL_PATH)/../../classes/LuaHelper.cpp \ # [!code focus] $(LOCAL_PATH)/../../scripting/lua-bindings/manual/... LOCAL_STATIC_LIBRARIES := cocos2d_lua_static ``` **3. Windows符号导出修正** ```cpp #if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 #define LUA_HELPER_EXPORT __declspec(dllexport) // [!code focus] #else #define LUA_HELPER_EXPORT #endif class LUA_HELPER_EXPORT LuaHelper { ... }; // [!code focus] ``` **4. 链接顺序调整(CMake示例)** ```cmake target_link_libraries(MyGame cocos2d_lua_static # Lua绑定库 cocos2d # 主引擎库 ${EXTRA_LIBS} ) ``` #### ⚠️ Cocos2d-x 特有注意事项 1. **Lua绑定版本匹配** - 检查 `lua-binding` 模块版本是否与引擎匹配(常见于v3.x→v4.x升级问题) - 确认使用的Lua版本(5.1 vs 5.3) 2. **命名空间冲突** - 避免自定义 `LuaHelper` 类与引擎内置类冲突 - 使用命名空间隔离: ```cpp namespace MyGame { class LuaHelper : public cocos2d::Ref {...}; } ``` 3. **预编译头问题** - 清理预编译头缓存(删除 `pch.h.gch` 或 `stdafx.pch`) - 确保所有源文件包含相同的预编译头 #### ✅ 验证流程 1. 在 `LuaHelper.cpp` 中添加测试函数验证编译: ```cpp void LuaHelper::testLink() {} // 空函数 ``` 2. 执行符号检查: ```bash # Windows dumpbin /SYMBOLS LuaHelper.obj | find "execLuaFunc" # Linux/macOS nm LuaHelper.o | grep execLuaFunc ``` 3. 若符号存在但未链接,检查库依赖图: ```bash # Linux ld -verbose --trace MyGame --whole-archive ``` > 案例:某项目因 `Android.mk` 中缺少 `LOCAL_WHOLE_STATIC_LIBRARIES += cocos2d_lua_static` 导致相同错误,添加后解决[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值