我正在创建一个横向卷轴游戏,并尝试在另一张图像的位置绘制一张图像。
我有一个背景图像,大小为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);
}
Image coin = new ImageIcon("coin.png").getImage();
更改为Image coin = new ImageIO.read(new URL("http://dl.dropbox.com/u/47632315/coin.png"));
,我会得到错误 ImageIO.read 无法解析为类型。 - MillerTime