回答とガイダンスをお寄せいただき、ありがとうございます。
MODE 7は3D変換を実装する方法でしたが、残念ながらdrawTexturedPathでスキャンラインのサイズを変更することができませんでした。そのため、単純なdrawImageになりました。
ビットマップinBmp(入力テクスチャ)があると仮定して、新しいビットマップ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;
}
コードのどこかで、outBmp用のグラフィックスoutBmpGraphicsを作成します。 lineBmp
から
1.createビットマップlineBmp =新しいビットマップ(幅、1)一列
2.create用グラフィックlineBmpGraphics:[開始yから(テクスチャ高さ)* yは係数変換するために反復で次の操作を行い
3.paint iは
4.encode lineBmp EncodedImageのIMGにlineBmpGraphicsにテクスチャからラインIMGモードに従って
5.scale 7
6.paint IMG outBmpGraphics
注:Richard Puckett's PNGEncoder BB port used in my code
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);
}
それを描く、私はResizing a Bitmap using .scaleImage32 instead of .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ゲームを書く場合エキサイティング!
Reinier、ありがとう!真実であるために、私は数学では苦手です。なぜこの質問を賞金にあげましたか...答えは本当に面白いですが、パフォーマンス上の問題で解決できるかもしれませんが、ブラックベリーモード7のコード。 –
残念ながら私はブラックベリーを所有していません。クライアントにポーティング作業をしているとき(ブラックベリーにも関係している)にアクセスできます。私は来週にそこにいるとは思わない。 =^| – Toad
私の追加されたリンクは、それの背後にある数学の多くを説明したと思った...それを読もうとしましたか? – Toad