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