AS3와 box2D를 사용하여 플랫 포머 게임을 만들고 있습니다. 알아낼 수없는 이상한 문제가 있습니다. 캐릭터는 끊임없이 달리고 있으며 터치하면 점프합니다. 그러나 높은 지점에서 점프 할 때 캐릭터는 중력 아래에서 떨어지는 동안 수평 속도를 느슨하게하고지면에 닿을 때까지 Y 축에서만 이동 한 다음 달리기를 다시 시작합니다. 이상한 점은 중력을 줄이면 그런 효과가 없다는 것입니다. 밀도와 마찰을 가지고 놀아 보았습니다. 또한 댐핑이 없습니다.
점프 및 낙하 및 속도 문제와 관련된 가능한 모든 box2d 문제를 검색했습니다. 아무것도 찾을 수 없습니다.
다음은 캐릭터 이동에 대한 코드입니다. 중력은 20이고 타임 스텝은 1/15입니다.
public class HeroModel extends GameObjectModel
{
public var isJumping:Boolean = false;
public var isAlive:Boolean = true;
public var forwardForce:b2Vec2;
public var decreasingForceY:Number = -200;
public var decreasingForceX:Number = 100;
public var startPos:Point;
public var jumps:Number = 1;
public function HeroModel()
{
super();
}
override public function initFrom(initObj:Object, world:b2World):void
{
super.initFrom(initObj, world);
var filterdata:b2FilterData = new b2FilterData();
filterdata.groupIndex = 1;
filterdata.maskBits = 1;
physicsBody.GetFixtureList().SetRestitution(0);
physicsBody.GetFixtureList().SetDensity(0);
physicsBody.GetFixtureList().SetFriction(0);
physicsBody.GetFixtureList().SetFilterData(filterdata);
physicsBody.SetType(b2Body.b2_dynamicBody);
physicsBody.SetBullet(true);
applyForwardForce();
physicsBody.SetUserData(this);
startPos = new Point(this.physicsBody.GetPosition().x, this.physicsBody.GetPosition().y);
}
public function die():void
{
//TODO Empty function.?
}
public function applyForwardForce():void
{
forwardForce = new b2Vec2(200,0);
physicsBody.ApplyForce(forwardForce, new b2Vec2(0,0));
}
public function jump(e:EnterFrameEvent):void
{
if(decreasingForceY < 0 && decreasingForceX > 75)
{
physicsBody.ApplyImpulse(new b2Vec2(decreasingForceX, decreasingForceY), new b2Vec2(0,0));
decreasingForceY+=5;
decreasingForceX-=2.5;
}
}
public function resetVelocity():void
{
decreasingForceX = 100;
decreasingForceY = -200;
}
}
게임의 스크린 샷입니다. 빨간색은 일어나는 일이고 녹색은 내가 원하는 것입니다.
내가 착각 한 아이디어가 있습니까? :)
SetLinearVelocity를 사용하여 수정했습니다. 이제 모두 좋습니다. :)
public function jump(e:EnterFrameEvent):void
{
if (!singleJump)
{
physicsBody.IsAwake();
physicsBody.IsBullet();
physicsBody.SetLinearVelocity(new V2(75, -200));
physicsBody.GetLinearVelocity();
trace(physicsBody.GetLinearVelocity().x);
trace(physicsBody.GetLinearVelocity().y);
singleJump = true;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다