6

所以我正在创建一个侧滚动条,我试图在另一个图像的位置绘制一个图像。

我的背景图像是 5000 x 500,假设我想在背景图像的 500、50 处绘制 25x25 的图像。我该怎么做?

到目前为止,我已经尝试过:

Coins c = new Coins(img.getWidth(this) - 4500, img.getHeight(this) - 250);

但这只是在帧的 500、50 处绘制它,因此当我向右滚动时它在图像上“移动”。我想在向右滚动一次后,将硬币图像绘制在图像的 500,50 处,仍然是帧的 495、50 处。

我也可以使用背景图像的 getGraphics 并在其上绘制较小的图像,但我认为因为我在创建对象期间设置了要绘制的点,所以我不能这样做。

除了上下,角色不会移动,只是背景滚动,所以我希望硬币像背景一样移动。

图片:(无法嵌入,因为我没有 10 个代表点) http://dl.dropbox.com/u/47632315/char.png http://dl.dropbox.com/u/47632315/coin .png http://dl.dropbox.com/u/47632315/sideScrollerBG.png

和 SSCCE:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.awt.image.ImageObserver;
import java.io.IOException;
import javax.imageio.ImageIO;

public class SideScroller extends JPanel implements KeyListener {

    public static void main(String args[]) throws Exception {
        SideScroller f = new SideScroller("Side Scroller");
    }

    JFrame f = new JFrame();
    int x = 0;
    int y = 0;
    int k = 10;
    int j = 50;
    int characterY = 351;
    boolean canJump = true;
    boolean keyPressed[] = new boolean[3];

    Image img;
    Image character;

    Coins c = new Coins(x + 500, y + 350);

    public SideScroller(String s) throws MalformedURLException, IOException {
        img = ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/sideScrollerBG.png"));
        character = ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/char.png"));

        f.setTitle(s);
        // don't use 'magic numbers' when descriptive constants are defined!
        //f.setDefaultCloseOperation(3);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        // Better to ask when loaded.
        //setPreferredSize(new Dimension(1000, 500));
        setPreferredSize(new Dimension(1000, img.getHeight(this)));
        f.add(this);
        f.pack();
        // usually harmful, rarely necessary.
//      f.setLayout(null);
        // Looks like a splash screen
        //f.setLocationRelativeTo(null);
        // located by platform default, best.
        f.setLocationByPlatform(true);
        f.addKeyListener(this);
        getKeys();

        // should be done last
        f.setVisible(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, x, y, this);
        g.drawImage(character, 50, characterY, this);
        c.paint(g, this);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_ESCAPE) {
            System.exit(0);
        }
        if (keyCode == KeyEvent.VK_RIGHT) {
            keyPressed[0] = true;
        }
        if (keyCode == KeyEvent.VK_LEFT) {
            keyPressed[1] = true;
        }
        if (canJump) {
            if (keyCode == KeyEvent.VK_SPACE) {
                // better to use a javax.swing.Timer here
                new Thread(new Runnable() {
                    public void run() {
                        canJump = false;
                        for (double i = 0; i <= 5.1; i += .2) {
                            characterY = (int) (k * i * i - j * i + 351);
                            f.repaint();
                            System.out.println(characterY);
                            System.out.println(canJump);
                            try {
                                Thread.sleep(25);
                            } catch (InterruptedException e) {
                                System.err.println(e);
                            }
                        }
                        repaint();
                        canJump = true;
                    }
                }).start();
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_RIGHT) {
            keyPressed[0] = false;
        }
        if (keyCode == KeyEvent.VK_LEFT) {
            keyPressed[1] = false;
        }
    }

    public void getKeys() {
        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    if (keyPressed[0]) {
                        x -= 5;
                        repaint();
                    }
                    if (keyPressed[1]) {
                        if (x != 0) {
                            x += 5;
                            repaint();
                        }
                    }
                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {
                        System.err.println(e);
                    }
                }
            }
        }).start();
    }
}

class Coins extends pickUpObject {

    Image coin; 

    public Coins(int x, int y) throws MalformedURLException, IOException{
        super(x, y);
        super.x = x;
        super.y = y;
        coin = ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/coin.png"));
    }

    public void paint(Graphics g, ImageObserver o){
        g.drawImage(coin, x, y, o);
    }
}

abstract class pickUpObject {

    int x, y;

    public pickUpObject(int x, int y){
    }

    public abstract void paint(Graphics g, ImageObserver o);
}
4

1 回答 1

5

一种方法是将其标记GraphicsGraphics2D然后翻译它。

    // here we 'translate' the graphics 2D object to a separate location  
    g2d.translate(x,0);

截图

在此图像中,角色已向右移动并正在跳跃。硬币根据角色向右移动的距离向左移动。

在此处输入图像描述

完整代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.awt.image.ImageObserver;
import java.io.IOException;
import javax.imageio.ImageIO;

public class SideScroller extends JPanel implements KeyListener {

    public static void main(String args[]) throws Exception {
        SideScroller f = new SideScroller("Side Scroller");
    }

    JFrame f = new JFrame();
    int x = 0;
    int y = 0;
    int k = 10;
    int j = 50;
    int characterY = 351;
    boolean canJump = true;
    boolean keyPressed[] = new boolean[3];

    Image img;
    Image character;

    Coins c = new Coins(x + 500, y + 350);

    public SideScroller(String s) throws MalformedURLException, IOException {
        img = ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/sideScrollerBG.png"));
        character = ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/char.png"));

        f.setTitle(s);
        // don't use 'magic numbers' when descriptive constants are defined!
        //f.setDefaultCloseOperation(3);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        // Better to ask when loaded.
        //setPreferredSize(new Dimension(1000, 500));
        setPreferredSize(new Dimension(1000, img.getHeight(this)));
        f.add(this);
        f.pack();
        // usually harmful, rarely necessary.
//      f.setLayout(null);
        // Looks like a splash screen
        //f.setLocationRelativeTo(null);
        // located by platform default, best.
        f.setLocationByPlatform(true);
        f.addKeyListener(this);
        getKeys();

        // should be done last
        f.setVisible(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, x, y, this);
        g.drawImage(character, 50, characterY, this);
        Graphics2D g2d = (Graphics2D)g;
        // here we 'translate' the graphics object to a separate location  
        g2d.translate(x,0);
        c.paint(g2d, this);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_ESCAPE) {
            System.exit(0);
        }
        if (keyCode == KeyEvent.VK_RIGHT) {
            keyPressed[0] = true;
        }
        if (keyCode == KeyEvent.VK_LEFT) {
            keyPressed[1] = true;
        }
        if (canJump) {
            if (keyCode == KeyEvent.VK_SPACE) {
                // better to use a javax.swing.Timer here
                new Thread(new Runnable() {
                    public void run() {
                        canJump = false;
                        for (double i = 0; i <= 5.1; i += .2) {
                            characterY = (int) (k * i * i - j * i + 351);
                            f.repaint();
                            System.out.println(characterY);
                            System.out.println(canJump);
                            try {
                                Thread.sleep(25);
                            } catch (InterruptedException e) {
                                System.err.println(e);
                            }
                        }
                        repaint();
                        canJump = true;
                    }
                }).start();
            }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_RIGHT) {
            keyPressed[0] = false;
        }
        if (keyCode == KeyEvent.VK_LEFT) {
            keyPressed[1] = false;
        }
    }

    public void getKeys() {
        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    if (keyPressed[0]) {
                        x -= 5;
                        repaint();
                    }
                    if (keyPressed[1]) {
                        if (x != 0) {
                            x += 5;
                            repaint();
                        }
                    }
                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {
                        System.err.println(e);
                    }
                }
            }
        }).start();
    }
}

class Coins extends pickUpObject {

    Image coin; 

    public Coins(int x, int y) throws MalformedURLException, IOException{
        super(x, y);
        super.x = x;
        super.y = y;
        coin = ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/coin.png"));
    }

    public void paint(Graphics g, ImageObserver o){
        g.drawImage(coin, x, y, o);
    }
}

abstract class pickUpObject {

    int x, y;

    public pickUpObject(int x, int y){
    }

    public abstract void paint(Graphics g, ImageObserver o);
}
于 2012-11-11T05:10:33.527 回答