Articles of 花栗鼠

Cocos2dx – 物理 – 中止()当改变dynamicPhysicBody为静态?

我刚学了cocos2dx v3.3集成的花栗鼠物理引擎。 在这里,如你所见,我创建了一个简单的物理圈: auto sprite = Sprite::create("circle.png"); auto body = PhysicsBody::createCircle(sprite->getContentSize().width / 2); body->setContactTestBitmask(-1); //active collisions event sprite->setPhysicsBody(body); sprite->setPosition(…); this->addChild(sprite); 当我在正常情况下切换这个圆静态/dynamic时,一切工作正常,当圆变成静态时,它停在它的位置(因为我们预计重力不会再移动它)。 这里是一个正常工作的切换代码: body->setDynamic(false); scheduleOnce([=](float dt){body->setDynamic(true);},3,"Back to Dynamic Mode Timer"); 问题开始 但是我想要当圆与其他东西碰撞(在我的情况下屏幕边缘不是情景的重要组成部分),它变成静态的。 所以我使用下面的代码: auto contactListener = EventListenerPhysicsContact::create(); contactListener->onContactBegin = [=](PhysicsContact &contact) -> bool { return true; }; contactListener->onContactPostSolve = [=](PhysicsContact& contact, const PhysicsContactPostSolve& solve) { contact.getShapeA()->getBody()->setDynamic(false); […]

从Chipmunk切换到Box2D很容易吗?

目前我正在用Python进行物理原型devise,后来我计划将代码移植到C ++中。 Box2D有一些我非常喜欢的function,所以我宁愿使用这个库。 问题是Box2D的Python端口安装非常繁琐,而且我很懒:D,而Chipmunk端口非常容易安装。 当我将代码移植到C ++时,是否很难再切换库? (我将不得不做大的架构改变?)

applyAngularVelocity在对象实例化后立即调用时会导致错误

我试图使一个physicsBody旋转,只要它被实例化。 CCNode* ball = [CCBReader load:@"Ball"]; [ball.physicsBody applyForce:force]; [ball.physicsBody applyAngularImpulse:arc4random_uniform(360) – 180]; 应用强制工作正常,但是最后一行却在cpBody.c引发错误第123行: cpAssertHard(body->w == body->w && cpfabs(body->w) != INFINITY, "Body's angular velocity is invalid."); 当我不施加武力,只是旋转问题依然存在。 如果我稍后(在这种情况下触摸)发送applyAngularImpulse它确实工作。 这个函数不应该在实例化后被调用,或者这是一个错误?

Cocos2dx + Chipmunk:移动物体之间的弹性碰撞

我正在使用Cocos2dx和内置的Chipmunk物理引擎,目前我已经把我的PhysicsBodys的材料设置为: Density=0 Restitution=1 Friction=0 为了获得充分的弹性碰撞,并保持移动的物体以恒定的速度移动。 如果它们与一个静止的元素(如墙壁)相撞,那么这个效果很好,如果它们碰撞到其他移动的物体,那么这个效果就不那么好。 我正在通过应用初始力量来移动这些机构: Vec2 velocity = moveDirection.getNormalized()*moveSpeed – myPhysicsBody->getVelocity(); Vec2 newForce = myPhysicsBody->getMass()*velocity / deltaTime; myPhysicsBody->applyForce(newForce); 所以我猜测,即使他们的材料会导致完全弹性的碰撞,移动的物体都会带来一个冲击力,这会把这个合成的力量修改成不同的大小。 所有这些移动的物体都具有相同的质量。 目前,我正在手动捕捉冲击开始,并在正确的方向上手动生成合成力,并使用对象的速度将其应用于前一个震级,从而有效地凌驾了Chipmunk的冲突解决scheme。 这是做到这一点的最佳方式,还是我可以configuration我的身体,使花栗鼠碰撞解决scheme,以达到相同的效果? 我在物理学上有点生疏..呃..

Cocos2d – 碰撞后,物理体沿着一个轴随机放松Velocity

这只是开始发生,似乎是在游戏期间和之间随机发生的。 一个dynamic的运动物体与一个静态的物体发生碰撞,而不是弹回(几乎完全)松驰,而是碰撞正常的速度。 这意味着dynamic物体开始沿着它刚刚碰撞的静态物体表面移动,并且在最罕见的情况下,它在右前方的第二个墙壁上进行90度转动时是最明显的。 这种行为是非常不稳定的,几乎似乎来来去去之间我的内容相同的代码构建(虽然它可能只是机会),所以我想知道是否可能是一个问题与cocos2d库? 作为参考,我设置这些机构的方式: 对于这两种types,它开始witj: PhysicsBody *pawnBody = PhysicsBody::create(); PawnBody->setDynamic(true); pawnBody->setContactTestBitmask(0xFFFFFFFF); setPhysicsBody(pawnBody); 那么静态的身体代码呢: myBody->removeAllShapes(); PhysicsShapePolygon *colPolygon = PhysicsShapePolygon::create(&spriteVertices[0], 4, PhysicsMaterial(0.f, 1.f, 0.f)); colPolygon->setContactTestBitmask(0xFFFFFFFF); myBody->addShape(colPolygon, false); … getPhysicsBody()->setDynamic(false); 而dynamic的身体代码呢: getPhysicsBody()->removeAllShapes(); PhysicsShapeCircle *circle = PhysicsShapeCircle::create((getScale() * mySprite->getContentSize().width) / 2, PhysicsMaterial(0.f, 1.f, 0.f)); circle->setContactTestBitmask(0xFFFFFFFF); getPhysicsBody()->addShape(circle); … myBody->setVelocityLimit(moveSpeed); myBody->setDynamic(true); 我相信他们都设置正确,以实现完全弹性的碰撞,我敢肯定,这是通过略有不同的stream程(他们没有分享最初的构建代码)在某个时刻的工作。 有没有人遇到类似的行为?

setVelocity后在不同的设备上获得不同的结果(相同的分辨率)

我与物理死亡,我试图使用setVelocity但是我从不同的设备略有不同的价值。 我已经在iPhone 5(模拟器)和iPhone 6(真实设备)上testing过了Director::getInstance()->getOpenGLView()->getFrameSize()返回这两个设备是640×1136像素 但是我看到他们在animation之后有不同的结果,大概有2-5个像素。 我真的不知道为什么。 我正在做一个多人游戏,所以我需要在每个设备上完全相同的对象坐标。 科科斯物理学返回随机结果吗? 深挖后,我意识到,即使我设置一个对象在同一设备的具体速度将返回不同的结果。 所以我不认为这是关于设备,Chipmunk以相同的input参数返回不同的结果!

在cocos2d-x花栗鼠平台游戏中移动玩家的正确方法

我正在尝试使用内置的花栗鼠物理引擎在cocos2d-x中创建一个基于物理的2D平台。 我之前没有使用物理引擎,而且我正在为我的物理机构设置正确的值(质量,摩擦等等),以便我可以让玩家正确移动。 我面临的问题是,当我向地图块体或播放器主体添加任何摩擦力时,播放器移动太慢,几乎看不到。 现在我正在加载一个TMXTileMap,并为每个tile和PhysicsBody创建一个PhysicsBody。 玩家物理机体材质的相关代码: auto physicsBody = PhysicsBody::createCircle(this->getContentSize().width, PhysicsMaterial(0.0f, 0.0f, 1.0f)); 瓦片地图物理实体的相关代码: auto physicsBody = PhysicsBody::createBox(tileSprite->getContentSize(), PhysicsMaterial(0.0f, 0.0f, 0.0f)); physicsBody->setDynamic(false); physicsBody->setGravityEnable(false); 这里是我如何移动播放器: void Player::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event) { log("Key with keycode %d pressed", keyCode); switch(keyCode){ case EventKeyboard::KeyCode::KEY_LEFT_ARROW: _impulseX += -700.0f; break; case EventKeyboard::KeyCode::KEY_RIGHT_ARROW: _impulseX += 700.0f; break; } } void Player::update(float dt) { this->getPhysicsBody()->applyImpulse(Vec2(_impulseX […]

cocos2dx – 滑动并剪切精灵

我正在尝试使用cocos2dx和内置的花栗鼠来实现轻扫和剪切精灵。 对于解决scheme,我做了以下的事情 在场景中启用物理,使身体落在切口上。 使用RayCast剪切PhysicsBody。 我能削减PhysicsBody而不是雪碧。 我想用雪碧来做。 看到我的代码如下 void HelloWorld::startGame(float dt){ LayerColor *pillar=LayerColor::create(Color4B::YELLOW, 100.0, winsize.height*.70); pillar->setPosition(Vec2(winsize.width*0.5,winsize.height*.15)); this->addChild(pillar); Size size=pillar->getContentSize(); PhysicsBody *physicsBody=PhysicsBody::createBox(size,PhysicsMaterial(1.0f,0.0,0.5f),Vec2::ZERO); physicsBody->setGravityEnable(false); pillar->setPhysicsBody(physicsBody); physicsBody->setCategoryBitmask(1); physicsBody->setCollisionBitmask(1); physicsBody->setContactTestBitmask(true); physicsBody->setDynamic(false); physicsBody->setContactTestBitmask(0xFFFFFFFF); //create a ground ground = Node::create(); ground->setPhysicsBody(PhysicsBody::createEdgeSegment(VisibleRect::leftBottom() + Vec2(0, 0), VisibleRect::rightBottom() + Vec2(0, 0),PHYSICSBODY_MATERIAL_DEFAULT,5.0)); this->addChild(ground); ground->setTag(BOUNDARY_TAG); } void HelloWorld::onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *event){ auto func = CC_CALLBACK_3(HelloWorld::slice, this); Vec2 […]

如何在花栗鼠Spacemanager的坡度图像上移动对象(油轮)

在我的游戏中,我使用了一个多边形形状的图像(地形),就像山一样,现在我想把油jar车从一个方向移动到另一个方向,然后开启碰撞,然后向后移动,我没有得到的方法来移动在花栗鼠spacemanager斜坡(图像)path上的油轮。 b。当碰撞检测发生时,如果有任何炸弹落在斜坡上(山的形象),那么我希望像这部影片的斜坡(山的形象)小损坏,我想请看这个video的更多细节。 我已经使用这个代码,但我的对象(油轮)跟随地形path与旋转我想只是像油轮移动和跟随地形path移动。 -(void)AddWheel { cpShape *localPlayerShape; cpCCSprite *localPlayerSprite; localPlayerShape = [mySpaceManager addCircleAt:[self GetStartingWheelPosition] mass:2 radius:7]; localPlayerSprite = [cpCCSprite spriteWithFile:@"enemy1.png"]; localPlayerSprite.shape=localPlayerShape; localPlayerSprite.shape->group=kItemIsPartOfTheTankGroup; localPlayerSprite.shape->collision_type=kItemIsPartOfTheTankGroup; localPlayerSprite.shape->u=4.5; localPlayerSprite.tag=100; [mySpriteLayer addChild:localPlayerSprite z:15]; } 谢谢大家的回复。

在Chipmunk中实现单向平台

我在cocos2d-x中制作游戏,但是这是我第一次使用物理引擎,即Chipmunk。 (这是内置到cocos2d-x。) 我想做一个单向的平台:当我的角色从下面跳进一个平台的时候,它们不应该相互碰撞 ,但是当从上面碰到一个平台的时候,它们就会相互碰撞 。 然后玩家可以从下面跳到平台上,像这样: