Java libgdx赢得';不要绘制精灵或动画
看起来好像我无法让画法发挥作用??? 看起来好像是子弹。画(巴彻) 不起作用,我不明白为什么,因为子弹是一个精灵。 我制作了一个精灵[],并将其添加为动画。 是吗 我试过了Java libgdx赢得';不要绘制精灵或动画,java,android,libgdx,draw,Java,Android,Libgdx,Draw,看起来好像我无法让画法发挥作用??? 看起来好像是子弹。画(巴彻) 不起作用,我不明白为什么,因为子弹是一个精灵。 我制作了一个精灵[],并将其添加为动画。 是吗 我试过了 batcher.draw(AssetLoader.bulletAnimation.getKeyFrame(runTime), bullet.getX(), bullet.getY(), bullet.getOriginX() / 2, bullet.getOriginY() / 2, bullet.getWidth(), b
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;
}
}
无论如何,有没有让精灵工作的方法
我正在添加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));
}
}
关键帧保存在一个名为“子弹”的数组中,但当调用动画构造函数时,会传递一个名为“aims”的参数作为第二个参数。您应该尝试传递“子弹”,如:
bulletAnimation = new Animation(0.06f,bullets);
我认为,使用Sprite[]应该不会有问题,因为Sprite类扩展了TextureRegion
------OP修正了打字错误,但仍然不起作用------
我认为问题在于batcher.draw()调用的原始参数。精灵的位置相对于精灵棒坐标系的原点,精灵的原点相对于该位置(即精灵矩形的左下角)。要在精灵的中心获得原点,我认为originX应该是宽度/2,originY应该是高度/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”类-----
在draw方法中调用bullet.getWidth()
和bullet.getHeight()
时,它们将返回0.0f,因为您尚未为它们指定值。记住,您实际绘制的精灵是AssetLoader类中的bullet1和bullet2。尝试使用以下设置项目符号的宽度和高度:
setSize(AssetLoader.bullet1.getWidth(), AssetLoader.bullet1.getHeight());
在你的子弹里
我认为您也不需要在bullet类中使用setRegion()
,因为您实际绘制的精灵是bullet1和2
祝你好运 尝试将更新方法更改为此
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());
这会让你的代码变得干净一点你也可以发布图片吗?在哪里发布图片?在游戏中?然后是的,但它们是纹理区域,不能旋转纹理区域。有一种方法,但它对我来说太难了。对不起,这是一个打字错误,我正在传递子弹,但如果我使用子弹,它仍然不会画;我也不知道你用bullet.getOriginX/Y做什么,为什么你要把这个值减半?当然,函数首先返回缩放/旋转的原点?这些函数返回什么?我不知道我被告知要尝试,但即使没有,它也不会绘制。谢谢你的回复,我已经尝试了该方法,子弹不会在画布上绘制。我试着只使用一个png精灵,但它仍然不会旋转,所以它要么没有在屏幕上正确绘制,要么它们在bullet类中丢失了一些东西。如何通过数学旋转图像是解决方案。再次感谢你Hi ArthurBrown我添加了子弹类也许有什么东西会导致这个????