- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我尝试将我从 SpriteKit 开始的游戏转换为 Cocos2d V3。不过我在物理学方面有一些问题。我创造了一个像玩人偶一样的人。四肢通过 SpriteKit 中的 PinJoints 连接。我通过 Chipmunk 中的 PivotJoints 重新创建了该基本功能。这按预期工作。
但是我需要给关节增加一些摩擦力。现在它们只是尽可能快地旋转,更重要的是我需要限制关节的旋转角度。可以想象,大多数人都不能 360 度自由旋转肩膀。 ;)
据我所知,我应该使用 ChipmunkRotaryLimitJoint 和 ChipmunkGearJoint 来实现。我的问题是,我无法让它工作,因为我不知道如何正确连接它们。这是我现在的代码:
- (CCPhysicsJoint *)createPinJointWithBodyA:(CCPhysicsBody *)bodyA
bodyB:(CCPhysicsBody *)bodyB
anchor:(CGPoint)anchor
friction:(CGFloat)friction
lowerLimit:(CGFloat)lowerLimit
upperLimit:(CGFloat)upperLimit
{
CCPhysicsJoint *pin = [CCPhysicsJoint
connectedPivotJointWithBodyA:bodyA
bodyB:bodyB
anchorA:anchor];
ChipmunkRotaryLimitJoint *limitJoint = [ChipmunkRotaryLimitJoint
rotaryLimitJointWithBodyA:bodyA.body
bodyB:bodyB.body
min:CC_DEGREES_TO_RADIANS(lowerLimit)
max:CC_DEGREES_TO_RADIANS(upperLimit)];
ChipmunkGearJoint *gearJoint = [ChipmunkGearJoint
gearJointWithBodyA:bodyA.body
bodyB:bodyB.body
phase:0.5
ratio:0.5];
return pin;
}
(gearJoint 调用中的值只是占位符!)
有人知道这应该如何工作吗?我通过谷歌找到了一些东西,但所有教程都假设我在其他环境中使用花栗鼠。我是否必须为这些限制关节和齿轮关节创建自己的 CCPhysicJoint 实现?
谢谢和最良好的祝愿,托马斯
最佳答案
我想我解决了这个问题。事实证明,我必须创建自己的 CCPhysicsJoint 类别来实现 ChipmunkRotaryLimitJoint 和 ChipmunkRotaryDampedSpring。它不完全相同,但现在已经足够好了。
代码现在看起来像这样:
[CCPhysicsJoint connectedRotaryLimitJointWithBodyA:bodyA
bodyB:bodyB
min:CC_DEGREES_TO_RADIANS(lowerLimit)
max:CC_DEGREES_TO_RADIANS(upperLimit)];
[CCPhysicsJoint connectedDampedRotarySpringWithBodyA:bodyA
bodyB:bodyB
restAngle:0
stiffness:friction *1000.0f
damping:10000.0f];
我只是问这是否应该包含在 Cocos2D 代码库中。目前,这是包装器:
CCPhysicsJoint+THCAdditions.h
//
// CCPhysicsJoint+THCAdditions.h
//
// Created by Thomas Hempel on 02.02.14.
// Copyright (c) 2014 Thomas Hempel. All rights reserved.
//
#import "CCPhysicsBody.h"
#import "CCPhysicsJoint.h"
@interface CCPhysicsJoint (THCAdditions)
+ (CCPhysicsJoint *)connectedRotaryLimitJointWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB min:(CGFloat)min max:(CGFloat)max;
+ (CCPhysicsJoint *)connectedGearJointWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB phase:(CGFloat)phase ratio:(CGFloat)ratio;
+ (CCPhysicsJoint *)connectedSimpleMotorJointWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB rate:(CGFloat)rate;
+ (CCPhysicsJoint *)connectedDampedRotarySpringWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB restAngle:(CGFloat)restAngle stiffness:(CGFloat)stiffness damping:(CGFloat)damping;
@end
CCPhysicsJoint+THCAdditions.m
//
// CCPhysicsJoint+THCAdditions.m
//
// Created by Thomas Hempel on 02.02.14.
// Copyright (c) 2014 Thomas Hempel. All rights reserved.
//
#import "CCPhysicsJoint+THCAdditions.h"
#import "CCPhysics+ObjectiveChipmunk.h"
// ------------------------------------------------------------------------
#pragma mark - Rotary Limit Joint
// ------------------------------------------------------------------------
@interface CCPhysicsRotaryLimitJoint : CCPhysicsJoint
@end
@implementation CCPhysicsRotaryLimitJoint {
ChipmunkRotaryLimitJoint *_constraint;
}
- (id)initWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB min:(CGFloat)min max:(CGFloat)max
{
if ((self = [super init])){
_constraint = [ChipmunkRotaryLimitJoint rotaryLimitJointWithBodyA:bodyA.body
bodyB:bodyB.body
min:min
max:max];
_constraint.userData = self;
}
return self;
}
- (ChipmunkConstraint *)constraint
{
return _constraint;
}
- (void)willAddToPhysicsNode:(CCPhysicsNode *)physics
{
}
@end
// ------------------------------------------------------------------------
#pragma mark - Gear Joint
// ------------------------------------------------------------------------
@interface CCPhysicsGearJoint : CCPhysicsJoint
@end
@implementation CCPhysicsGearJoint {
ChipmunkGearJoint *_constraint;
}
- (id)initWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB phase:(CGFloat)phase ratio:(CGFloat)ratio
{
if ((self = [super init])){
_constraint = [ChipmunkGearJoint gearJointWithBodyA:bodyA.body
bodyB:bodyB.body
phase:phase
ratio:ratio];
_constraint.userData = self;
}
return self;
}
- (ChipmunkConstraint *)constraint
{
return _constraint;
}
- (void)willAddToPhysicsNode:(CCPhysicsNode *)physics
{
}
@end
// ------------------------------------------------------------------------
#pragma mark - Simple Motor Joint
// ------------------------------------------------------------------------
@interface CCPhysicsSimpleMotorJoint : CCPhysicsJoint
@end
@implementation CCPhysicsSimpleMotorJoint {
ChipmunkSimpleMotor *_constraint;
}
- (id)initWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB rate:(CGFloat)rate
{
if ((self = [super init])){
_constraint = [ChipmunkSimpleMotor simpleMotorWithBodyA:bodyA.body
bodyB:bodyB.body
rate:rate];
_constraint.userData = self;
}
return self;
}
- (ChipmunkConstraint *)constraint
{
return _constraint;
}
- (void)willAddToPhysicsNode:(CCPhysicsNode *)physics
{
}
@end
// ------------------------------------------------------------------------
#pragma mark - Damped Rotary Spring
// ------------------------------------------------------------------------
@interface CCPhysicsDampedRotarySpring : CCPhysicsJoint
@end
@implementation CCPhysicsDampedRotarySpring {
ChipmunkDampedRotarySpring *_constraint;
}
- (id)initWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB restAngle: (CGFloat)restAngle stiffness:(CGFloat)stiffness damping:(CGFloat)damping
{
if ((self = [super init])){
_constraint = [ChipmunkDampedRotarySpring dampedRotarySpringWithBodyA:bodyA.body
bodyB:bodyB.body
restAngle:restAngle
stiffness:stiffness
damping:damping];
_constraint.userData = self;
}
return self;
}
- (ChipmunkConstraint *)constraint
{
return _constraint;
}
- (void)willAddToPhysicsNode:(CCPhysicsNode *)physics
{
}
@end
// ------------------------------------------------------------------------
#pragma mark - Implementation
// ------------------------------------------------------------------------
@implementation CCPhysicsJoint (THCAdditions)
+ (CCPhysicsJoint *)connectedRotaryLimitJointWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB min:(CGFloat)min max:(CGFloat)max
{
CCPhysicsJoint *joint = [[CCPhysicsRotaryLimitJoint alloc] initWithBodyA:bodyA bodyB:bodyB min:min max:max];
[bodyA addJoint:joint];
[bodyB addJoint:joint];
[bodyA.physicsNode.space smartAdd:joint];
return joint;
}
+ (CCPhysicsJoint *)connectedGearJointWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB phase:(CGFloat)phase ratio:(CGFloat)ratio
{
CCPhysicsJoint *joint = [[CCPhysicsGearJoint alloc] initWithBodyA:bodyA bodyB:bodyB phase:phase ratio:ratio];
[bodyA addJoint:joint];
[bodyB addJoint:joint];
[bodyA.physicsNode.space smartAdd:joint];
return joint;
}
+ (CCPhysicsJoint *)connectedSimpleMotorJointWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB rate:(CGFloat)rate
{
CCPhysicsJoint *joint = [[CCPhysicsSimpleMotorJoint alloc] initWithBodyA:bodyA bodyB:bodyB rate:rate];
[bodyA addJoint:joint];
[bodyB addJoint:joint];
[bodyA.physicsNode.space smartAdd:joint];
return joint;
}
+ (CCPhysicsJoint *)connectedDampedRotarySpringWithBodyA:(CCPhysicsBody *)bodyA bodyB:(CCPhysicsBody *)bodyB restAngle:(CGFloat)restAngle stiffness:(CGFloat)stiffness damping:(CGFloat)damping
{
CCPhysicsJoint *joint = [[CCPhysicsDampedRotarySpring alloc] initWithBodyA:bodyA bodyB:bodyB restAngle:restAngle stiffness:stiffness damping:damping];
[bodyA addJoint:joint];
[bodyB addJoint:joint];
[bodyA.physicsNode.space smartAdd:joint];
return joint;
}
@end
祝你好运,托马斯
关于ios - Cocos2d V3 (Chipmunk) 中具有摩擦和限制的 PivotJoints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21508667/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!