Java 在另一个图像的某个点绘制图像
所以我创建了一个侧边滚动条,我试图在另一个图像的点上画一个图像 我有一张5000 x 500的背景图像,假设我想画一张25x25的图像,背景图像的500,50。我该怎么做 到目前为止,我已经尝试:Java 在另一个图像的某个点绘制图像,java,image,swing,awt,graphics2d,Java,Image,Swing,Awt,Graphics2d,所以我创建了一个侧边滚动条,我试图在另一个图像的点上画一个图像 我有一张5000 x 500的背景图像,假设我想画一张25x25的图像,背景图像的500,50。我该怎么做 到目前为止,我已经尝试: Coins c = new Coins(img.getWidth(this) - 4500, img.getHeight(this) - 250); 但这只是在帧的500,50处绘制,所以当我向右滚动时,它在图像上“移动”。我想,在向右滚动一次后,硬币图像绘制在500,50的图像上,仍然是495,5
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/coin.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);
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.net。*;
导入java.awt.image.ImageObserver;
导入java.io.IOException;
导入javax.imageio.imageio;
公共类SideScroller扩展JPanel实现KeyListener{
公共静态void main(字符串args[])引发异常{
侧卷轴f=新侧卷轴(“侧卷轴”);
}
JFrame f=新的JFrame();
int x=0;
int y=0;
int k=10;
int j=50;
int字符y=351;
布尔值canJump=true;
布尔键按下[]=新布尔[3];
图像img;
图像特征;
硬币c=新硬币(x+500,y+350);
公共侧卷轴(字符串s)引发畸形的DurLexException,IOException{
img=ImageIO.read(新URL(“http://dl.dropbox.com/u/47632315/sideScrollerBG.png"));
character=ImageIO.read(新URL(“http://dl.dropbox.com/u/47632315/char.png"));
f、 片名;
//定义描述性常数时不要使用“幻数”!
//f、 设置默认关闭操作(3);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 可设置大小(假);
//最好在加载时询问。
//setPreferredSize(新尺寸(1000500));
setPreferredSize(新维度(1000,img.getHeight(this)));
f、 加上(这个);
f、 包装();
//通常有害,很少必要。
//f.设置布局(空);
//看起来像一个闪屏
//f、 setLocationRelativeTo(空);
//默认情况下位于平台,最好。
f、 setLocationByPlatform(真);
f、 addKeyListener(此);
getKeys();
//应该最后完成
f、 setVisible(真);
}
公共组件(图形g){
超级组件(g);
g、 绘图图像(img,x,y,this);
g、 drawImage(character,50,characterY,this);
c、 油漆(g,本);
}
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
按下公共无效键(按键事件e){
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_ESCAPE){
系统出口(0);
}
if(keyCode==KeyEvent.VK_RIGHT){
按下键[0]=真;
}
if(keyCode==KeyEvent.VK_左){
按下键[1]=真;
}
如果(可以跳转){
if(keyCode==KeyEvent.VK_空间){
//最好在这里使用javax.swing.Timer
新线程(newrunnable()){
公开募捐{
canJump=false;
对于(双i=0;i一种方法是将Graphics
标记为Graphics2D
,然后对其进行翻译
// here we 'translate' the graphics 2D object to a separate location
g2d.translate(x,0);
屏风
在此图像中,角色向右移动并跳跃。硬币根据角色向右移动的距离向左移动
完整代码
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.net。*;
导入java.awt.image.ImageObserver;
导入java.io.IOException;
导入javax.imageio.imageio;
公共类SideScroller扩展JPanel实现KeyListener{
公共静态void main(字符串args[])引发异常{
侧卷轴f=新侧卷轴(“侧卷轴”);
}
JFrame f=新的JFrame();
int x=0;
int y=0;
int k=10;
int j=50;
int字符y=351;
布尔值canJump=true;
布尔键按下[]=新布尔[3];
图像img;
图像特征;
硬币c=新硬币(x+500,y+350);
公共侧卷轴(字符串s)引发畸形的DurLexException,IOException{
img=ImageIO.read(新URL(“http://dl.dropbox.com/u/47632315/sideScrollerBG.png"));
character=ImageIO.read(新URL(“http://dl.dropbox.com/u/47632315/char.png"));
f、 片名;
//定义描述性常数时不要使用“幻数”!
//f、 设置默认关闭操作(3);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 可设置大小(假);
//最好在加载时询问。
//setPreferredSize(新尺寸(1000500));
setPreferredSize(新维度(1000,img.getHeight(this)));
f、 加上(这个);
f、 包装();
//通常有害,很少必要。
//f.设置布局(空);
//看起来像一个闪屏
//f、 setLocationRelativeTo(空);
//默认情况下位于平台,最好。
f、 setLocationByPlatform(真);
f、 addKeyListener(此);
getKeys();
//应该最后完成
f、 setVisible(真);
}
公共组件(图形g){
超级组件(g);
g、 绘图图像(img,x,y,this);
g、 drawImage(character,50,characterY,this);
Graphics2D g2d=(Graphics2D)g;
//这里,我们将图形对象“转换”到一个单独的位置
g2d.translate(x,0);
c、 油漆(g2d,本);
}
@凌驾
聚氨基甲酸酯
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);
}