在另一图象的点绘制图像 [英] Drawing an image at a point of another image

查看:190
本文介绍了在另一图象的点绘制图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我创建一个侧滚轮我试图在另一幅图像的点绘制图像。

我有我的背景图片是5000×500,并让说,我想提请这是25×500,背景图像的50英寸的图像。我会怎么做呢?

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

 硬币C =新币(img.getWidth(本) -  4500,img.getHeight(本) -  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:

 进口java.awt中的*。
java.awt.event中导入*。
进口的javax.swing *。
进口java.net *。
进口java.awt.image.ImageObserver中;
进口java.io.IOException异常;
进口javax.imageio.ImageIO中;公共类的sidescroller继承JPanel实现的KeyListener {    公共静态无效的主要(字符串ARGS [])抛出异常{
        的sidescroller F =新的sidescroller(侧滚轮);
    }    JFrame的F =新的JFrame();
    INT X = 0;
    INT Y = 0;
    时int k = 10;
    INT J = 50;
    INT characterY = 351;
    布尔canJump = TRUE;
    布尔键pressed [] =新布尔[3];    图片IMG;
    形象人物;    硬币C =新币(X + 500 Y + 350);    公众的sidescroller(String s)将抛出MalformedURLException的,IOException异常{
        IMG = ImageIO.read(新URL(http://dl.dropbox.com/u/47632315/sideScrollerBG.png));
        字符= ImageIO.read(新URL(http://dl.dropbox.com/u/47632315/char.png));        f.setTitle(多个);
        //当描述常量的定义不使用幻数!
        //f.setDefaultCloseOperation(3);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(假);
        //不如问加载时。
        //设置preferredSize(新尺寸(1000,500));
        集preferredSize(新尺寸(1000,img.getHeight(本)));
        f.add(本);
        f.pack();
        //通常是有害的,很少有必要。
// f.setLayout(NULL);
        //看起来像一个闪屏
        //f.setLocationRelativeTo(null);
        //由位于平台默认的,最好的。
        f.setLocationByPlatform(真);
        f.addKeyListener(本);
        getKeys();        //应该做的最后一
        f.setVisible(真);
    }    公共无效的paintComponent(图形G){
        super.paintComponent方法(G);
        g.drawImage(IMG,X,Y,这一点);
        g.drawImage(字符,50,characterY,这一点);
        c.paint(克,这一点);
    }    @覆盖
    公共无效的keyTyped(KeyEvent的E){
    }    @覆盖
    公共无效键pressed(KeyEvent的E){
        INT键code = e.getKey code();
        如果(键code == KeyEvent.VK_ESCAPE){
            System.exit(0);
        }
        如果(键code == KeyEvent.VK_RIGHT){
            关键pressed [0] =真;
        }
        如果(键code == KeyEvent.VK_LEFT){
            关键pressed [1] =真;
        }
        如果(canJump){
            如果(键code == KeyEvent.VK_SPACE){
                //更好地在这里使用一个javax.swing.Timer中
                新主题(新的Runnable接口(){
                    公共无效的run(){
                        canJump = FALSE;
                        对于(双I = 0;我LT&= 5.1; I + = 0.2){
                            characterY =(INT)(K * I * I - J * 1 + 351);
                            f.repaint();
                            的System.out.println(characterY);
                            的System.out.println(canJump);
                            尝试{
                                视频下载(25);
                            }赶上(InterruptedException的E){
                                通信System.err.println(E);
                            }
                        }
                        重绘();
                        canJump = TRUE;
                    }
                })。开始();
            }
        }
    }    @覆盖
    公共无效调用keyReleased(KeyEvent的E){
        INT键code = e.getKey code();
        如果(键code == KeyEvent.VK_RIGHT){
            关键pressed [0] = FALSE;
        }
        如果(键code == KeyEvent.VK_LEFT){
            关键pressed [1] = FALSE;
        }
    }    公共无效getKeys(){
        新主题(新的Runnable接口(){
            公共无效的run(){
                而(真){
                    如果(键pressed [0]){
                        点¯x - = 5;
                        重绘();
                    }
                    如果(键pressed [1]){
                        如果(X!= 0){
                            X + = 5;
                            重绘();
                        }
                    }
                    尝试{
                        视频下载(25);
                    }赶上(InterruptedException的E){
                        通信System.err.println(E);
                    }
                }
            }
        })。开始();
    }
}类钱币扩展pickUpObject {    图片硬币;    公共硬币(INT X,int y)对抛出MalformedURLException的,IOException异常{
        超级(X,Y);
        super.x = X;
        super.y = Y;
        硬币= ImageIO.read(新URL(http://dl.dropbox.com/u/47632315/coin.png));
    }    公共无效漆(图形克,ImageObserver的O){
        g.drawImage(硬币,X,Y,O);
    }
}抽象类pickUpObject {    INT X,Y;    公共pickUpObject(INT X,int y)对{
    }    公共抽象无效漆(图形克,ImageObserver的O);
}


解决方案

的一种方法是,划图形到一个的Graphics2D 然后进行翻译。

  //这里我们'翻译'图形2D对象到一个单独的位置
    g2d.translate(X,0);

Screenhsot

在此图像中,字符移到右边,是跳跃的。硬币已按照字符移到右边的距离左移。

全code

 进口java.awt中的*。
java.awt.event中导入*。
进口的javax.swing *。
进口java.net *。
进口java.awt.image.ImageObserver中;
进口java.io.IOException异常;
进口javax.imageio.ImageIO中;公共类的sidescroller继承JPanel实现的KeyListener {    公共静态无效的主要(字符串ARGS [])抛出异常{
        的sidescroller F =新的sidescroller(侧滚轮);
    }    JFrame的F =新的JFrame();
    INT X = 0;
    INT Y = 0;
    时int k = 10;
    INT J = 50;
    INT characterY = 351;
    布尔canJump = TRUE;
    布尔键pressed [] =新布尔[3];    图片IMG;
    形象人物;    硬币C =新币(X + 500 Y + 350);    公众的sidescroller(String s)将抛出MalformedURLException的,IOException异常{
        IMG = ImageIO.read(新URL(http://dl.dropbox.com/u/47632315/sideScrollerBG.png));
        字符= ImageIO.read(新URL(http://dl.dropbox.com/u/47632315/char.png));        f.setTitle(多个);
        //当描述常量的定义不使用幻数!
        //f.setDefaultCloseOperation(3);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(假);
        //不如问加载时。
        //设置preferredSize(新尺寸(1000,500));
        集preferredSize(新尺寸(1000,img.getHeight(本)));
        f.add(本);
        f.pack();
        //通常是有害的,很少有必要。
// f.setLayout(NULL);
        //看起来像一个闪屏
        //f.setLocationRelativeTo(null);
        //由位于平台默认的,最好的。
        f.setLocationByPlatform(真);
        f.addKeyListener(本);
        getKeys();        //应该做的最后一
        f.setVisible(真);
    }    公共无效的paintComponent(图形G){
        super.paintComponent方法(G);
        g.drawImage(IMG,X,Y,这一点);
        g.drawImage(字符,50,characterY,这一点);
        Graphics2D的G2D =(Graphics2D的)克;
        //这里我们'翻译'的图形对象到一个单独的位置
        g2d.translate(X,0);
        c.paint(G2D,这一点);
    }    @覆盖
    公共无效的keyTyped(KeyEvent的E){
    }    @覆盖
    公共无效键pressed(KeyEvent的E){
        INT键code = e.getKey code();
        如果(键code == KeyEvent.VK_ESCAPE){
            System.exit(0);
        }
        如果(键code == KeyEvent.VK_RIGHT){
            关键pressed [0] =真;
        }
        如果(键code == KeyEvent.VK_LEFT){
            关键pressed [1] =真;
        }
        如果(canJump){
            如果(键code == KeyEvent.VK_SPACE){
                //更好地在这里使用一个javax.swing.Timer中
                新主题(新的Runnable接口(){
                    公共无效的run(){
                        canJump = FALSE;
                        对于(双I = 0;我LT&= 5.1; I + = 0.2){
                            characterY =(INT)(K * I * I - J * 1 + 351);
                            f.repaint();
                            的System.out.println(characterY);
                            的System.out.println(canJump);
                            尝试{
                                视频下载(25);
                            }赶上(InterruptedException的E){
                                通信System.err.println(E);
                            }
                        }
                        重绘();
                        canJump = TRUE;
                    }
                })。开始();
            }
        }
    }    @覆盖
    公共无效调用keyReleased(KeyEvent的E){
        INT键code = e.getKey code();
        如果(键code == KeyEvent.VK_RIGHT){
            关键pressed [0] = FALSE;
        }
        如果(键code == KeyEvent.VK_LEFT){
            关键pressed [1] = FALSE;
        }
    }    公共无效getKeys(){
        新主题(新的Runnable接口(){
            公共无效的run(){
                而(真){
                    如果(键pressed [0]){
                        点¯x - = 5;
                        重绘();
                    }
                    如果(键pressed [1]){
                        如果(X!= 0){
                            X + = 5;
                            重绘();
                        }
                    }
                    尝试{
                        视频下载(25);
                    }赶上(InterruptedException的E){
                        通信System.err.println(E);
                    }
                }
            }
        })。开始();
    }
}类钱币扩展pickUpObject {    图片硬币;    公共硬币(INT X,int y)对抛出MalformedURLException的,IOException异常{
        超级(X,Y);
        super.x = X;
        super.y = Y;
        硬币= ImageIO.read(新URL(http://dl.dropbox.com/u/47632315/coin.png));
    }    公共无效漆(图形克,ImageObserver的O){
        g.drawImage(硬币,X,Y,O);
    }
}抽象类pickUpObject {    INT X,Y;    公共pickUpObject(INT X,int y)对{
    }    公共抽象无效漆(图形克,ImageObserver的O);
}

So I'm creating a side scroller and I'm trying to draw an image at the point of another image.

I have my background image which is 5000 x 500 and lets say I want to draw an image that's 25x25 at 500, 50 of the background image. How would I do that?

So far I've tried:

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

But this just draws it at 500, 50 of the frame so it "moves" across the image as I scroll to the right. I want, after scroll once to the right, the coin image to draw at 500,50 of the image still so 495, 50 of the frame.

I could also use getGraphics of the background image and draw the smaller image onto it, but I think because I set the point it's being draw at during the creation of the object, I can't do that.

The character doesn't move, besides up and down, just the background scrolls so I want the coin to move as the background does.

PICTURES: (can't embed it because i don't have 10 rep points) http://dl.dropbox.com/u/47632315/char.png http://dl.dropbox.com/u/47632315/coin.png http://dl.dropbox.com/u/47632315/sideScrollerBG.png

And the 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);
}

解决方案

One way is to stamp the Graphics out to a Graphics2D then translate it.

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

Screenhsot

In this image, the character has moved to the right and is jumping. The coin has shifted left according to the distance the character has moved right.

Full code

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);
}

这篇关于在另一图象的点绘制图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆