2012-02-29 2 views
0

Это является продолжением моего предыдущего вопроса:Как я могу анимировать круг с помощью PlayN?

How can I draw a circle to the screen with PlayN?

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

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

  • Browsmos для Chrome
  • Ants AI Вызов

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

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

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 заключается в том, что вы создавали бы круглое изображение для каждого круга в обратном вызове Renderer? Или вы могли бы создать Immediate Layer для каждого круга и добавить их к корневому слою?
+0

Давайте посмотрим, если я могу добавить пример ссылки здесь: [Browsmos] (HTTP: // html5games. com/2011/06/browsmos /), [Ant AI Challenge] (http://aichallenge.org/visualizer.php?game=346330) – klenwell

ответ

0

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

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

просто положить это в методе краски

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

используя обычный слой и у должны быть хорошо

Живопись выполняется по методу краски, и не ставьте там расчеты Обновление предназначено для расчетов, а физико-ориентированные объекты

+0

Спасибо за ответ. Этот совет противоречит тому, что дал @samskivert здесь: http://stackoverflow.com/a/9486105/1093087. В данном случае я полагаю, что использование ImmediateLayer улучшит производительность. – klenwell

+0

чем услышать ответ от samskivert ...я не знаю, что такое устная точная реализация, но если он говорит, что он должен быть немедленным, он, скорее всего, прав. – Darwly

+0

. В моем конкретном случае создавалось образы программно (рисовать круг, перемещать его), а не анимировать загруженные файлы изображений/спрайты. Однако CuteGame использует загруженные изображения с ImmediateLayer, поэтому я не совсем уверен, что аргумент против использования ImmediateLayer. – klenwell