Спасибо за ответы и рекомендации, +1 всем вам.
РЕЖИМ 7 был способом реализации трехмерного преобразования, но, к сожалению, я не смог сделать drawTexturedPath для изменения размера моих строк сканирования ... поэтому я остановился на простом drawImage.
Предполагая, что у вас есть Bitmap inBmp (входная текстура), создайте новый Bitmap outBmp (выходная текстура).
Bitmap mInBmp = Bitmap.getBitmapResource("map.png");
int inHeight = mInBmp.getHeight();
int inWidth = mInBmp.getWidth();
int outHeight = 0;
int outWidth = 0;
int outDrawX = 0;
int outDrawY = 0;
Bitmap mOutBmp = null;
public Scr() {
super();
mOutBmp = getMode7YTransform();
outWidth = mOutBmp.getWidth();
outHeight = mOutBmp.getHeight();
outDrawX = (Display.getWidth() - outWidth) / 2;
outDrawY = Display.getHeight() - outHeight;
}
Где-то в коде создайте Graphics outBmpGraphics для outBmp.
Затем выполните следующие итерации от начала y до (высота текстуры) * коэффициент преобразования y:
1. создайте строку Bitmap Bmp = new Bitmap (width, 1) для одного line
2. создать графическую строкуBmpGraphics из lineBmp
3. нарисовать строку i от текстуры до lineBmpGraphics
4. закодировать lineBmp в EncodedImage img
5. масштабировать img согласно РЕЖИМУ 7
6. закрасить img в outBmpGraphics
Примечание: BB-порт Ричарда Пакетта PNGEncoder, используемый в моем коде
private Bitmap getMode7YTransform() {
Bitmap outBmp = new Bitmap(inWidth, inHeight / 2);
Graphics outBmpGraphics = new Graphics(outBmp);
for (int i = 0; i < inHeight / 2; i++) {
Bitmap lineBmp = new Bitmap(inWidth, 1);
Graphics lineBmpGraphics = new Graphics(lineBmp);
lineBmpGraphics.drawBitmap(0, 0, inWidth, 1, mInBmp, 0, 2 * i);
PNGEncoder encoder = new PNGEncoder(lineBmp, true);
byte[] data = null;
try {
data = encoder.encode(true);
} catch (IOException e) {
e.printStackTrace();
}
EncodedImage img = PNGEncodedImage.createEncodedImage(data,
0, -1);
float xScaleFactor = ((float) (inHeight / 2 + i))
/ (float) inHeight;
img = scaleImage(img, xScaleFactor, 1);
int startX = (inWidth - img.getScaledWidth()) / 2;
int imgHeight = img.getScaledHeight();
int imgWidth = img.getScaledWidth();
outBmpGraphics.drawImage(startX, i, imgWidth, imgHeight, img,
0, 0, 0);
}
return outBmp;
}
Тогда просто нарисуйте это краской ()
protected void paint(Graphics graphics) {
graphics.drawBitmap(outDrawX, outDrawY, outWidth, outHeight, mOutBmp,
0, 0);
}
Для масштабирования я сделал что-то похожее на метод, описанный в Изменение размера растрового изображения с использованием .scaleImage32 вместо .setScale
private EncodedImage scaleImage(EncodedImage image, float ratioX,
float ratioY) {
int currentWidthFixed32 = Fixed32.toFP(image.getWidth());
int currentHeightFixed32 = Fixed32.toFP(image.getHeight());
double w = (double) image.getWidth() * ratioX;
double h = (double) image.getHeight() * ratioY;
int width = (int) w;
int height = (int) h;
int requiredWidthFixed32 = Fixed32.toFP(width);
int requiredHeightFixed32 = Fixed32.toFP(height);
int scaleXFixed32 = Fixed32.div(currentWidthFixed32,
requiredWidthFixed32);
int scaleYFixed32 = Fixed32.div(currentHeightFixed32,
requiredHeightFixed32);
EncodedImage result = image.scaleImage32(scaleXFixed32, scaleYFixed32);
return result;
}
См. Также
J2ME Mode 7 Floor Renderer - что-то более подробное и захватывающее, если вы пишете 3D-игру!
person
Maksym Gontar
schedule
16.08.2009