java图像在背景图移动_java – 在Swing中移动背景图像

你好我是编程新手,我们有一个项目.我们创建了一个简单的赛车游戏,背景动人,但我坚持我的代码,我不知道该怎么做.游戏开始时我需要一个移动的背景请有人帮助我.我在求T_T

这是我的代码:

public class Game extends JFrame implements KeyListener, ActionListener {

Random s = new Random();

int x = 0, y = 50, a = 0, b = 250, f = 900, a1 = 0, b2 = 350, a2 = 0, b3 = 150;

int Move;

int value;

JLabel spriteLabel1 = new JLabel(new ImageIcon("ss.gif"));

JLabel spriteLabel2 = new JLabel(new ImageIcon("ss.gif"));

JLabel spriteLabel3 = new JLabel(new ImageIcon("ss.gif"));

JLabel spriteLabel4 = new JLabel(new ImageIcon("ss.gif"));

JLabel background = new JLabel(new ImageIcon("geren.png"));

Timer T1 = new Timer(5000, this);

Timer T = new Timer(5, this);

public static void main(String args[]) {

new Game();

}

public Game() {

Container c = getContentPane();

c.setLayout(null);

c.add(spriteLabel1);

c.add(spriteLabel2);

c.add(spriteLabel3);

c.add(spriteLabel4);

c.add(background);

background.setBounds(0, 0, 1024, 768);

addKeyListener(this);

setSize(1000, 750);

setVisible(true);

}

public void paint(Graphics g) {

super.paint(g);

spriteLabel1.setBounds(x, y, 60, 1000);

spriteLabel2.setBounds(a, b, 60, 800);

spriteLabel3.setBounds(a1, b2, 60, 500);

spriteLabel4.setBounds(a2, b3, 60, 650);

}

public void keyPressed(KeyEvent e) {

String k = e.getKeyText(e.getKeyCode());

if (k.equals("D")) {

if (a != f) {

x = x + 15;

spriteLabel1.setIcon(new ImageIcon("ss.gif"));

repaint();

if (x > f) {

x = f;

spriteLabel1.setIcon(new ImageIcon("ss.gif"));

//JOptionPane.showMessageDialog(null,"Congratulations!!

//Sanji wins!","Result",JOptionPane.PLAIN_MESSAGE,

//new ImageIcon("evolve sanji.gif"));

//System.exit(0);

}

repaint();

}

}

T.stop();

}

if(k.equals (

"D"))

{

if (x != f) {

T.start();

Move = 3;

}

}

public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

}

public void actionPerformed(ActionEvent e) {

if (Move == 3) {

a = a + (s.nextInt(3));

a = a + value;

if (a > f) {

a = f;

}

spriteLabel2.setIcon(new ImageIcon("ss.gif"));

spriteLabel2.setBounds(a, b, 100, 800);

}

if (a == f) {

if (Move == 3) {

a1 = a1 + (s.nextInt(3));

a1 = a1 + value;

if (a1 > f) {

a1 = f;

}

spriteLabel3.setIcon(new ImageIcon("ss.gif"));

spriteLabel3.setBounds(a1, b2, 100, 500);

}

if (Move == 3) {

a2 = a2 + (s.nextInt(5));

a2 = a2 + value;

if (a2 > f) {

a2 = f;

}

spriteLabel4.setIcon(new ImageIcon("ss.gif"));

spriteLabel4.setBounds(a2, b3, 100, 650);

}

}

}

}

解决方法:

这是扰流板

这是肉

我看到你做错了一些事情:

>不断创建新图像.只需使用相同的图像.

>我会,而不是使用标签,只是在绘画表面上绘制一个Image / BufferedImage.

>忘记两个计时器.你可以用一个到期.这就是你管理国家的方式.

>不要在paint方法中做任何逻辑.在你目前的情况下,因为甚至没有画任何东西,你甚至不需要它.在我的例子中,虽然我画了图像.

>不要在JFrame上绘制并覆盖绘制.改为在JPanel中覆盖paintComponent并将该面板添加到框架中.

>最后,关键成分,使用方法(从Graphics) –

public abstract boolean drawImage(Image img,

int dx1,

int dy1,

int dx2,

int dy2,

int sx1,

int sy1,

int sx2,

int sy2,

ImageObserver observer)

你可以得到一个更好的解释in this post.基本上,s点是源图像,所以你可以在动画期间移动sx1和sx2,它将移动图像的一部分绘制在d点绘画表面.

这是完整的例子

(注意我用于背景的图像是2000×350)

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;

import javax.swing.Timer;

public class MovingBackgroundDemo {

public MovingBackgroundDemo() {

JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new AnimatingPanel());

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

private class AnimatingPanel extends JPanel {

private static final int DIM_W = 350;

private static final int DIM_H = 350;

private static final int INCREMENT = 10;

private BufferedImage backgroundImage;

private Image runnerImage;

private int dx1, dy1, dx2, dy2;

private int srcx1, srcy1, srcx2, srcy2;

private int IMAGE_WIDTH;

public AnimatingPanel() {

initImages();

initImagePoints();

Timer timer = new Timer(40, new ActionListener() {

public void actionPerformed(ActionEvent e) {

moveBackground();

repaint();

}

});

timer.start();

FlowLayout layout = (FlowLayout)getLayout();

layout.setHgap(0);

layout.setVgap(0);

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.WHITE);

g.fillRect(0, 0, getWidth(), getHeight());

g.drawImage(backgroundImage, dx1, dy1, dx2, dy2, srcx1, srcy1,

srcx2, srcy2, this);

g.drawImage(runnerImage, 0, 0, getWidth(), getHeight(), this);

}

@Override

public Dimension getPreferredSize() {

return new Dimension(350, 350);

}

private void initImagePoints() {

dx1 = 0;

dy1 = 0;

dx2 = DIM_W;

dy2 = DIM_H;

srcx1 = 0;

srcy1 = 0;

srcx2 = DIM_W;

srcy2 = DIM_H;

}

private void initImages() {

try {

runnerImage = new ImageIcon(getClass().getResource("runner.gif")).getImage();

backgroundImage = ImageIO.read(getClass().getResource(

"background.png"));

IMAGE_WIDTH = backgroundImage.getWidth();

System.out.println(IMAGE_WIDTH);

} catch (Exception ex) {

ex.printStackTrace();

}

}

private void moveBackground() {

if (srcx1 > IMAGE_WIDTH) {

srcx1 = 0 - DIM_W;

srcx2 = 0;

} else {

srcx1 += INCREMENT;

srcx2 += INCREMENT;

}

}

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

new MovingBackgroundDemo();

}

});

}

}

标签:imageicon,keylistener,java,swing,paint

来源: https://codeday.me/bug/20190728/1561951.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值