※ 此程式碼並非優化版本,僅供個人學習用途,若有任何問題請告知。
※ 準備1個jpg圖檔:1.jpg。 ※ 參考自java图片移动(键盘控制) - CSDN博客。 程式碼如下:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.awt.BorderLayout; | |
import java.awt.Container; | |
import java.awt.Graphics; | |
import java.awt.Image; | |
import java.awt.MediaTracker; | |
import java.awt.Toolkit; | |
import java.awt.event.KeyEvent; | |
import java.awt.event.KeyListener; | |
import javax.swing.JFrame; | |
import javax.swing.JPanel; | |
public class PictureMove extends JFrame implements KeyListener { | |
private Container content; | |
private JPanel mainPane; | |
protected Image img = null; | |
Graphics g; | |
final int INIT_X_POS = 250, INIT_Y_POS = 100; //圖片初始位址 | |
//X移動, Y移動, 圖片X, 圖片Y, 圖片寬度, 圖片高度 | |
int SpeedX = 15, SpeedY = 15, imgX = INIT_X_POS, | |
imgY = INIT_Y_POS, imgW = 100, imgH = 100; | |
public PictureMove() throws InterruptedException { | |
/*視窗設定*/ | |
super("test"); | |
this.setDefaultCloseOperation(EXIT_ON_CLOSE); | |
this.setResizable(false); | |
this.setBounds(350, 200, 650, 350); | |
content = this.getContentPane(); | |
mainPane = new JPanel(); | |
mainPane.setLayout(new BorderLayout()); | |
content.add(mainPane, BorderLayout.CENTER); | |
this.setVisible(true); | |
/*圖片*/ | |
img = Toolkit.getDefaultToolkit().getImage("src\\M\\p\\1.png"); | |
g = mainPane.getGraphics(); | |
MediaTracker t = new MediaTracker(this); | |
t.addImage(img, 0); | |
t.waitForAll(); | |
g.drawImage(img, imgX, imgY, imgW, imgH, null); | |
this.addKeyListener(this); | |
} | |
public static void main(String[] args) throws InterruptedException {new PictureMove();} | |
public void keyPressed(KeyEvent e) { | |
g.drawImage(img, imgX, imgY, imgW, imgH, null); | |
g.clearRect(imgX, imgY, imgW, imgH); | |
int key = e.getKeyCode(); | |
/*有作邊界判定*/ | |
if(key == KeyEvent.VK_LEFT) { //如(圖片的X位置-移動位置數)小於0 則等同於超出邊界 | |
imgX -= ((imgX - SpeedX) >= 0 ? SpeedX : imgX);} | |
if(key == KeyEvent.VK_RIGHT) { //如(圖片的X位置+圖片寬度+移動位置數)大於視窗寬度 則等同於超出邊界 | |
imgX += ((imgX + imgW + SpeedX) <= this.getWidth() ? SpeedX : (this.getWidth() - imgX - imgW));} | |
if(key == KeyEvent.VK_UP) { | |
imgY -= ((imgY - SpeedY) >= 0 ? SpeedY : imgY);} | |
if(key == KeyEvent.VK_DOWN) { | |
imgY += ((imgY + imgH + SpeedY) <= this.getHeight() ? SpeedY : (this.getHeight() - imgY - imgH));} | |
/*沒有作邊界判定*/ | |
if(key == KeyEvent.VK_A) {imgX -= SpeedX;} | |
if(key == KeyEvent.VK_D) {imgX += SpeedX;} | |
if(key == KeyEvent.VK_W) {imgY -= SpeedY;} | |
if(key == KeyEvent.VK_S) {imgY += SpeedY;} | |
g.drawImage(img, imgX, imgY, imgW, imgH, null); | |
} | |
public void keyReleased(KeyEvent arg0) {} | |
public void keyTyped(KeyEvent arg0) {} | |
} |
結果如下:
沒有留言:
張貼留言