使用Java Swing-Arrow键移动图像地图Terraria项目
好的,我以前问过问题,但可能不是StackOverflow的目的。所以,我改变了我的代码和问题。我把所有的jlabel都变成了一个画图组件,不知何故,有一秒钟,图像在移动。然而,我需要分层窗格消失,所以我将其全部更改。代码如下。 我特别需要帮助的是,在这一秒工作之后,图像不再显示,即使我重新启动整个java项目。我真的不明白出了什么问题,下面的片段使用Java Swing-Arrow键移动图像地图Terraria项目,java,image,swing,Java,Image,Swing,好的,我以前问过问题,但可能不是StackOverflow的目的。所以,我改变了我的代码和问题。我把所有的jlabel都变成了一个画图组件,不知何故,有一秒钟,图像在移动。然而,我需要分层窗格消失,所以我将其全部更改。代码如下。 我特别需要帮助的是,在这一秒工作之后,图像不再显示,即使我重新启动整个java项目。我真的不明白出了什么问题,下面的片段 BufferedImage[][] tex=new BufferedImage[16][16]; BufferedImage towie;
BufferedImage[][] tex=new BufferedImage[16][16];
BufferedImage towie;
Container contentpane;
int map[][]=new int[30][3000];
int cX=15,cY=15;
JButton[][] picLabel=new JButton[20][30];
Container contentPane;
class Dea extends JPanel
{
Dea()
{
setBackground(Color.BLACK);
setLayout(null);
for(int i=11;i<30;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=0;
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=815;
}
}
for(int j=0;j<3000;j++)
{
map[9][j]=3;
int randomNum = ThreadLocalRandom.current().nextInt(0, 1+ 1);
map[10][j]=2;
if(randomNum==0)map[11][j]=2;
randomNum = ThreadLocalRandom.current().nextInt(0, 3 + 1);
if(randomNum==1&&map[11][j]==2)map[12][j]=2;
}
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int c1=cX;
int c2=cY;
int keyCode = e.getKeyCode();
char key=e.getKeyChar();
switch( keyCode ) {
case KeyEvent.VK_UP:
cY++;
break;
case KeyEvent.VK_DOWN:
cY--;
break;
case KeyEvent.VK_LEFT:
cX--;
break;
case KeyEvent.VK_RIGHT :
cX++;
break;
}
switch( key ) {
case 's':
case 'S':
cY++;
System.out.println(cX+" "+cY);
break;
case 'w':
case 'W':
cY--;
System.out.println(cX+" "+cY);
break;
case 'a':
case 'A':
cX--;
System.out.println(cX+" "+cY);
break;
case 'd':
case 'D':
cX++;
System.out.println(cX+" "+cY);
break;
}
if(cX<0||cX>2999)cX=c1;
if(cY<0||cY>30)cY=c2;
repaint();
}
});
this.requestFocus();
setVisible(true);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
ImageIcon wae=new ImageIcon(towie);
Image wde=wae.getImage();
g.drawImage(wde,0,0,600,200,0,0,600,200,this);
for(int i=cY-15;i<cY+5;i++)
{
for(int j=cX-15;j<cX+15;j++)
{
ImageIcon w=new ImageIcon(tex[map[i][j]/100][map[i][j]%100]);
Image we=w.getImage();
g.drawImage(we,j*20,i*20,j*20+20,i*20+20,0,0,20,20,this);
}
}
}
}
class ImagesLoader{
ImagesLoader()
{
BufferedImage WholeTexture = null;
try {
WholeTexture = ImageIO.read(new File("textures/terrain_765082.jpg"));
towie=ImageIO.read(new File("Backgrounds/Background.jpg"));
}catch(IOException e){System.out.println("Image Texture Loading Error");}
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
BufferedImage xy2 = WholeTexture.getSubimage(80*i,80*j,80,80);
int type = xy2.getType() == 0? BufferedImage.TYPE_INT_ARGB : xy2.getType();
BufferedImage resizedImage = new BufferedImage(20,20,type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(xy2,0,0,20,20,null);
g.dispose();
tex[j][i]=resizedImage;
// File outputfile = new File("textures/0"+(i*16+j)+".jpg");
// try{
// ImageIO.write(tex[i][j], "png", outputfile);
// }catch(IOException e){}
}
}
}
}
BufferedImage[]tex=新的BufferedImage[16][16];
BuffereImage towie;
容器内容窗格;
int map[][]=新int[30][3000];
int cX=15,cY=15;
JButton[]picLabel=新JButton[20][30];
容器内容窗格;
类Dea扩展了JPanel
{
Dea()
{
挫折背景(颜色:黑色);
setLayout(空);
对于(int i=11;i这是我用来测试程序的类:
必须仔细选择map/tex的索引-我不知道您想用这些索引做什么,但当前程序移动地图,因此回答了以下问题:
class Move {
public Move() {
JFrame f=new JFrame();
f.setSize(500, 500);
Dea d=new Dea();
f.add(d);
f.setVisible(true);
d.requestFocus();
}
我已经选择了答案,我发现它真的很好。Paintcomponent使它能够自由移动。所以,这里是源代码
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.text.AbstractDocument.Content;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
class WorldriaEx extends JFrame
{
BufferedImage[][] tex=new BufferedImage[16][16];
BufferedImage towie;
Container contentpane;
BufferedImage charLeft;
BufferedImage charRight;
BufferedImage charFront;
int map[][]=new int[40][3000];
int cX=1500,cY=15,c1=cX,c2=cY;
JButton[][] picLabel=new JButton[20][30];
Container contentPane;
int dirt=0;
class Dea extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
ImageIcon wae=new ImageIcon(towie);
Image wde=wae.getImage();
g.fillRect(0,200,620,400);
g.setColor(Color.BLACK);
g.drawImage(wde,0,0,620,400,cX-c1+150,(c2-cY)*5+150,750+cX-c1,350+(c2-cY)*5,this);
int type = charLeft.getType() == 0? BufferedImage.TYPE_INT_ARGB : charLeft.getType();
BufferedImage resizedImage = new BufferedImage(12,40,type);
Graphics2D a = resizedImage.createGraphics();
a.drawImage(charLeft,0,0,12,40,null);
a.dispose();
int type1 = charRight.getType() == 0? BufferedImage.TYPE_INT_ARGB : charRight.getType();
BufferedImage resizedImage1 = new BufferedImage(12,40,type1);
Graphics2D b = resizedImage1.createGraphics();
b.drawImage(charRight,0,0,12,40,null);
b.dispose();
int type2 = charFront.getType() == 0? BufferedImage.TYPE_INT_ARGB : charFront.getType();
BufferedImage resizedImage2 = new BufferedImage(20,40,type2);
Graphics2D c = resizedImage2.createGraphics();
c.drawImage(charFront,0,0,20,40,null);
c.dispose();
for(int i=cY-15;i<cY+5;i++)
{
for(int j=cX-15;j<cX+16;j++)
{
if(i<0)continue;
ImageIcon w=new ImageIcon(tex[map[i][j]/100][map[i][j]%100]);
Image we=w.getImage();
if(map[i][j]!=815)g.drawImage(we,(j-cX+15)*20,(i-cY+15)*20,(j-cX+15)*20+20,(i-cY+15)*20+20,0,0,20,20,this);
}
}
if(dirt==1)g.drawImage(resizedImage,304,140,12,40,this);
else if(dirt==0)g.drawImage(resizedImage2,300,140,20,40,this);
else g.drawImage(resizedImage1,304,140,12,40,this);
Fall(cX,cY);
repaint();
}
}
class ImagesLoader{
ImagesLoader()
{
BufferedImage WholeTexture = null;
try {
WholeTexture = ImageIO.read(new File("textures/terrain_765082.png"));
towie=ImageIO.read(new File("Backgrounds/Background.jpg"));
charLeft=ImageIO.read(new File("textures/Char Left.png"));
charRight=ImageIO.read(new File("textures/Char Right.png"));
charFront=ImageIO.read(new File("textures/Char Front.png"));
}catch(IOException e){System.out.println("Image Texture Loading Error");}
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
BufferedImage xy2 = WholeTexture.getSubimage(32*i,32*j,32,32);
int type = xy2.getType() == 0? BufferedImage.TYPE_INT_ARGB : xy2.getType();
BufferedImage resizedImage = new BufferedImage(20,20,type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(xy2,0,0,20,20,null);
g.dispose();
tex[j][i]=resizedImage;
// File outputfile = new File("textures/0"+(i*16+j)+".jpg");
// try{
// ImageIO.write(tex[i][j], "png", outputfile);
// }catch(IOException e){}
}
}
}
}
WorldriaEx()
{
setTitle("Worldria Project - Andrew Woo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane();
setLayout(new BorderLayout());
ImagesLoader aw = new ImagesLoader();
for(int i=11;i<40;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=1;
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=815;
}
}
for(int j=0;j<3000;j++)
{
map[9][j]=3;
int randomNum = ThreadLocalRandom.current().nextInt(0, 1+ 1);
map[10][j]=2;
if(randomNum==0)map[11][j]=2;
randomNum = ThreadLocalRandom.current().nextInt(0, 3 + 1);
if(randomNum==1&&map[11][j]==2)map[12][j]=2;
}
Dea mainPanel = new Dea();
add(mainPanel,BorderLayout.CENTER);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int c1=cX;
int c2=cY;
int keyCode = e.getKeyCode();
char key=e.getKeyChar();
switch( keyCode ) {
case KeyEvent.VK_UP:
cY--;
repaint();
break;
case KeyEvent.VK_DOWN:
if(map[cY+2][cX]!=815)cY++;
repaint();
break;
case KeyEvent.VK_LEFT:
cX--;
dirt=1;
repaint();
break;
case KeyEvent.VK_RIGHT :
cX++;
dirt=2;
repaint();
break;
}
switch( key ) {
case 'w':
case 'W':
cY--;
repaint();
break;
case 'a':
case 'A':
dirt=1;
cX--;
repaint();
break;
case 'd':
case 'D':
dirt=2;
cX++;
repaint();
break;
}
if(cX<=0||cX>2999)cX=c1;
if(cY<=0||cY>39)cY=c2;
repaint();
}
});
add(mainPanel);
requestFocusInWindow();
this.requestFocus();
setSize(620,400);
setVisible(true);
}
public void Fall(int a,int b)
{
if(map[b+2][a]==815)
{
try {
// thread to sleep for 1000 milliseconds
Thread.sleep(50);
cY++;
repaint();
} catch (Exception f) {
System.out.println(f);
}
}
repaint();
}
}
public class Main{
public static void main(String[] args) {
new WorldriaEx();
}
}
import java.util.*;
导入java.util.concurrent.ThreadLocalRandom;
导入javax.imageio.imageio;
导入javax.swing.*;
导入javax.swing.text.AbstractDocument.Content;
导入java.awt.event.*;
导入java.awt.*;
导入java.awt.image.*;
导入java.io.*;
类WorldriaEx扩展了JFrame
{
BuffereImage[][]tex=新的BuffereImage[16][16];
BuffereImage towie;
容器内容窗格;
BufferedImage charLeft;
BuffereImage charRight;
缓冲图像字符前端;
int map[][]=新int[40][3000];
int cX=1500,cY=15,c1=cX,c2=cY;
JButton[]picLabel=新JButton[20][30];
容器内容窗格;
int污垢=0;
类Dea扩展了JPanel
{
公共组件(图形g)
{
超级组件(g);
ImageIcon wae=新的ImageIcon(towie);
Image wde=wae.getImage();
g、 fillRect(0206020400);
g、 设置颜色(颜色为黑色);
g、 drawImage(wde,0,0620400,cX-c1+150,(c2 cY)*5+150750+cX-C1350+(c2 cY)*5,本);
int type=charLeft.getType()=0?buffereImage.type_int_ARGB:charLeft.getType();
BuffereImage resizedImage=新的BuffereImage(12,40,类型);
Graphics2D a=resizedImage.createGraphics();
a、 drawImage(charLeft,0,0,12,40,null);
a、 处置();
int-type1=charRight.getType()=0?BufferedImage.TYPE_int_ARGB:charRight.getType();
BuffereImage resizedImage1=新的BuffereImage(12,40,类型1);
Graphics2D b=resizedImage1.createGraphics();
b、 drawImage(charRight,0,0,12,40,null);
b、 处置();
int-type2=charFront.getType()=0?BufferedImage.TYPE_int_ARGB:charFront.getType();
BuffereImage resizedImage2=新的BuffereImage(20,40,类型2);
Graphics2D c=resizedImage2.createGraphics();
c、 drawImage(charFront,0,0,20,40,空);
c、 处置();
对于(int i=cY-15;iIt似乎您正在尝试大量使用您的代码,并且存在多个可能的失败点。您在哪里调用此代码?您如何执行核心游戏循环?如何使用ImagesLoader
(因为这可能会影响渲染周期)?我不确定您的代码片段是否足以诊断问题。我个人也不会将repaint()
事件与KeyBind
绑定,但我已经有一段时间没有实现类似的系统了。
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(towie,0,0, this);
g.drawImage(WholeTexture, cX, cY, this);
}
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.text.AbstractDocument.Content;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
class WorldriaEx extends JFrame
{
BufferedImage[][] tex=new BufferedImage[16][16];
BufferedImage towie;
Container contentpane;
BufferedImage charLeft;
BufferedImage charRight;
BufferedImage charFront;
int map[][]=new int[40][3000];
int cX=1500,cY=15,c1=cX,c2=cY;
JButton[][] picLabel=new JButton[20][30];
Container contentPane;
int dirt=0;
class Dea extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
ImageIcon wae=new ImageIcon(towie);
Image wde=wae.getImage();
g.fillRect(0,200,620,400);
g.setColor(Color.BLACK);
g.drawImage(wde,0,0,620,400,cX-c1+150,(c2-cY)*5+150,750+cX-c1,350+(c2-cY)*5,this);
int type = charLeft.getType() == 0? BufferedImage.TYPE_INT_ARGB : charLeft.getType();
BufferedImage resizedImage = new BufferedImage(12,40,type);
Graphics2D a = resizedImage.createGraphics();
a.drawImage(charLeft,0,0,12,40,null);
a.dispose();
int type1 = charRight.getType() == 0? BufferedImage.TYPE_INT_ARGB : charRight.getType();
BufferedImage resizedImage1 = new BufferedImage(12,40,type1);
Graphics2D b = resizedImage1.createGraphics();
b.drawImage(charRight,0,0,12,40,null);
b.dispose();
int type2 = charFront.getType() == 0? BufferedImage.TYPE_INT_ARGB : charFront.getType();
BufferedImage resizedImage2 = new BufferedImage(20,40,type2);
Graphics2D c = resizedImage2.createGraphics();
c.drawImage(charFront,0,0,20,40,null);
c.dispose();
for(int i=cY-15;i<cY+5;i++)
{
for(int j=cX-15;j<cX+16;j++)
{
if(i<0)continue;
ImageIcon w=new ImageIcon(tex[map[i][j]/100][map[i][j]%100]);
Image we=w.getImage();
if(map[i][j]!=815)g.drawImage(we,(j-cX+15)*20,(i-cY+15)*20,(j-cX+15)*20+20,(i-cY+15)*20+20,0,0,20,20,this);
}
}
if(dirt==1)g.drawImage(resizedImage,304,140,12,40,this);
else if(dirt==0)g.drawImage(resizedImage2,300,140,20,40,this);
else g.drawImage(resizedImage1,304,140,12,40,this);
Fall(cX,cY);
repaint();
}
}
class ImagesLoader{
ImagesLoader()
{
BufferedImage WholeTexture = null;
try {
WholeTexture = ImageIO.read(new File("textures/terrain_765082.png"));
towie=ImageIO.read(new File("Backgrounds/Background.jpg"));
charLeft=ImageIO.read(new File("textures/Char Left.png"));
charRight=ImageIO.read(new File("textures/Char Right.png"));
charFront=ImageIO.read(new File("textures/Char Front.png"));
}catch(IOException e){System.out.println("Image Texture Loading Error");}
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
{
BufferedImage xy2 = WholeTexture.getSubimage(32*i,32*j,32,32);
int type = xy2.getType() == 0? BufferedImage.TYPE_INT_ARGB : xy2.getType();
BufferedImage resizedImage = new BufferedImage(20,20,type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(xy2,0,0,20,20,null);
g.dispose();
tex[j][i]=resizedImage;
// File outputfile = new File("textures/0"+(i*16+j)+".jpg");
// try{
// ImageIO.write(tex[i][j], "png", outputfile);
// }catch(IOException e){}
}
}
}
}
WorldriaEx()
{
setTitle("Worldria Project - Andrew Woo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane();
setLayout(new BorderLayout());
ImagesLoader aw = new ImagesLoader();
for(int i=11;i<40;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=1;
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<3000;j++)
{
map[i][j]=815;
}
}
for(int j=0;j<3000;j++)
{
map[9][j]=3;
int randomNum = ThreadLocalRandom.current().nextInt(0, 1+ 1);
map[10][j]=2;
if(randomNum==0)map[11][j]=2;
randomNum = ThreadLocalRandom.current().nextInt(0, 3 + 1);
if(randomNum==1&&map[11][j]==2)map[12][j]=2;
}
Dea mainPanel = new Dea();
add(mainPanel,BorderLayout.CENTER);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e)
{
int c1=cX;
int c2=cY;
int keyCode = e.getKeyCode();
char key=e.getKeyChar();
switch( keyCode ) {
case KeyEvent.VK_UP:
cY--;
repaint();
break;
case KeyEvent.VK_DOWN:
if(map[cY+2][cX]!=815)cY++;
repaint();
break;
case KeyEvent.VK_LEFT:
cX--;
dirt=1;
repaint();
break;
case KeyEvent.VK_RIGHT :
cX++;
dirt=2;
repaint();
break;
}
switch( key ) {
case 'w':
case 'W':
cY--;
repaint();
break;
case 'a':
case 'A':
dirt=1;
cX--;
repaint();
break;
case 'd':
case 'D':
dirt=2;
cX++;
repaint();
break;
}
if(cX<=0||cX>2999)cX=c1;
if(cY<=0||cY>39)cY=c2;
repaint();
}
});
add(mainPanel);
requestFocusInWindow();
this.requestFocus();
setSize(620,400);
setVisible(true);
}
public void Fall(int a,int b)
{
if(map[b+2][a]==815)
{
try {
// thread to sleep for 1000 milliseconds
Thread.sleep(50);
cY++;
repaint();
} catch (Exception f) {
System.out.println(f);
}
}
repaint();
}
}
public class Main{
public static void main(String[] args) {
new WorldriaEx();
}
}