[问题] 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