Java/Java.Swing

Swing bubble bubble Game 3 (왼쪽 오른쪽 벽 감지하기)

H_u 2024. 5. 2. 17:07
728x90
반응형
SMALL

package bubble.test.ex03;

 

import java.awt.Color;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

 

import javax.imageio.ImageIO;

 

/**

* 현재 메인 쓰레드는 너~무 바쁨

* 백그라운드에서 계속 Player 에 움직임을 관찰할 예정

*/

public class BackgroundPlayerService implements Runnable {

 

private BufferedImage image;

private Player player;

 

// 생성자 의존 주입 DI

public BackgroundPlayerService(Player player) {

this.player = player;

 

try {

image = ImageIO.read(new File("img/backgroundMapService.png"));

} catch (IOException e) {

e.printStackTrace();

}

 

}

 

@Override

public void run() {

while(true) {

// 색상 확인 todo (보정값 필요)

Color leftColor = new Color(image.getRGB(player.getX() + 10, player.getY() + 25));

Color rightColor = new Color(image.getRGB(player.getX() + 50 + 10, player.getY() + 25));

 

// 왼쪽에 충돌함

if(leftColor.getRed() == 255 && leftColor.getGreen() == 0 && leftColor.getBlue() == 0) {

System.out.println("왼쪽벽에 충돌 함.");

} else if(rightColor.getRed() == 255 && rightColor.getGreen() == 0 && rightColor.getBlue() == 0) {

System.out.println("오른쪽벽에 충돌 함.");

}

// 위 두 조건이 아니면 player 마음대로 움직일 수 있다.

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

 

}

 

 

}

 

}

 

package bubble.test.ex03;

 

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

 

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

 

public class BubbleFrame extends JFrame {

 

private JLabel backgroundMap;

// 포함관계 - 콤포지션

private Player player;

 

public BubbleFrame() {

 

initData();

setInitLayout();

addEventListener();

 

// Player 백그라운드 서비스 시작

new Thread(new BackgroundPlayerService(player)).start();

}

 

private void initData() {

// todo 이미지 변경

backgroundMap = new JLabel(new ImageIcon("img/backgroundMapService.png"));

// backgroundMap = new JLabel(new ImageIcon("img/test.png"));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Frame --> root Panel

setContentPane(backgroundMap); // add 처리

setSize(1000, 640);

 

player = new Player();

 

}

 

private void setInitLayout() {

// 좌표 값으로 배치

setLayout(null);

setResizable(false); // 프레임 조절 불가

setLocationRelativeTo(null); // JFrame 여러분 모니터 가운데 자동 배치

setVisible(true);

 

add(player);

}

 

private void addEventListener() {

 

this.addKeyListener(new KeyAdapter() {

 

@Override

public void keyPressed(KeyEvent e) {

System.out.println("key code : " + e.getKeyCode());

 

switch (e.getKeyCode()) {

case KeyEvent.VK_LEFT:

player.left();

break;

case KeyEvent.VK_RIGHT:

player.right();

break;

case KeyEvent.VK_UP:

player.up();

break;

}

} // end of KeyPressed

 

@Override

public void keyReleased(KeyEvent e) {

switch (e.getKeyCode()) {

case KeyEvent.VK_LEFT:

player.setLeft(false);

break;

case KeyEvent.VK_RIGHT:

player.setRight(false);

break;

}

} // end of KeyReleased

 

});

}

 

// 코드 테스트

public static void main(String[] args) {

new BubbleFrame();

} // end of main

 

}

 

package bubble.test.ex03;

 

public interface Moveable {

// public abstract 생략 가능

public abstract void left();

public abstract void right();

public abstract void down();

public abstract void up();

 

}

 

package bubble.test.ex03;

 

import javax.swing.ImageIcon;

import javax.swing.JLabel;

 

public class Player extends JLabel implements Moveable {

 

private int x;

private int y;

private ImageIcon playerR, playerL;

 

// 움직임의 상태

private boolean left;

private boolean right;

private boolean up;

private boolean down;

 

// 플레이어 속도 상태

private final int SPEED = 4;

private final int JUMPSPEED = 2;

 

// setter

public void setLeft(boolean left) {

this.left = left;

}

 

public void setRight(boolean right) {

this.right = right;

}

 

 

public Player() {

initData();

setInitLayout();

}

 

private void initData() {

playerR = new ImageIcon("img/playerR.png");

playerL = new ImageIcon("img/playerL.png");

 

// 처음 실행 시 초기 값 셋팅

x = 450;

y = 540;

 

//플레이어가 가만이 멈춤 상태

left = false;

right = false;

up = false;

down = false;

 

setIcon(playerR);

setSize(50, 50);

setLocation(x, y);

}

 

private void setInitLayout() {

}

 

@Override

public void left() {

left = true;

setIcon(playerL);

new Thread(new Runnable() {

@Override

public void run() {

while(left) {

x = x - SPEED;

setLocation(x, y);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

}

 

@Override

public void right() {

right = true;

setIcon(playerR);

new Thread(new Runnable() {

@Override

public void run() {

while(right) {

x = x + SPEED;

setLocation(x, y);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

} // end of right

 

@Override

public void up() {

System.out.println("점프");

up = true;

new Thread(new Runnable() {

@Override

public void run() {

 

for(int i = 0; i < 130 / JUMPSPEED; i++) {

y = y - JUMPSPEED;

setLocation(x, y);

try {

Thread.sleep(5);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

 

// 객체의 상태값을 잘 조절해야 한다.

up = false;

down();

 

}

}).start();

 

 

 

}

 

@Override

public void down() {

System.out.println("다운");

down = true;

new Thread(new Runnable() {

@Override

public void run() {

for(int i = 0; i < 130 / JUMPSPEED; i++) {

y = y + JUMPSPEED;

setLocation(x, y);

try {

Thread.sleep(3);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

 

}

}).start();

// 상태값 처리를 확실히 하자.

down = false;

}

 

}

벽 감지 성공

728x90
반응형
SMALL

'Java > Java.Swing' 카테고리의 다른 글

Swing bubble bubble Game 5 (물방울 생성)  (0) 2024.05.03
Swing bubble bubble Game 4  (0) 2024.05.02
Swing bubble bubble Game 2  (0) 2024.05.02
Swing bubble bubble Game 1  (0) 2024.05.02
Swing - 8 (쓰레드 활용)  (1) 2024.05.01