У меня есть звездное поле для игры в боковой скроллер. Звезды движутся справа налево. Существует три типа звезд: быстрый, нормальный и медленный, имитирующий эффект параллакса. В зависимости от их типа они имеют разные цвета и скорости.
Пока все работает нормально, но звезды остаются черными.
Код звездного поля:
public class Starfield extends AbstractGameObject {
public static final String TAG = Starfield.class.getName();
private Array<Star> stars;
public enum STAR_TYPE {
FAST(255, 255, 255),
NORMAL(190, 190, 190),
SLOW(120, 120, 120);
private int color;
private STAR_TYPE(int r, int g, int b) {
int R = r << 24;
int G = g << 16;
int B = b << 8;
color = R | G | B | 0xff;
//color = r << 24 | g << 16 | b << 8 | 0xff;
}
public static STAR_TYPE getRandomType() {
return values()[MathUtils.random(0, values().length - 1)];
}
public int getColor() {
return color;
}
}
public Starfield() {
init();
}
private void init() {
stars = new Array<Star>();
for(int i = 1; i <= Constants.COUNT_STARS; i++){
stars.add(new Star());
}
}
@Override
public void update(float deltaTime) {
super.update(deltaTime);
for(Star star : stars){
star.update(deltaTime);
}
}
@Override
public void render(SpriteBatch batch) {
for (Star star : stars)
star.render(batch);
}
public class Star extends AbstractGameObject {
private STAR_TYPE starType;
private Texture texStar;
public Star() {
init();
}
private void init() {
Pixmap pixmap;
position.set(MathUtils.random() * Constants.WORLD_WIDTH, MathUtils.random() * Constants.WORLD_HEIGHT);
dimension.set(0.02f, 0.02f);
starType = STAR_TYPE.getRandomType();
pixmap = new Pixmap((int) dimension.x, (int) dimension.y, Pixmap.Format.RGBA8888);
pixmap.setColor(starType.getColor());
pixmap.fill();
texStar = new Texture(pixmap);
switch (starType) {
case FAST:
velocity.set(-0.5f, 0);
break;
case NORMAL:
velocity.set(-0.2f, 0);
break;
case SLOW:
velocity.set(-0.1f, 0);
break;
}
}
@Override
public void update(float deltaTime) {
super.update(deltaTime);
if(position.x <= 0)
position.x = Constants.WORLD_WIDTH;
}
@Override
public void render(SpriteBatch batch) {
batch.draw(texStar, position.x, position.y, dimension.x, dimension.y);
}
}
}
Мне было интересно, работает ли сдвиг бит правильно, но работает ли он. Затем я вручную изменил цвет на что-то вроде pixmap.setColor(1, 0, 0, 1);
. Звезды остались черными. Я отладил метод рендеринга и заглянул в texStar. Растровое изображение сохраняется правильно, включая ранее выбранный цвет (я могу исключить возможность переопределения цвета в других частях моего кода). Я подозревал, что метод рисования был неправильным, и вместо этого использовал batch.draw(texStar, position.x, position.y);
. Но потом все звезды почему-то исчезли. Я не понимаю почему, потому что текстура должна иметь размер растрового изображения (0.02f). Общий метод рендеринга renderWorld выглядит следующим образом:
private void renderWorld (SpriteBatch batch) {
worldController.camerHelper.applyTo(camera);
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.draw(texBorder, 0, 0);
worldController.starfield.render(batch);
batch.end();
}
Кстати, текстура texBorder, состоящая из пары цветных прямоугольников, нарисована просто отлично. Любые мысли, что может быть причиной такого поведения?