최원종의 개발 블로그

Bubble_4(물방울 생성) 본문

Java/SWING

Bubble_4(물방울 생성)

chl6698 2026. 3. 19. 17:24

파일구성

bubble/test04/
  ├── Moveable.java                ← bubble-1 과 동일
  ├── Player.java                  ← bubble-3 과 동일
  ├── BackgroundPlayerService.java ← bubble-3 과 동일
  ├── Bubble.java                  ← 신규 (물방울 클래스)
  └── BubbleFrame.java             ← 스페이스바 이벤트 추가

 

https://youtu.be/EePUO04GUY4

-Bubble

package test04;

import javax.swing.*;
import java.awt.*;

public class Bubble extends JLabel {

    private int x;
    private int y;

    private ImageIcon bubbleIcon;
    private Player player;

    // getter
    @Override
    public int getX() {
        return x;
    }

    @Override
    public int getY() {
        return y;
    }

    // setter
    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public Bubble(Player player) {
        this.player = player;
        initData();
        setInitLayout();
    }

    private void initData() {
        bubbleIcon = new ImageIcon("img/bubble.png");
    }

    private void setInitLayout() {
        x = player.getX();
        y = player.getY();
        setIcon(bubbleIcon);
        setSize(50, 50);
        setLocation(x, y);
        setVisible(true);
    }


}

 

-BubbleFrame

package test04;

import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class BubbleFrame extends JFrame {

    private JLabel backgroundMap;
    private Player player;

    public BubbleFrame() {
        initData();
        setInitLayout();
        addEventListener();
        //충돌감지 백그라운드 서비스 시작
        new Thread(new BackgroundPlayerService(player)).start();
    }

    private void initData() {
        setTitle("버블버블게임");
        setSize(1000, 640);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

        player = new Player();
    }

    private void setInitLayout() {
        setLayout(null);//좌표기반
        setResizable(false); //창 크기 고정
        setLocationRelativeTo(null); //화면 정 중앙 배치 (프레임)

        backgroundMap.add(player);
        setVisible(true);// 화면에 보이게
    }

    private void addEventListener() {
        this.addKeyListener(new KeyAdapter() {
            @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;
                }
            }

            @Override
            public void keyPressed(KeyEvent e) {
                //방향키 코드를 Player의 이동 메서드로 연결
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        //이동 중이 아니고 AND 벽에 충돌하지 않은 상태일 때만 left() 호출 가능
                        if (player.isLeft() == false && player.isLeftWallCrash() == false) {
                            player.left();
                        }
                        break;

                    case KeyEvent.VK_RIGHT:
                        //이동 중이 아니고 AND 벽에 충돌하지 않은 상태일 때만 right() 호출 가능
                        if (player.isRight() == false && player.isRightWallCrash() == false) {
                            player.right();
                        }
                        break;

                    case KeyEvent.VK_UP:
                        player.up();
                        break;

                    case KeyEvent.VK_SPACE:
                        fireBubble();
                        break;
                }
            }
        });
    }

    //todo 임시 버블 클래스 생성


    private void fireBubble() {
        Bubble bubble = new Bubble(player);
        backgroundMap.add(bubble);
        //동적으로 컴포넌트가 그려지기 때문에 버그 발생 가능
        backgroundMap.revalidate(); //레이아웃 재 계산
        backgroundMap.repaint(); //화면을 다시 그려라
    }

    //테스트 코드
    public static void main(String[] args) {
        new BubbleFrame();
    }
}

'Java > SWING' 카테고리의 다른 글

Bubble_6(바닥, 층 감지 기능)  (0) 2026.03.20
Bubble_5(물방울 동작 처리)  (0) 2026.03.19
Bubble_3(왼쪽 오른쪽 벽 감지)  (0) 2026.03.19
Bubble_2(이동, 점프)  (0) 2026.03.19
Bubble_1(기본 화면완성)  (0) 2026.03.18