2014-06-07 90 views
1

它似乎好像我不能得到繪製方法工作? 它看起來好像bullet.draw(批次) 不起作用,我不明白爲什麼作爲子彈是一個精靈。 我做了一個Sprite []並將它們添加爲動畫。 可以嗎?libgdx不會繪製精靈或動畫

我試圖

batcher.draw(AssetLoader.bulletAnimation.getKeyFrame(runTime), bullet.getX(), bullet.getY(), bullet.getOriginX()/2, bullet.getOriginY()/2, bullet.getWidth(), bullet.getHeight(), 1, 1, bullet.getRotation()); 

但不工作,它吸引的唯一途徑是這樣的

batcher.draw(AssetLoader.bulletAnimation.getKeyFrame(runTime), bullet.getX(), bullet.getY()); 

下面是代碼。

//這是在資產類別

texture = new Texture(Gdx.files.internal("SpriteN1.png")); 
texture.setFilter(TextureFilter.Nearest, TextureFilter.Nearest); 

bullet1 = new Sprite(texture, 380, 350, 45, 20); 
bullet1.flip(false, true); 

bullet2 = new Sprite(texture, 425, 350, 45, 20); 
bullet2.flip(false, true); 

Sprite[] bullets = { bullet1, bullet2 }; 
bulletAnimation = new Animation(0.06f, bullets); 
bulletAnimation.setPlayMode(Animation.PlayMode.LOOP); 

//這是GameRender類

public class GameRender() { 
private Bullet bullet; 
private Ball ball; 

public GameRenderer(GameWorld world) { 
myWorld = world; 
cam = new OrthographicCamera(); 
cam.setToOrtho(true, 480, 320); 

batcher = new SpriteBatch(); 
// Attach batcher to camera 
batcher.setProjectionMatrix(cam.combined); 

shapeRenderer = new ShapeRenderer(); 
shapeRenderer.setProjectionMatrix(cam.combined); 

// Call helper methods to initialize instance variables 
initGameObjects(); 
initAssets(); 
} 

private void initGameObjects() { 
ball = GameWorld.getBall(); 
bullet = myWorld.getBullet(); 
scroller = myWorld.getScroller(); 
} 

private void initAssets() { 
ballAnimation = AssetLoader.ballAnimation; 
bulletAnimation = AssetLoader.bulletAnimation; 
} 

public void render(float runTime) { 

Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT); 

batcher.begin(); 
// Disable transparency 
// This is good for performance when drawing images that do not require 
// transparency. 
batcher.disableBlending(); 

// The ball needs transparency, so we enable that again. 
batcher.enableBlending(); 


batcher.draw(AssetLoader.ballAnimation.getKeyFrame(runTime), ball.getX(), ball.getY(),   ball.getWidth(), ball.getHeight()); 

batcher.draw(AssetLoader.bulletAnimation.getKeyFrame(runTime), bullet.getX(),  bullet.getY()); 

// End SpriteBatch 
batcher.end(); 
} 
} 

//這是遊戲世界類

public class GameWorld { 

public static Ball ball; 
private Bullet bullet; 
private ScrollHandler scroller; 

public GameWorld() { 
ball = new Ball(480, 273, 32, 32); 
bullet = new Bullet(10, 10); 
scroller = new ScrollHandler(0); 
} 

public void update(float delta) { 
ball.update(delta); 
bullet.update(delta); 
scroller.update(delta); 
} 

public static Ball getBall() { 
return ball; 
} 

public ScrollHandler getScroller() { 
return scroller; 
} 

public Bullet getBullet() { 
return bullet; 
} 
} 

反正是有所以使精靈工作?

我正在添加子彈類來查看是否有可能出現錯誤。

public class Bullet extends Sprite { 

public static final float BULLET_HOMING = 6000; 
public static final float BULLET_SPEED = 300; 
private Vector2 velocity; 
private float lifetime; 

public Bullet(float x, float y) { 
    velocity = new Vector2(0, 0); 
    setPosition(x, y); 
} 

public void update(float delta) { 
    float targetX = GameWorld.getBall().getX(); 
    float targetY = GameWorld.getBall().getY(); 
    float dx = targetX - getX(); 
    float dy = targetY - getY(); 

    float distToTarget = (float) Math.sqrt(dx * dx + dy * dy); 
    dx /= distToTarget; 
    dy /= distToTarget; 
    dx *= BULLET_HOMING; 
    dy *= BULLET_HOMING; 
    velocity.x += dx * delta; 
    velocity.y += dy * delta; 

    float vMag = (float) Math.sqrt(velocity.x * velocity.x + velocity.y * velocity.y); 
    velocity.x /= vMag; 
    velocity.y /= vMag; 
    velocity.x *= BULLET_SPEED; 
    velocity.y *= BULLET_SPEED; 

    Vector2 v = velocity.cpy().scl(delta); 
    setPosition(getX() + v.x, getY() + v.y); 
    setOriginCenter(); 
    setRotation(velocity.angle()); 
    lifetime += delta; 
    setRegion(AssetLoader.bulletAnimation.getKeyFrame(lifetime)); 
} 
} 
+0

你可以發表圖片? –

+0

張貼圖片在哪裏?在遊戲上?那麼是的,但他們是TextureRegions,你不能旋轉textureRegions。有一種方法,但對我來說太難了。 –

回答

2

你的關鍵幀都保存在一個數組叫子彈,但是當你調用動畫構造你通過一些所謂的「目標」作爲第二個參數。你應該嘗試而不是將「子彈」,如:

bulletAnimation = new Animation(0.06f,bullets); 

你不應該有一個問題,使用雪碧[]作爲Sprite類用於擴展TextureRegion我想。

------ OP固定錯字,仍然沒有工作------

我認爲這個問題會隨着batcher.draw()呼叫的起源爭論。 Sprite的位置相對於SpriteBatch座標系的原點,並且Sprite的原點與該位置(即Sprite矩形的左下角)相關。爲了得到雪碧中心的原點,我認爲originX應該是width/2,originY應該是height/2。因此,嘗試:

batcher.draw(AssetLoader.bulletAnimation.getKeyFrame(runTime),bullet.getX(),bullet.getY(), bullet.getWidth()/2,bullet.getHeight()/2,bullet.getWidth(),bullet.getHeight(),1,1,bullet.getRotation()); 

因爲如果你getOriginX/Y方法返回相對於SpriteBatcher的座標系(屏幕座標)的起源,那麼你的精靈可以旋轉和周圍的一些荒謬的起源縮放,並最終正在脫離屏幕。

我希望我是對的,它的問題解決了。

----- OP發佈進一步的代碼中,「子彈」類-----

當你打電話bullet.getWidth()bullet.getHeight()在抽籤方法,這些將返回0.0F,因爲你沒有指定值。記住您實際繪製的精靈是來自AssetLoader類的bullet1和bullet2。嘗試設置子彈的寬度和高度:

setSize(AssetLoader.bullet1.getWidth(), AssetLoader.bullet1.getHeight()); 

在您的項目符號構造函數。

我不認爲你需要在你的子彈類使用setRegion()要麼,再次,因爲你實際繪製的精靈是bullet1和2

手指交叉。

+0

對不起,這是一個錯字我正在傳球,但它仍然不會畫,如果我使用bullet.draw(batcher); –

+0

我無法弄清楚你用bullet.getOriginX/Y做了什麼,爲什麼你這半值?這個函數當然會首先返回縮放/旋轉的原點?這些函數返回什麼? – ArthurBrown

+0

我不知道我被告知嘗試,但即使沒有,它不繪製。 –

0

嘗試改變的更新方法本

Vector2 target = new Vector2(GameWorld.getBall().getX(), GameWorld.getBall().getY()); 
    target.sub(getX(), getY()); 
    target.nor().scl(BULLET_HOMING); 
    velocity.add(target.scl(delta)); 
    velocity.nor().scl(BULLET_SPEED); 

    Vector2 v = velocity.cpy().scl(delta); 
    translate(v.x, v.y); 

    setOriginCenter(); 
    setRotation(velocity.angle()); 

應該太乾淨你的代碼有點