2017-03-26 1 views
0

여기 내 문제가 있습니다. 충돌 감지를 위해 Box2d 본문이있는 libGDX에서 Sprite를 확장하는 적 클래스를 만들었습니다. 내 코드는 게임 내에서 루프 내에서 동적으로 적 클래스를 호출하지만 문제는 충돌 후 다른 애니메이션 시퀀스를 사용하여 패배 한 적을 묘사 할 때 애니메이션 시퀀스가 ​​동일한 클래스의 여러 인스턴스에 대해 서로 다른 프레임 속도를 표시한다는 것입니다. 나는 그것이 왜 일어나고 있는지 모른다.libGDX 및 box2d에서 다른 애니메이션 프레임을 표시하는 동일한 스프라이트 클래스의 여러 인스턴스

다음은 루프에서 호출되는 클래스입니다.

public class Spearman extends Enemies { 
    private Body spearman1; 
    private TextureAtlas atlas; 
    private Animation approaching,defeated; 
    private float time; 
    private TextureRegion spearmaninit; 

    private int spearmanstate=0; 


    public Spearman(Play_State state,float x, float y){ 
     super(state,x,y); 
     atlas=new TextureAtlas(); 
     atlas=Lone_Warrior1.getAtlas(3); 
     time=0f; 

     Array<TextureRegion> frames=new Array<TextureRegion>(); 
     for(int i=0;i<3;i++) 
     { 
      frames.add(new TextureRegion(atlas.findRegion("Spearman"+i))); 
     } 
     approaching=new Animation(0.15f,frames); 
     frames.clear(); 
     for(int i=0;i<5;i++) 
     { 
     frames.add(new       TextureRegion(atlas.findRegion("Spearmandefeated"+i))); 
     } 
     defeated=new Animation(2.2f,frames); 
     frames.clear(); 
     spearmaninit=new TextureRegion(atlas.findRegion("Spearman0")); 
     setBounds(getX(),getY(),200/ Lone_Warrior1.PPM,170/Lone_Warrior1.PPM); 
     setRegion(spearmaninit); 

    } 

    public void update(float dt){ 

     if(spearmanstate!=-1) { 
      setPosition(spearman1.getPosition().x - getWidth()/2,  (spearman1.getPosition().y - getHeight()/2)+13/Lone_Warrior1.PPM); 
      if (spearmanstate==0 && spearman1.getLinearVelocity().x>0) 
       spearmanstate=1; 
      if (spearmanstate==1 && spearman1.getLinearVelocity().x==0) { 
       Play_State.bodiesToRemove.add(spearman1); 
       Play_State.enemycounter++; 
       spearmanstate = -1; 

      } 
      if(spearmanstate==0) 
       spearman1.setLinearVelocity(-2f,0); 
      setRegion(getFrame(dt)); 
     } 
    } 
    public boolean check(){ 
     if(spearmanstate!=-1) 
      return true; 
    else 
     return false; 
    } 
    public TextureRegion getFrame(float dt){ 
     TextureRegion region=null; 
     region=approaching.getKeyFrame(time,true); 
     if(spearmanstate==1) 
      region=defeated.getKeyFrame(time); 
     /* if(!region.isFlipX()) 
     region.flip(true,false);*/ 
     time=time+dt; 
     return region; 

    } 

    @Override 
    public void defineEnemy() { 
     BodyDef bdef=new BodyDef(); 
     bdef.position.set(getX(),getY()); 
     bdef.type=BodyDef.BodyType.DynamicBody; 
     spearman1=Play_State.world.createBody(bdef); 

     FixtureDef fdef=new FixtureDef(); 
     PolygonShape War1=new PolygonShape(); 
     War1.setAsBox(60/Lone_Warrior1.PPM,60/Lone_Warrior1.PPM); 

     fdef.shape=War1; 
     fdef.filter.categoryBits=Lone_Warrior1.BIT_APPROACHING; 
       fdef.filter.maskBits=Lone_Warrior1.BIT_GROUND|Lone_Warrior1.BIT_RUN|Lone_Warrior  1.BIT_ATTACK; 
     spearman1.createFixture(fdef).setUserData("spearman1"); 

    } 

    } 

스피어를 호출하는 추상 클래스 : 여기

public abstract class Enemies extends Sprite { 
    World world; 
    Body b2body; 
    public Enemies(){ 

    } 
    public Enemies(Play_State screen,float x, float y){ 
     this.world=screen.world; 
     setPosition(x,y); 
     defineEnemy(); 
    } 

    public abstract void defineEnemy(); 
    public abstract void update(float dt); 
    public abstract boolean check(); 
} 

클래스를 호출하는 코드입니다.

switch (a) { 
      case 1: 
       System.out.println("creating spearman"); 
       spearman.add(new Spearman(screen, (Lone_Warrior1.V_Width /Lone_Warrior1.PPM) + (Lone_Warrior1.x+``(i*500/Lone_Warrior1.PPM)), 100/  Lone_Warrior1.PPM)); 
       break; 
       } 
+0

Sprite 클래스를 사용하지 말 것을 적극 권장합니다. Sprite는 위치, 방향 및 색상 데이터를 모두 포함하는지지 배열이있는 TextureRegion 하위 클래스입니다. 중복 된 데이터를 발생시키고 오류가 발생하기 쉽기 때문에 게임 엔티티의 기본 클래스로 사용하는 것은 실제로 적절하지 않습니다. TextureRegion ** 또는 ** Animation을 참조하고 위치, 색상, 방향 등을위한 필드가있는 기본 클래스를 만듭니다. – Tenfour04

답변

0

해결!

예, Sprite 클래스는 프레임 별 애니메이션에 약간 문제가 있지만 이미 많은 코드를 작성 했으므로 전체 코드를 다시 작성해야하는 대신이 문제에 대한 패치 작업을 찾아야했습니다. 업데이트 방법에 델타 시간을 사용하여 시간을 업데이트 할 때마다

time=currentState==previousState ? time+dt : 0; 
    previousState=currentState; 

것은, 현재의 애니메이션 시퀀스가 ​​이전에 동일한 경우는 다음하지 있는지 확인해야합니다 : 그래서 여기

는 답변입니다 콜리 전 후 다음 애니메이션이 의도 한 순서대로 재생됩니다. 현재 상태에 대한 추적기를 넣으십시오.

int State=1://the default form for player 
    State=2;//the state of animation when the player is hit` 
` currentState=State; 
관련 문제