Libgdx 补间问题
Libgdx tweening issue
我正在创建游戏并尝试设置启动画面。
每当我使用 sprite.draw 方法渲染我想要补间的精灵时,如下所示:
@Override
public void render(float delta)
{
Gdx.gl20.glClearColor(0.2F, 0.5F, 1F, 1F);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
tm.update(delta);
cam.update();
sb.setProjectionMatrix(cam.combined);
sb.begin();
Assets.splash_spr_bg.draw(sb);
sb.end();
}
补间效果很好,但我只能在屏幕上看到图片的 1/4,完全错位了。
每当我尝试使用此代码通过使用 spritebatch 绘制精灵来渲染它时,它看起来像这样:
@Override
public void render(float delta)
{
Gdx.gl20.glClearColor(0.2F, 0.5F, 1F, 1F);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
tm.update(delta);
cam.update();
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(Assets.splash_spr_bg, 0, 0);
sb.end();
}
我可以看到背景很棒、质量很好、大小和位置正确等等。但是,补间根本不起作用;没有任何反应。
为什么这不起作用?我该如何解决?
这是一些其他代码。
TweenHandler 初始化class:
package com.heavenapps.jumpdodge.handlers;
import com.badlogic.gdx.graphics.g2d.Sprite;
import aurelienribon.tweenengine.TweenAccessor;
public class TweenHandler implements TweenAccessor<Sprite>
{
public static final int ALPHA = 1;
@Override
public int getValues(Sprite target, int tweenType, float[] returnValues)
{
switch(tweenType)
{
case ALPHA:
returnValues[0] = target.getColor().a;
return 1;
default:
return 0;
}
}
@Override
public void setValues(Sprite target, int tweenType, float[] newValues)
{
switch(tweenType)
{
case ALPHA:
target.setColor(1, 1, 1, newValues[0]);
break;
}
}
}
初始化 sprite/texture:
package com.heavenapps.jumpdodge.handlers;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
public class Assets
{
public static Texture splash_tex_bg;
public static Sprite splash_spr_bg;
public static void init()
{
// Splash Screen
splash_tex_bg = new Texture(Gdx.files.internal("Splash Screen/Background.png"));
splash_tex_bg.setFilter(TextureFilter.Linear, TextureFilter.Linear);
splash_spr_bg = new Sprite(splash_tex_bg);
splash_spr_bg.setOrigin(splash_spr_bg.getWidth() / 2, splash_spr_bg.getHeight() / 2);
splash_spr_bg.setPosition(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
splash_spr_bg.setColor(1, 1, 1, 0);
}
}
补间的用法:
public void fadeSplashScreen()
{
Tween.to(Assets.splash_spr_bg, TweenHandler.ALPHA, 2F).target(1).ease(TweenEquations.easeInBounce).start(tm);
}
如果要使用第一种方法绘制精灵,则需要设置精灵的位置。 (sprite.draw(spriteBatch)
)。如果你想使用由补间控制的精灵颜色,你需要使用第一种方法。
看起来你确实给了背景精灵一个初始位置,但你把它放在了屏幕之外。所以改变
splash_spr_bg.setPosition(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
到
splash_spr_bg.setPosition(0, 0);
您展示的第二种方法 (spriteBatch.draw(sprite, x, y)
) 将其绘制在正确位置的原因是这种绘制方法忽略了它是精灵的事实,而只绘制精灵拥有的纹理区域你给它的位置。而且此方法不会使精灵褪色,因为它忽略了它是精灵(具有颜色)这一事实。
我正在创建游戏并尝试设置启动画面。
每当我使用 sprite.draw 方法渲染我想要补间的精灵时,如下所示:
@Override
public void render(float delta)
{
Gdx.gl20.glClearColor(0.2F, 0.5F, 1F, 1F);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
tm.update(delta);
cam.update();
sb.setProjectionMatrix(cam.combined);
sb.begin();
Assets.splash_spr_bg.draw(sb);
sb.end();
}
补间效果很好,但我只能在屏幕上看到图片的 1/4,完全错位了。
每当我尝试使用此代码通过使用 spritebatch 绘制精灵来渲染它时,它看起来像这样:
@Override
public void render(float delta)
{
Gdx.gl20.glClearColor(0.2F, 0.5F, 1F, 1F);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
tm.update(delta);
cam.update();
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(Assets.splash_spr_bg, 0, 0);
sb.end();
}
我可以看到背景很棒、质量很好、大小和位置正确等等。但是,补间根本不起作用;没有任何反应。
为什么这不起作用?我该如何解决?
这是一些其他代码。
TweenHandler 初始化class:
package com.heavenapps.jumpdodge.handlers;
import com.badlogic.gdx.graphics.g2d.Sprite;
import aurelienribon.tweenengine.TweenAccessor;
public class TweenHandler implements TweenAccessor<Sprite>
{
public static final int ALPHA = 1;
@Override
public int getValues(Sprite target, int tweenType, float[] returnValues)
{
switch(tweenType)
{
case ALPHA:
returnValues[0] = target.getColor().a;
return 1;
default:
return 0;
}
}
@Override
public void setValues(Sprite target, int tweenType, float[] newValues)
{
switch(tweenType)
{
case ALPHA:
target.setColor(1, 1, 1, newValues[0]);
break;
}
}
}
初始化 sprite/texture:
package com.heavenapps.jumpdodge.handlers;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureFilter;
import com.badlogic.gdx.graphics.g2d.Sprite;
public class Assets
{
public static Texture splash_tex_bg;
public static Sprite splash_spr_bg;
public static void init()
{
// Splash Screen
splash_tex_bg = new Texture(Gdx.files.internal("Splash Screen/Background.png"));
splash_tex_bg.setFilter(TextureFilter.Linear, TextureFilter.Linear);
splash_spr_bg = new Sprite(splash_tex_bg);
splash_spr_bg.setOrigin(splash_spr_bg.getWidth() / 2, splash_spr_bg.getHeight() / 2);
splash_spr_bg.setPosition(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
splash_spr_bg.setColor(1, 1, 1, 0);
}
}
补间的用法:
public void fadeSplashScreen()
{
Tween.to(Assets.splash_spr_bg, TweenHandler.ALPHA, 2F).target(1).ease(TweenEquations.easeInBounce).start(tm);
}
如果要使用第一种方法绘制精灵,则需要设置精灵的位置。 (sprite.draw(spriteBatch)
)。如果你想使用由补间控制的精灵颜色,你需要使用第一种方法。
看起来你确实给了背景精灵一个初始位置,但你把它放在了屏幕之外。所以改变
splash_spr_bg.setPosition(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
到
splash_spr_bg.setPosition(0, 0);
您展示的第二种方法 (spriteBatch.draw(sprite, x, y)
) 将其绘制在正确位置的原因是这种绘制方法忽略了它是精灵的事实,而只绘制精灵拥有的纹理区域你给它的位置。而且此方法不会使精灵褪色,因为它忽略了它是精灵(具有颜色)这一事实。