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

作者: earric (earric9972202)   2020-02-21 16:35:55
(此文為代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();
} // 休眠多長時間
}
}
}
是超級新手,謝謝各位撥冗觀看~~~
作者: pupudice (poopoodice)   2020-02-23 10:08:00
要不要考慮考慮用一個repo, 這樣架構什麼的比較清楚
作者: earric (earric9972202)   2020-02-23 10:36:00
昨天已經把功能用出來了,會試著用pro看看的,謝謝建議~

Links booklink

Contact Us: admin [ a t ] ucptt.com