像 CCSprite 对象一样移动 Box2d 实体

2024-01-10

在cocos2d中,您可以轻松使用CCSprites并以各种方式移动它们。最重要的是 - 他们可以缓入/缓出。对于大多数游戏来说,这对于平滑移动等是可取的。

id action = [CCMoveTo actionWithDuration:dur position:pos];
move = [CCEaseInOut actionWithAction:action rate:2];
[self runAction: move];

当移动 box2d 主体时,附加到它的精灵会在 box2d 步骤()之后更新。移动精灵然后更新身体在这里不是一个选择,因为它完全违背了物理框架的目的。

因此,我已经成功实现的另一个选项是通过将精灵本身视为力学实体来计算精灵的位移、速度和加速度。每次我在精灵上调用 update() 以便角色可以决定移动到哪里等时,我的超类还存储以前的位置和速度。这些值除以 PTM_RATIO 后存储为符合 box2d 的值。

在CCSprite的子类中,称为FMSprite:

-(CGPoint) displacement {
    return ccpSub(self.position, lastPos);
}

-(b2Vec2) getSpriteVelocity:(ccTime)dt {
    return b2Vec2(self.displacement.x / dt / PTM_RATIO,
                  self.displacement.y / dt / PTM_RATIO);
}

-(b2Vec2) getSpriteAccel:(ccTime)dt {
    b2Vec2 currVel = [self getSpriteVelocity:dt];
    if (dt == 0) {
        return b2Vec2(0,0);
    } else {    
        float accelX = (currVel.x - lastVel.x)/dt;
        float accelY = (currVel.y - lastVel.y)/dt;
        return b2Vec2(accelX, accelY);
    }
}

// This is called each update()
-(void) updateLast:(ccTime)dt {
    // MUST store lastVel before lastPos is updated since it uses displacement
    lastVel = [self getSpriteVelocity:dt];
    lastPos = ccp(self.X, self.Y);
}

// Leave this method untouched in subclasses
-(void) update:(ccTime)dt {
    [self updateObject:dt];

    // Store previous update values
    [self updateLast:dt];
}

// Override this method in subclasses for custom functionality
-(void) updateObject:(ccTime)dt {

}

然后我将“FMSprite”子类化为“FMObject”,它存储 b2Body 等。

为了移动身体,我必须首先移动精灵并跟踪其加速度,通过它我可以找到跟随精灵运动所需的力(使用质量)。由于我无法移动对象的精灵(与主体同步),因此我制作了另一个名为“信标”的精灵,将其作为子对象添加到对象中,然后移动它。我们需要做的就是拥有一个函数,使用我之前提到的力来将 box2d 主体的位置与这个信标精灵同步。

-(void) followBeaconWithDelta:(ccTime)dt {
    float forceX = [beacon getSpriteAccel:dt].x * self.mass;
    float forceY = [beacon getSpriteAccel:dt].y * self.mass;
    [self addForce:b2Vec2(forceX, forceY)];
}

结果非常出色,b2body 可以平滑地缓和运动,移动到您想要的任何位置,无需使用其自身的任何力,而是复制 CCSprite 的运动并复制其运动。由于都是力,所以在与其他b2Body物体碰撞时不会造成抖动和扭曲。如果有人有任何其他方法可以做到这一点,请发布答案。谢谢!


我所做的与你的不同,但也可以像CCSprite对象一样移动Box2d实体,甚至使用CCAction。 最重要的是创建一个包含ccSprite和b2body的对象。

@interface RigidBody : CCNode {
    b2Body *m_Body;
    CCSprite *m_Sprite;
}

然后,重写setPosition方法。

-(void)setPosition:(CGPoint)position
{
    CGPoint currentPosition = position_;
    b2Transform transform = self.body->GetTransform();
    b2Vec2 p = transform.p;
    float32 angle = self.body->GetAngle();
    p += [CCMethod toMeter:ccpSub(position, currentPosition)];
    self.body->SetTransform(p, angle);  
    position_ = position;
}

setPosition方法计算位置变化了多少,并将其设置给b2body。

我希望我能理解你的问题并且答案对你有帮助......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

像 CCSprite 对象一样移动 Box2d 实体 的相关文章

  • 如何让两个物体碰撞后粘在一起?

    我真的很困惑 我可以成功检测到碰撞 但我无法使参与碰撞的两个物体粘在一起 这是我的联系监听器 world setContactListener listener listener new ContactListener Override p
  • 使 Box2d 对象遵循预定路径

    我正在制作一个游戏 其中某个对象 建模为 box2d 主体 必须遵循固定路径 有没有一种方法可以指定路径坐标并使对象在每个 dt 上前进 Thanks 另外一个选择 将鼠标关节连接到您的身体上 使用鼠标关节的setTarget方法来移动身体
  • RPG 游戏循环和类结构(cocos2D for iPhone)

    我想在 iPhone 上使用 Cocos2D 制作一款 RPG 我做了相当多的研究 我真的很喜欢 Cocos2D 用于场景的模型 我可以实例化一个场景 设置我的角色等 这一切都工作得非常好 我遇到的问题是构建游戏循环并将代码与场景分开 例如
  • 显示轨迹指示器

    从图像中您可以看到 在左侧发射的球在其后面发射 与计算的轨迹不符 我使用 SO 中的方程绘制球轨迹question https stackoverflow com questions 10401644 mousejointdef libgd
  • Emscripten 绑定:如何从 Javascript 创建可访问的 C/C++ 数组?

    我在用box2d https github com kripken box2d js 并尝试创建一个链条形状 为了创建链形状或多边形形状 我必须传递向量数组才能指定几何形状 我没有看到任何文档可以帮助我完成此任务 也没有看到有关绑定的注释h
  • Cocos2D 2.0 OpenGL 错误?

    在我的应用程序中 它在 Cocos2D 1 1 版本中运行良好 当我升级到 2 0rc0a 时 我现在只看到黑屏 并且不停地收到以下 4 个错误 直到我退出应用程序 OpenGL error 0x0506 in CCSprite draw
  • 如何使 cocos2d 精灵每秒缩放(以获得脉动效果)?

    我想让精灵每秒缩放一次 使其看起来像是鼓起来并脉动 我怎样才能做到这一点 由于之前的帖子包含语法错误 更准确地说 我发布了工作代码 CCSprite sprite create the sprite id scaleUpAction CCE
  • 调用插页式 iAd 只能运行一次

    我有 spritekit 游戏 每次游戏开始时都会预加载广告 UIViewController prepareInterstitialAds 游戏结束后 它应该显示广告 self view window rootViewController
  • 如何在cocos 2d中移动背景

    你好 我想开发像 涂鸦跳跃 这样的游戏 但是我对以下功能有一些问题 1 如何移动背景场景 图像 2 如何检测对象之间的碰撞 是否需要像box2d这样的物理引擎 或者我应该使用手动碰撞 3 背景图片的大小应该是多少 4 事实上我不知道背景是如
  • CocosDenshion 音乐淡出

    我在游戏中使用 cocos denshion 来播放音乐 我目前正在使用以下代码播放背景音乐 SimpleAudioEngine共享引擎 playBackgroundMusic backSong mp3 然而 当游戏结束时 我需要背景音乐逐
  • iOS 中的 Facebook 发帖错误

    在这里 我尝试使用以下代码向 Facebook 添加帖子 FBAppCall appCall FBDialogs presentShareDialogWithLink urlToShare name Title caption nil de
  • Cocos2d 3.0中如何获取winSize

    我在Cocos2d 1 0和Cocos2d 2 0中使用了以下代码 但在Cocos2d 3 0中似乎找不到 CGSize s CCDirector sharedDirector winSize 如何在Cocos2d 3 0中获取屏幕尺寸 您
  • 无法加载 libgdx 的共享库 box2d

    我有一个使用 Maven 构建的 libGDX 项目 它过去运行良好 但最近它停止工作 因为 libGDX 将 box2d 移动为扩展 我将扩展作为依赖项添加到项目的核心 就像任何其他依赖项一样
  • 《How To Make a Tile-Based Game with Cocos2D 2.X》用cocos2d V3制作本教程

    我有一个小问题 在本教程中如何使用 Cocos2D 2 X 制作基于图块的游戏 http www raywenderlich com 29458 how to make a tile based game with cocos2d 2 x使
  • 致命信号11(和引擎项目)

    我正在创建由 andengine 框架提供支持的 android 游戏 box2d 扩展我收到 致命信号 11 这似乎是突然发生的 我想你可以随机称呼它 没有任何线索 至少 我不知道有任何线索可以帮助我解决这个问题 我的猜测是 1 我正在使
  • Cocos2d:CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵?

    CCSpriteBatch 节点是否仅绘制可见属性设置为 true 的精灵 或者它也考虑屏幕尺寸 换句话说 如果节点内的精灵位于屏幕之外 opengl 绘制调用的性能是否会反映这一点 不 不 CCSpriteBatchNode 始终绘制所有
  • CMake 错误:CMake 无法找到与“MinGW Makefiles”对应的构建程序

    我正在尝试使用 cmake 为 c 构建 Box2D 库 当我运行 cmake gui 时出现错误 CMake Error CMake was unable to find a build program corresponding to
  • 如何在cocos2d中测试精灵碰撞?

    我如何开始实现精灵碰撞类 正如 Eric 指出的 CGRectIntersectsRect 是测试两个边界矩形是否重叠的方法 使用 CCNode 类的boundingBox 方法获取每个精灵 或其他节点 的正确边界框 在这里查看我的回答 C
  • 不同 Android 设备上 box2D 中出现奇怪的“口吃”

    我正在用 C 同时开发引擎和游戏 并使用 box2D 作为物理后端 我正在不同的 Android 设备上进行测试 在三分之二的设备上 游戏运行良好 物理效果也很好 然而 在我的 Galaxy Tab 10 1 上 我偶尔会遇到某种 口吃 的
  • 如何在 box2d 中停止作用在物体上的力

    我正在 iPhone 上使用 box2d 来创建游戏 我的身体受重力影响向下移动 而不是向右或向左移动 它会被另一个物体击中 然后向右或向左移动 然后我有一个重置按钮 可以将身体移回到起点 唯一的问题是它仍在向右或向左移动 如何抵消球已经行

随机推荐

  • 如何使 ProgressDialog 可以通过后退按钮取消,但不能通过屏幕点击取消?

    我想做一个ProgressDialog可以通过后退按钮取消 但不能通过屏幕点击取消 目前我使用setCancelable true 然而 在一些较新的设备中 点击屏幕也会取消ProgressDialog 我想禁用屏幕点击操作Progress
  • iOS UITextField 在文本更改时更改位置

    我用它来将文本字段置于相关内容的中心 textField setCenter someObject center textField becomeFirstResponder 这看起来很棒 很漂亮 并且位于对象的中心 可以接受文本 我希望文
  • Python smtplib 代理支持

    我想通过代理发送电子邮件 我目前的实现如下 我通过身份验证连接到 smtp 服务器 成功登录后 我会发送一封电子邮件 它工作正常 但当我查看电子邮件标题时 我可以看到我的主机名 我想通过代理来传输它 任何帮助将不胜感激 Use Socksi
  • OracleConnection 生命周期 - 最佳实践

    我正在使用标准 Oracle 驱动程序连接到数据库 但对于 OracleConnection 的生命周期 我不太同意我的同事的观点 创建成本高吗 它是线程安全的吗 我可以在请求之间重复使用它 还是应该为每个请求创建一个新的 如果能更详细地解
  • 从 ExecutorService 更新 JProgressBar

    我正在使用 Java ICMP ping 功能对网关进行 ping 操作 为了执行快速 ping 我使用 ExectorService 创建用于 ping 的线程 地址被 ping 或不 后 我想在 ping 后更新 Jprogressba
  • Eclipse 和 Android XML 布局给出“‘默认’不是任何设备/区域设置组合的最佳匹配”

    这是我第一次使用 XML 布局制作应用程序 过去我总是在运行时动态生成布局 所以不用担心 我不是 Android 新手 不过 这是我第一次使用静态布局 那么这条消息到底是关于什么的呢 2010 09 22 20 43 23 Rockport
  • Bootstrap css,如何使导航栏切换始终可见?

    我想添加在移动设备上显示的按钮之一 以便打开导航栏中的折叠菜单 但到目前为止还无法做到 这里是较少的代码和 html navbar toggle always navbar toggle media min width 768px disp
  • MongoDB 汇总之前所有周的每周总和

    我有一系列 MongoDB 文档 一个示例文档是 createdAt Mon Oct 12 2015 09 45 20 GMT 0700 PDT year 2015 week 41 想象一下这些跨越一年中的所有几周 并且同一周可能有很多 我
  • Modernizr:如何检测 CSS display:table-cell 支持?

    我想用display table and display table cell对于我在支持它的浏览器中的布局 在 IE7 中 我只是想浮动我的列 因为我假设它不可能在该浏览器中工作 但无法找到有关如何使用 Modernizr 执行此操作的任
  • 如何在 matplotlib 中绘制 datetime.time ?

    我有两个要显示的数组 x datetime time 0 17 47 782000 ect y 1712 2002 ect 我正在尝试将 x 转换为 matplotlib 使用的格式 但它永远不会工作 x matplotlib dates
  • 使用 Firebase 身份验证验证 ID 令牌

    我们正在开始开发一个 Web 应用程序 并考虑使用 Firebase 身份验证来处理我们的注册流程 但是 我们不确定 ID 令牌验证的工作原理 似乎可以在 Firebase 领域之外使用其令牌来验证用户 我们正在考虑在 Google Kub
  • 如何在Delphi XE3 FireMonkey 2中的TTabControl的每个选项卡上实现关闭按钮?

    我正在尝试创建一个浏览器样式的 TabControl 在 FireMonkey FM2 中的每个选项卡上都有一个小的关闭按钮 由于 FM2 中没有 TTabsheet 和 TPageControl 组件 因此我无法使用 如何为 TPageC
  • 我的 Django 项目未加载 Bootstrap 字形

    当我加载页面时 我的终端中收到以下消息 Not Found fonts glyphicons halflings regular woff2 24 Aug 2016 17 19 36 GET fonts glyphicons halflin
  • 如何知道JQuery是否已完成加载[重复]

    这个问题在这里已经有答案了 对于某些情况 我需要使用一段 javascript 加载 jQuery 如下所示
  • 基于构建的不同 SASS/Coffeescript 变量值

    我正在尝试为前端框架创建一个构建系统 该框架将根据我部署到的位置在 SASS 可能还有 Coffeescript 中创建不同的路径 例如 我可能有一个在本地 SASS 中引用的图像文件 images image png 这在我当地的环境中运
  • 尝试从元组中删除最后一个类型失败

    我正在尝试删除元组的最后一个元素 当我在元组中只有一个元素需要删除时 它会起作用 但当我有不止一个时 事情就会出错 我不明白为什么这不起作用 这些是我收到的错误 prog cpp 在函数 int main prog cpp 24 22 错误
  • 用于检测最小化窗口的钩子 C#

    大家好 在C 中如何检测用户单击了外部程序 例如记事本 的最小化按钮 谢谢 这应该有效 public class myClass DllImport user32 dll return MarshalAs UnmanagedType Boo
  • 将 Dropzone 与 Typescript 结合使用

    我有一个使用 dropzone 4 3 并用 Typescript 编写的应用程序 在将其转换为打字稿之前 我们必须在 Dropzone 上设置一个全局变量 一切都很顺利 Dropzone autoDiscover false 我已经拉入了
  • 如何告诉调试器忽略抛出异常时的中断?

    我有一个文本框 在其中使用第三方库验证输入 但是 当语法不正确时 该库会引发自定义异常 这并不是什么大问题 除非您正在调试 调试时 由于 TextBox 中的文本最初总是错误的 我仍在输入它 因此调试器将在每个字母之后停止 直到它正确为止
  • 像 CCSprite 对象一样移动 Box2d 实体

    在cocos2d中 您可以轻松使用CCSprites并以各种方式移动它们 最重要的是 他们可以缓入 缓出 对于大多数游戏来说 这对于平滑移动等是可取的 id action CCMoveTo actionWithDuration dur po