Merci pour les réponses et les conseils, +1 à vous tous.
Le MODE 7 était la façon dont j'ai choisi d'implémenter la transformation 3D, mais malheureusement je ne pouvais pas faire drawTexturedPath pour redimensionner mes lignes de balayage ... donc je suis descendu à drawImage simple.
En supposant que vous avez un bitmap inBmp (texture d'entrée), créez un nouveau bitmap outBmp (texture de sortie).
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;
}
Quelque part dans le code, créez un Graphics outBMPGraphics pour outBmp.
Alors ne suit dans l'itération du début à y (hauteur de texture) * y transform facteur:
1.Créez un Bitmap lineBmp = new Bitmap (largeur, 1) pour une ligne
2.Créez un lineBmpGraphics graphique de lineBmp
3.paint i la ligne de texture à lineBmpGraphics
4.encode lineBmp à EncodedImage img img
5.scale selon le mode 7
6.paint img à outBmpGraphics
note: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;
}
Ensuite, il suffit dessiner dans la peinture()
protected void paint(Graphics graphics) {
graphics.drawBitmap(outDrawX, outDrawY, outWidth, outHeight, mOutBmp,
0, 0);
}
à l'échelle, j'ai faire quelque chose similaire à la méthode décrite dans 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;
}
Voir aussi
J2ME Mode 7 Floor Renderer - quelque chose de beaucoup plus détaillé & excitant si vous écrivez un jeu en 3D!
Reinier, merci pour la réponse! Pour être sérieux, je suis mauvais en maths, c'est pourquoi j'ai pris cette question à la prime ... Votre réponse est vraiment intéressante, et bien qu'elle puisse résoudre des problèmes de performance, je l'accepterai si vous fournissez un Blackberry code pour un mode 7. –
malheureusement, je ne possède pas une mûre. J'y ai accès quand je suis chez un client qui fait du portage (ce qui implique aussi le blackberry). Ne pense pas que je serai là la semaine prochaine cependant. =^| – Toad
Je pensais que mon lien ajouté expliquait beaucoup de maths impliqués ... Avez-vous essayé de le lire? – Toad