tietääkö joku kuinka javassa voitaisiin saada kuvat kääntymään esimerkiksi 10 astetta vinoon?
Tällainen on hyvin tärkeää kaksiuloitteisissa ylhäälpäin kuvatuissa peleissä.
Laita Graphics2D luokalle AffineTrasformiksi pyöritysmatriisi ennen kuvan piirtoa. Tämä onnistuu myös melko helposti ja nopeammin pikseli kerrallaan piirtämällä kunhan vain kerrot koordinaatit sopivasti pyöritysmatriisilla ja mappaat ne kuvaan.
Javadocs:
Graphics2D.setTransform()
AffineTransform.getRotateInstance()
okka, kiitti.
Mitä tarkoitat pikseli kerrallaan piirtämmisellä?
Tälläinen joskus kirjoittamani löityi kovalevyn kätköistä. Tuo on ehkä hiukan liian optimoitu, jotta se toimisi hyvänä esimerkkinä, mutta kaipa tuosta ajatuksen kanssa luettuna saa selvää. Tuo vaatii jonkun kuvan toimiakseen (Tässä "kuva.png", mutta sen voi vaihtaa minkä nimiseksi tahansa).
import java.awt.*; import javax.swing.*; import java.awt.image.*; import java.awt.event.*; public class Rotor extends Canvas { private int[] screen; private int[] pixels1; // 1024*sin values private int[] sins = new int[256]; // 1024*cos values private int[] coss = new int[256]; private Image screenImage; private MemoryImageSource mis; /** * Picture name */ private String sFile1 = "kuva.png"; private int w, h; private int n; private int alpha = 0; private byte flip = 1; public Rotor() { Image image = new ImageIcon(sFile1).getImage(); w = image.getWidth(this); h = image.getHeight(this); n = w*h; pixels1 = getPixels(image); screen = new int[w*h]; mis=new MemoryImageSource(w,h,ColorModel.getRGBdefault(),screen,0,w); mis.setAnimated(true); mis.setFullBufferUpdates(true); screenImage=createImage(mis); initTrig(); } private void initTrig() { for (int i = 0; i < 256; i++) { sins[i] = (int)(1024*Math.sin( i*Math.PI / 128 )); coss[i] = (int)(1024*Math.cos( i*Math.PI / 128 )); } } public int[] getPixels(Image image) { int[] pixels = new int[w*h]; PixelGrabber pg = new PixelGrabber(image,0,0,w,h,pixels,0,w); try { pg.grabPixels(); } catch (InterruptedException e) {} return pixels; } public void paint(Graphics g) { g.drawImage(screenImage,0,0,this); } public void update(Graphics g) { paint(g); } int db = 1; public void render() { alpha += 1; alpha = alpha &0xff; int offs = 0; int minY = (-h>>1); int maxY = h+minY; int minX = -w>>1; int maxX = w+minX; int n = w*h; int cs = coss[alpha]; int ss = sins[alpha]; for (int y = minY; y < maxY; y++) { for (int x = minX; x < maxX; x++) { //>>10 == /1024 (sin/cos rounding) int x1 = ((cs*x + (ss*y))>>10) -minX; int y1 = ((-ss*x + (cs*y))>>10) -minY; if (x1 < 0) do { x1 += w; } while(x1 < 0); else if (x1 >= w) do { x1 -= w; } while(x1 >=w); if (y1 < 0) do { y1 += h; } while(y1 < 0); else if (y1 >= h) do { y1 -= h; } while(y1 >=h); screen[ offs++ ] = pixels1[y1*w+x1]; } } } public void nextFrame() { render(); mis.newPixels(0, 0, w, h); } public static void main(String[] args) { JFrame frame = new JFrame("Rotor"); Rotor f = new Rotor(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(800,600); frame.getContentPane().add(f); frame.show(); while(frame.isShowing()) { f.nextFrame(); try { Thread.sleep(20); }catch(Exception e) {return;} } } }
kiitti, testaan tuota kohta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.