2012-02-09 3 views
0

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

1) Когда я комментирую/удаляю «setSourceRect», он отображает полное изображение. 2) функция initnails не отображает ничего

package com.myGame.mavenproject3.core; 
import org.jbox2d.collision.shapes.CircleShape; 
import playn.core.*; 
import static playn.core.PlayN.assetManager; 
import static playn.core.PlayN.graphics; 

public class mavenproject3 implements Game { 
Canvas canvas; 
    private float radius; 
    Image pointsFontImage; 
GroupLayer pointsLayer; 
@Override 
    public void init() { 
// create and add background image layer 
int width = 640; 
int height = 480; 
CanvasImage bgImage = graphics().createImage(width, height); 
canvas = bgImage.canvas(); 
canvas.setFillColor(0xff87ceeb); 
canvas.fillRect(0, 0, width, height); 
ImageLayer bg = graphics().createImageLayer(bgImage); 
graphics().rootLayer().add(bg); 
pointsLayer = graphics().createGroupLayer(); 
    pointsLayer.setScale(3.0f, 3.0f); 
    pointsFontImage = assetManager().getImage("images/font.png"); 
    graphics().rootLayer().add(pointsLayer); 
    } 
    @Override 
    public void paint(float alpha) { 
// the background automatically paints itself, so no need to do 
anything here! 
    } 
int points = 50; 
    @Override 
    public void update(float delta) { 
    initNails(); 
    float x = 0f; 
    pointsLayer.clear(); 
    for (char c : Integer.toString(points).toCharArray()) { 
    ImageLayer digit = graphics().createImageLayer(pointsFontImage); 
    digit.setSourceRect(((c - '0' + 9) % 10) * 16, 0, 16, 16); 
    pointsLayer.add(digit); 
    digit.setTranslation(x, 0f); 
    x += 16f; 
    } 
    } 
    @Override 
    public int updateRate() { 
    return 25; 
    } 
    public void initNails() { 
    for (int x = 100; x < 300 - 100; x += 50) { 
    for (int y = 150; y < 450; y+= 100) { 
     canvas.setFillColor(0xffaaaaaa); 
     canvas.fillCircle(x, y, radius); 
    CircleShape circleShape = new CircleShape(); 
    circleShape.m_radius = 5f*2; 
    circleShape.m_p.set(x*2, 
         y*2); 
    } 
    } 
    } 
} 

ответ

0

В дополнение к настройке источника прямоугольник, вам необходимо установить целевые размеры слоя изображения, в противном случае они будут такими же, как размер исходного изображения , Исходное изображение 160x16, но вы хотите сделать один символ, так что вы должны иметь 16x16:

ImageLayer digit = graphics().createImageLayer(pointsFontImage); 
digit.setSourceRect(((c - '0' + 9) % 10) * 16, 0, 16, 16); 
digit.setWidth(16); 
digit.setHeight(16); 
pointsLayer.add(digit); 
digit.setTranslation(x, 0f); 

Я также не могу сопротивляться, указывая на то, что это чрезвычайно неэффективно несколько способов.

Метод update() работает 60 раз в секунду (в идеальном мире). Вы произвольно создаете и уничтожаете слои изображений в каждом кадре. Вы должны создать слой изображения один раз для каждой потенциальной цифры, а затем просто обновить исходный прямоугольник каждого кадра. Вы также получаете цифры своего points в экстравагантно дорогой манере.

Следующий код, менее вероятно, чтобы разработчик игры плакать себя спать по ночам:

int points = 50; 

final float DIGIT_WIDTH = 16; 
final float DIGIT_HEIGHT = 16; 
final int MAX_DIGITS = 5; 

@Override 
public void update(float delta) { 
    initNails(); 

    // peel off the right-most digit of points and update its layer; 
    // creating the layer on demand if we don't have one yet 
    int ll = 0; 
    for (int p = points; p > 0 || ll == 0; p /= 10, ll++) { 
    ImageLayer digit; 
    if (pointsLayer.size() <= ll) { 
     digit = graphics().createImageLayer(pointsFontImage); 
     digit.setWidth(DIGIT_WIDTH); 
     digit.setHeight(DIGIT_HEIGHT); 
     digit.setTranslation((MAX_DIGITS-ll-1) * DIGIT_WIDTH, 0); 
     pointsLayer.add(digit); 
    } else { 
     digit = (ImageLayer)pointsLayer.get(ll); 
     digit.setVisible(true); 
    } 
    int d = p%10, ix = ((d + 9) % 10); 
    digit.setSourceRect(ix * DIGIT_WIDTH, 0, DIGIT_WIDTH, DIGIT_HEIGHT); 
    } 
    // hide layers for leading zeros 
    while (ll < pointsLayer.size()) { 
    pointsLayer.get(ll++).setVisible(false); 
    } 
} 
Смежные вопросы