Как я могу оживить круг с PlayN? - PullRequest
0 голосов
/ 29 февраля 2012

Это продолжение моего последнего вопроса:

Как нарисовать круг на экране с помощью PlayN?

В моем простом случае я хочу программно создать один цветной круг и переместить его по двухмерной плоскости (не нужно использовать box2d lib).

Пример из реальной жизни, вероятно, включает анимацию нескольких кругов Два реальных примера для этого случая ( извините, мне пришлось удалить ссылки - недостаточно кармы! ):

  • Browsmos для Chrome
  • Ants AI Challenge

В ответ на мой последний вопрос было предложено использовать класс ImmediateLayer , поэтому я хочу понять, как правильно включить это в мой игровой цикл.

Вот мой пример кода:

public class SimpleCircleAnimation implements Game {

    // Surface    
    private GroupLayer rootLayer;
    private ImmediateLayer surface;
    private Canvas canvas;

    private Circle circle;
    private CanvasImage circleImage;        

    @Override
    public void init() {
        // create root layer
        rootLayer = graphics().rootLayer();

        // a simple circle object
        int circleX = 0; int circleY = 0;
        int circleRadius = 20;
        circle = new Circle(circleX, circleY, circleRadius);

        // create an immediate layer and add to root layer
        ImmediateLayer circleLayer = graphics().createImmediateLayer(new ImmediateLayer.Renderer() {
            public void render (Surface surf) {
                circleImage = graphics().createImage(circle.radius*2,  circle.radius*2);
                canvas = circleImage.canvas();
                canvas.setFillColor(0xff0000eb);
                canvas.fillCircle(circle.radius, circle.radius, circle.radius);
                surf.drawImage(circleImage, circle.x, circle.y);
            }
        });
        rootLayer.add(circleLayer);
    }

    @Override
    public void paint(float alpha) {
    }

    @Override
    public void update(float delta) {
        // move circle
        int newX = circle.x + 4; int newY = circle.y + 4;
        circle.setPoint(newX, newY);
    }

    @Override
    public int updateRate() {
        return 25;
    }
}

Это успешно перемещает круг по диагонали вниз по экрану слева направо. Пара вопросов:

  • Правильно ли это реализовано?
  • В случае нескольких анимированных кругов, есть ли идея с ImmediateLayer, что вы создадите изображение круга для каждого круга в обратном вызове рендерера? Или вы могли бы создать Немедленный слой для каждого круга и добавить их в корневой слой?

Ответы [ 2 ]

0 голосов
/ 03 марта 2012

Я обнаружил подробный практический пример использования ImmediateLayer в источнике Cute Game в PlayN Samples:

CuteGame.java (code.google.com)

0 голосов
/ 02 марта 2012

Я бы не использовал ImmediateLayer с адаптером рендеринга (Surface surf). Здесь у вас есть, внутри метода рендера создание изображения

circleImage = graphics().createImage(circle.radius*2,  circle.radius*2);

просто поместите это в метод рисования

surf.drawImage(circleImage, circle.x, circle.y);

используя нормальный слой и у вас должно быть все в порядке

Покраска производится методом рисования, и не ставьте там расчеты Обновление для расчетов и физики ориентированных вещей

...