gpt4 book ai didi

iOS SpriteKit - 为摇头娃娃创建物理?

转载 作者:可可西里 更新时间:2023-11-01 05:35:10 28 4
gpt4 key购买 nike

我正在尝试创建一个逼真的摇头应用程序,并希望将物理学用于摇头动画。我已经看到其他应用可以做到这一点,据我所知,我需要使用 SpriteKit。

我创建了一个 SKScene 并使用 SKPhysicsJointPin 将头部固定到 body 上,但它根本没有移动。有什么想法或建议吗?

更新代码 (5/28):

现在在头上使用 2 个 Spring 关节,它可以从左向右移动,但不能上下移动。此外,快速敲击会导致头部最终移动得足够远,以至于“掉落”并消失在视线范围内。很奇怪。

对于允许它上下左右摆动的正确设置有什么想法,同时保持在它的起始位置的远程中心并保持在指定区域内,这样它就不会脱离 body 看起来很有趣?

BobbleheadView 是 SKView 的子类

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.backgroundColor =[UIColor clearColor];
self.showsFPS = YES;
self.showsNodeCount = YES;

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(animateBobble)];

[self addGestureRecognizer:tap];

SKScene *bobbleheadScene = [SKScene sceneWithSize:self.bounds.size];
[self presentScene:bobbleheadScene];

// 1. Body
self.body = [SKSpriteNode spriteNodeWithImageNamed:@"Bobble-Body"];
self.body.position = CGPointMake(self.frame.size.width/2, self.body.frame.size.height/2);
self.body.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
[bobbleheadScene addChild:self.body];

// 2. Head
self.head = [SKSpriteNode spriteNodeWithImageNamed:@"Bobble-Head"];
self.head.position = CGPointMake(self.center.x, self.body.frame.size.height);
//self.head.physicsBody.affectedByGravity = YES;
// self.head.physicsBody.dynamic = NO;
//This bobbles head great, but head falls off body and out of view
self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size center:self.head.position];
//End
//self.head.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.head.frame];
//self.head.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.head.size.height/2];
[bobbleheadScene addChild:self.head];

// 3. Ceiling
self.ceiling = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(32, 32)];
self.ceiling.position = CGPointMake(self.frame.origin.x+self.frame.size.width/2, self.frame.size.height);
self.ceiling.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
[bobbleheadScene addChild:self.ceiling];



//Spring Joint for Ceiling to Head
SKPhysicsJointSpring *spring1 = [SKPhysicsJointSpring jointWithBodyA:self.ceiling.physicsBody bodyB:self.head.physicsBody anchorA:self.ceiling.position anchorB:CGPointMake(self.head.frame.origin.x+self.head.frame.size.width/2, 0)];

spring1.frequency = 20.0; //gives the spring some elasticity.
spring1.damping = 5.0; //Will remove damping to create the 'pendulum'
[bobbleheadScene.physicsWorld addJoint:spring1];


//Spring Joint for Head to Body
SKPhysicsJointSpring *spring = [SKPhysicsJointSpring jointWithBodyA:self.body.physicsBody bodyB:self.head.physicsBody anchorA:CGPointMake(self.body.position.x+self.body.size.width/2, self.body.position.y) anchorB:CGPointMake(self.head.position.x+self.head.size.width/2, self.body.position.y-self.body.size.height/2)];

spring.frequency = 10.0; //gives the spring some elasticity.
spring.damping = 1.0;
[bobbleheadScene.physicsWorld addJoint:spring];

}
return self;
}

-(void)animateBobble{
NSLog(@"Did Tap Bobblehead!");
[self.head.physicsBody applyImpulse:CGVectorMake(100, -200)];
//[self.body.physicsBody applyImpulse:CGVectorMake(20, 10)];
}

最佳答案

实现此功能的唯一方法是制作“雪橇”。

因此:制作一个应用程序,屏幕上有(比方说)六个 slider 。

TBC 我的意思是,当应用实际运行时,您会看到六个 slider 。

待定,这只是雪橇,它仅供您作为开发人员使用,不适用于消费者应用。

(我相信术语“雪橇”来自汽车行业;当他们制造第一个版本的底盘/引擎来测试它时。)

让一些 slider 控制 Spring 力/阻尼(或您在 cocos 中可用的任何因素),而其他 slider 微调连接/ Spring 长度的位置。

这是获得结果的唯一途径!确保在屏幕上显示这些值,或者至少在它们发生变化时在控制台上打印出来。

这是游戏开发中的日常事务。 通常,sled 比实际的消费者场景或功能需要更多工作。没有“sled”,您将无法实现它。希望对您有所帮助!

关于iOS SpriteKit - 为摇头娃娃创建物理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23820087/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com