Спасибо за ответы и советы, +1 всем вам.
В MODE 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.создать растровое изображение lineBmp = новое растровое изображение (ширина, 1) для одной строки
2. создать графическую линиюBmpGraphics из lineBmp
3. нарисовать линию от текстуры до линииBmpGraphics
4. закодировать строкуBmp в 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-игру!