[問題] Java 線程搭配圖片與方向請益

看板java作者 (earric9972202)時間4年前 (2020/02/21 16:35), 4年前編輯推噓1(101)
留言2則, 2人參與, 4年前最新討論串1/1
(此文為代po,謝謝~) ※狀況概述:想請問能否在構造函式中使用判斷式。 以下是People檔案中的構造函式: public People() { try { if(UpStatue==true){ image1 = ImageIO.read(new File("image/boy-up-1.png"));//向上的圖片一 image2 = ImageIO.read(new File("image/boy-up-2.png"));//向上的圖片二 image3 = ImageIO.read(new File("image/boy-up-3.png"));//向上的圖片三 }else if(RightStatue==true) { image1 = ImageIO.read(new File("image/boy-right-1.png"));//向上的圖片一 image2 = ImageIO.read(new File("image/boy-right-2.png"));//向上的圖片二 image3 = ImageIO.read(new File("image/boy-right-3.png"));//向上的圖片三 }else if(LeftStatue==true) { image1 = ImageIO.read(new File("image/boy-left-1.png"));//向上的圖片一 image2 = ImageIO.read(new File("image/boy-left-2.png"));//向上的圖片二 image3 = ImageIO.read(new File("image/boy-left-3.png"));//向上的圖片三 }else if(DownStatue==true) { image1 = ImageIO.read(new File("image/boy-down-1.png"));//向下的圖片一 image2 = ImageIO.read(new File("image/boy-down-2.png"));//向下的圖片二 image3 = ImageIO.read(new File("image/boy-down-3.png"));//向下的圖片三 }else { image1 = ImageIO.read(new File("image/boy-down-1.png"));//向下的圖片一 image2 = ImageIO.read(new File("image/boy-down-2.png"));//向下的圖片二 image3 = ImageIO.read(new File("image/boy-down-3.png"));//向下的圖片三 } } catch (IOException e) { e.printStackTrace(); } x = 100;// 初始x軸化座標 y = 100;// 初始y軸化座標 } https://i.imgur.com/HHNdbTc.jpg
如上圖, 構造函式的圖片沒辦法進行判斷,按上下左右的鍵圖片也不會改變。 ※程式碼:全部的程式碼 https://i.imgur.com/fKuBbP3.jpg
https://i.imgur.com/dVNDIng.jpg
https://i.imgur.com/hC8JVxR.jpg
https://i.imgur.com/qf9ywGe.jpg
< GamePanel.java檔案> package ex02; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; //alt + / 自動補全 //ctrl + shift + f 調整格式 public class GamePanel extends JPanel implements KeyListener { BufferedImage image;// 主圖片 Graphics2D g2;// 繪圖工具,美工 People golden; boolean finish = false;// 遊戲是否結束 static final int FRESH = 20;//非靜態的 final無法改變的常量 ,刷新時間,20毫秒 BufferedImage background;// 背景 // 構造函數,給對象的數據(屬性)驚醒初始化 會先於初始化函數 相較於//靜態函數: 只能執行一次,構造函數:能執行多次 public GamePanel() { image = new BufferedImage(600, 500, BufferedImage.TYPE_INT_BGR); g2 = image.createGraphics(); golden = new People();//引用People()構造函數 try { background = ImageIO.read(new File("image/background.png")); } catch (IOException e) { e.printStackTrace(); } FreshThread t = new FreshThread(this);// 刷新線程 t.start(); } // 繪製圖片 private void paintImage() { golden.move();// 移動 g2.drawImage(background, 0, 0, this);// 先放背景 g2.drawImage(golden.image, golden.x, golden.y, this);// 再放人物 } // 設置畫布 @Override被繼承的方法 @Override public void paint(Graphics g) { paintImage(); g.drawImage(image, 0, 0, this); } public boolean isFinish() { return finish; } @Override public void keyTyped(KeyEvent e) {// 按鍵類型 // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent e) {// 按鍵按下 e可以 int code = e.getKeyCode(); if (code == KeyEvent.VK_UP) { golden.up(); } else if (code == KeyEvent.VK_DOWN) { golden.down(); } else if (code == KeyEvent.VK_RIGHT) { golden.right(); } else if (code == KeyEvent.VK_LEFT) { golden.left(); } } @Override public void keyReleased(KeyEvent e) {// 按鍵抬起 golden.released(); } } https://i.imgur.com/empqY5j.jpg
https://i.imgur.com/5LL37yZ.jpg
https://i.imgur.com/yDHxbxB.jpg
https://i.imgur.com/8bUy710.jpg
< People.java檔案> package ex02; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class People { int x, y;// 座標 BufferedImage image; BufferedImage image1, image2, image3;// 人的圖片 int stepTimer = 0;// 添加計時器 毫秒 int fresh = GamePanel.FRESH;// 為靜態 可調用 boolean UpStatue = false;// 向上的狀態 boolean DownStatue = false;// 向下的狀態 boolean RightStatue = false;// 向右的狀態 boolean LeftStatue = false;// 向左的狀態 public People() { try { image1 = ImageIO.read(new File("image/boy-down-1.png"));//向下的圖片一 image2 = ImageIO.read(new File("image/boy-down-2.png"));//向下的圖片二 image3 = ImageIO.read(new File("image/boy-down-3.png"));//向下的圖片三 } catch (IOException e) { e.printStackTrace(); } x = 100;// 初始x軸化座標 y = 100;// 初始y軸化座標 } public void move() {// 遊戲面板中的移動 step();// 踏步 if (UpStatue && (y > 5)) { y -= 5; } else if (DownStatue && (y < 410)) { y += 5; } else if (RightStatue && (x < 555)) { x += 5; } else if (LeftStatue && (x > 5)) { x -= 5; } } void step() {// 移動中的踏步 int tmp = stepTimer / 250 % 3;// 每四分之一秒出現一張圖 只會餘0,1,2因此只有 三種結果 switch (tmp) { case 0: image = image1; break; case 1: image = image2; break; default: image = image3; break; } stepTimer += fresh;// 得到計時器遞增刷新時間 } public void up() {// 向上 UpStatue = true; } public void down() { DownStatue = true; } public void right() { RightStatue = true; } public void left() { LeftStatue = true; } public void released() { UpStatue = false; DownStatue = false; RightStatue = false; LeftStatue = false; } } https://i.imgur.com/LY2N0B0.jpg
<MainFrame.java檔案> package ex02; import java.awt.Container; import javax.swing.JFrame; public class MainFrame extends JFrame { GamePanel p; public MainFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p = new GamePanel(); Container c = getContentPane();// 獲得窗體的主容器 c.add(p);// 把遊戲面板添加到主容器 addKeyListener(p);// 添加鍵盤事件監聽 } public static void main(String[] args) { MainFrame frame = new MainFrame(); frame.setTitle("The Game"); frame.setBounds(300, 100, 600, 500);// 設置屏幕位置,大小 frame.setVisible(true); frame.setResizable(false); } } https://i.imgur.com/SZa29fD.jpg
<FreshThread.java檔案> package ex02; public class FreshThread extends Thread {// 繼承線程功能 GamePanel p; public FreshThread(GamePanel p) {// 調用構造方法 this.p = p;// 將參數給類成員屬性賦值 } @Override public void run() { while (!p.isFinish()) {// 當遊戲沒有結束時 p.repaint();// 重新繪製圖片 try { Thread.sleep(p.FRESH); } catch (InterruptedException e) { e.printStackTrace(); } // 休眠多長時間 } } } 是超級新手,謝謝各位撥冗觀看~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.11.192 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1582274157.A.C91.html ※ 編輯: earric (59.126.69.245 臺灣), 02/21/2020 17:48:56 ※ 編輯: earric (59.126.69.245 臺灣), 02/21/2020 17:59:54 ※ 編輯: earric (59.126.69.245 臺灣), 02/21/2020 18:02:57 ※ 編輯: earric (180.217.239.202 臺灣), 02/21/2020 18:06:22 ※ 編輯: earric (59.126.69.245 臺灣), 02/21/2020 18:22:18

02/23 10:08, 4年前 , 1F
要不要考慮考慮用一個repo, 這樣架構什麼的比較清楚
02/23 10:08, 1F

02/23 10:36, 4年前 , 2F
昨天已經把功能用出來了,會試著用pro看看的,謝謝建議~
02/23 10:36, 2F
文章代碼(AID): #1UJvPjoH (java)