들어가기 전에...

아래 페이지를 먼저 읽는 것이 빠른 이해에 도움이 됩니다.

https://ondolroom.tistory.com/287

 

자바 스윙 이미지 점프 + 낙하 하게 만들기 (프로젝트 대비)

스윙에 이미지를 하나 올리자 낙하가 멈추는 필드가 필요하고 현재 떨어지는 중인지 현재 점프 중인지 확인하는 변수를 생성한다. 그리고 시간을 가져오는 메서드도 하나 만든다. JPanel을 상속��

ondolroom.tistory.com

 

 

더블점프를 위한 준비

점프 횟수를 카운트 하기 위한 변수를 하나 선언 및 초기화 해준다.

 

키 리스너 수정

이전에는 바닥에 닿았을 때만 점프 할 수 있었지만 이제는 공중에서 한번 더 점프해야한다.

더블점프가 2미만일 때만 점프 하도록 설정하자.

 

점프 쓰레드가 가동되면 doubleJump에 1을 추가하고

이번 점프가 몇회째의 점프인지 nowJump에 임시로 저장한다.

 

점프 중일 때 점프가 한번 더 되는 경우 처음 점프를 멈춰준다.
(멈춰주지 않으면 상승 가속이 붙는 것처럼 할 수 있으나 쿠키런에서는 가속이 붙지 않는 것처럼 보이기 때문에 추가함)

그리고 점프가 끝나면 조건에 따라 jump를 false로 변경한다.
(if문이 없다면 스페이스를 따닥 눌러서 더블점프를 할경우 첫번째 점프 스레드의nowJump는 1이고 doubleJump는 2이기 때문에 더블점프 도중 jump가 false로 바뀌어 버린다. 그래서 if문을 추가함)

 

낙하스레드 수정

처음 빨간 박스는 이번 주제와 관련이 없는 내용이지만, imgY에 낙하량을 더해주다보면 낙하량이 더 클 경우가 생긴다.

예를들어 바닥은 250인데 현재 발바닥위치가 240이다. 그때 낙하량이 20이라면 결과적으로 발바닥 위치는 260이 된다.

그러한 점을 보정하기 위한 장치이다.

두번째 박스는 떨어지다가 더블 점프를 할 경우 낙하를 중지하기 위한 조건문이다.

낙하 while문을 빠져나왔을 때 무조건 doubleJump가 0이 된다면 무한점프가 가능해진다.
(바로 위 단락에서 jump가 true면 break하는 조건을 만들었기 때문)

이러한 것을 막기위해 (바닥에 닿았거나 점프 중이 아닐 때) doubleJump를 0으로 바꾸도록 하였다.

 

결과

 

 

 

 

 

 

 

스윙에 이미지를 하나 올리자

낙하가 멈추는 필드가 필요하고

현재 떨어지는 중인지

현재 점프 중인지

확인하는 변수를 생성한다.

그리고 시간을 가져오는 메서드도 하나 만든다.

 

JPanel을 상속받는 클래스를 만들고 이미지를 그린다

 

실행해보면

 

 

패널 생성자 안에 떨어지는 기능을 추가하자

 

패널 생성자 안에 점프기능을 추가하자

 

 

결과

 

쿠키와 젤리가 만나면 젤리가 없어지도록 할 것이다.

 

들어가기 전에...

아래 페이지를 먼저 보시는게 이해에 도움이 됩니다.

https://ondolroom.tistory.com/285

 

자바 스윙(swing) 배경화면이 무한반복 하도록 만들기 (프로젝트 대비)

들어가기 전에... 아래 페이지를 먼저 보시는게 이해에 도움이 됩니다. https://ondolroom.tistory.com/284 자바 스윙(swing) 배경화면이 흐르도록 만들기 (프로젝트 대비) 들어가기 전에... 아래 페이지를 먼저..

ondolroom.tistory.com

 

아이템 클래스 만들기

새로 파일을 하나 만들어서 아이템 클래스를 만들자

아이템 클래스는 이미지와 타입번호, x, y 좌표를 가지고 있다.

 

메인파일로 돌아가자

 

젤리 이미지 그리기

전역공간에 젤리 이미지를 가져온다.

그리고 아이템을 넣을 리스트도 만들어두자.

 

패널의 생성자 안에서 젤리 아이템들을 몇개 추가한다.

 

paintComponent 안에서 for문으로 만든 젤리만큼 이미지를 그리자.

 

 

좌표값 변경과 아이템 제거

좌표값을 변경하는 쓰레드로 이동하자(맵이동 쓰레드)

첫번째 for문은 젤리들의 X좌표를 줄이는 것이고

두번째 for문은 캐릭터 이미지에 젤리의 시작 좌표가 만나면 사라지도록 하는 것이다.

(현재 불완전함.)

 

결과

 

 

 

 

 

 

들어가기 전에...

아래 페이지를 먼저 보시는게 이해에 도움이 됩니다.

https://ondolroom.tistory.com/284

 

자바 스윙(swing) 배경화면이 흐르도록 만들기 (프로젝트 대비)

들어가기 전에... 아래 페이지를 먼저 읽는 것이 빠른 이해를 돕습니다. https://ondolroom.tistory.com/279 자바 WindowBuilder 설치 들어가기 전에... 필자는 STS툴(이클립스)를 사용하고 있으며, WindowBuilder..

ondolroom.tistory.com

 

위 페이지에 있는 코드를 살짝 수정해주자

이미지를 무한 반복하려면 첫 이미지 뒤에 두번째 이미지가 뒤따라 와야한다.

이미지의 넓이에서 부터 시작하면 뒤따라 갈 수 있다.

 

MyPanel에 있는 paintComponent도 수정하자.

1번그림 뒤에 2번 그림이 따라온다.

 

이 부분이 살짝 복잡할 것이다.

back1X와 back2X를 1씩 빼주는 것은 당연한 것이고,

그 뒤의 if문 내용을 보자.

만약에 (back1X의 좌표)가 (-이미지의 넓이)보다 작으면 이미지 넓이의 좌표로 이동한다는 내용이다.

예를들어 넓이가 100인 그림이 있다면,

첫번째 이미지의 X좌표가 -100이되면 화면에서 안보이게 될 것이다.

두번째 이미지는 X좌표가 0이 될 것이고, 

그때 첫번째 이미지의 X좌표를 이미지의 넓이인 100으로 만들면

두번째 이미지의 뒤로 가는 셈이 된다.

 

+딜레이를 0.001초로 주었다.

 

결과

무한반복 된다.

 

들어가기 전에...

아래 페이지를 먼저 읽는 것이 빠른 이해를 돕습니다.

https://ondolroom.tistory.com/279

 

자바 WindowBuilder 설치

들어가기 전에... 필자는 STS툴(이클립스)를 사용하고 있으며, WindowBuilder로 스윙을 간단히 구현하고, 자세한 코드는 직접 짜는 것을 추천한다. 이클립스 마켓에서 윈도우빌더를 설치하자. WindowBuilder생성..

ondolroom.tistory.com

https://ondolroom.tistory.com/280

 

자바 스윙(SWING) 클릭으로 이미지 변경하기 (프로젝트 대비)

목표 : 마우스 리스너를 작동해본다. 들어가기 전에... 아래의 내용들을 숙지하시고 진행해주세요 https://ondolroom.tistory.com/279 자바 WindowBuilder 설치 들어가기 전에... 필자는 STS툴(이클립스)를 사용하..

ondolroom.tistory.com

 

해당 이미지를 화면에서 왼쪽으로 흐르도록 만들어보자.

 

WindowBuilder에서 JPanel추가

그림을 그리려면 습관적으로 JPanel을 넣어버리자

그리고 JPanel의 레이아웃을 Absolute로 바꾸자

 

다했다면 소스코드로 넘어가자

 

메인 클래스 전역공간에 이미지를 선언 및 초기화

전역공간에 이미지를 선언 및 초기화 하고  이미지의 X값을 변경해주기 위해 변수도 만들자

 

 

JPanel을 상속 받는 MyPanel을 생성

메인 클래스안에 inner클래스를 생성하자

그림을 그리기 위해서 JPanel을 상속받을 것이다. 

패널을 생성하고 생성자와 paintComponent를 만들어주자

 

paintComponent는 그림을 그리는 메서드이다.

여기다가 배경을 그리는 코드를 넣어보자.

 

 

기본 JPanel을 MyPanel로 바꿔주기

initialize메서드의 JPanel을 MyPanel로 바꿔주자.

 

위와 같이 바꿔주면 된다.(JPanel을 상속 받았기 때문에 생성자만 바꿔주면 된다.)

 

MyPanel 생성자에 이미지 이동 무한 반복 만들기

우리는 버튼을 눌러서 움직이는 화면이 아닌 그저 자동으로 무한 반복하게 만들어야한다.

생성자 안에 쓰레드를 만들어보자.

괄호안에 Runnerble()을 이용해서 타겟을 만들어준다.

 

backX를 1씩 빼주고
리페인트를 하고
0.1초 쉰다는 내용이다.

 

결과

화면이 잘 흐른다.

UsersDAO

DB커넥션은 빨리끊기는게 좋다

들어가기 전에...

아래 내용을 숙지하고 보시는 것이 이해가 빠릅니다.

https://ondolroom.tistory.com/279

 

자바 WindowBuilder 설치

들어가기 전에... 필자는 STS툴(이클립스)를 사용하고 있으며, WindowBuilder로 스윙을 간단히 구현하고, 자세한 코드는 직접 짜는 것을 추천한다. 이클립스 마켓에서 윈도우빌더를 설치하자. WindowBuilder생성..

ondolroom.tistory.com

https://ondolroom.tistory.com/280

 

자바 스윙(SWING) 클릭으로 이미지 변경하기 (프로젝트 대비)

목표 : 마우스 리스너를 작동해본다. 들어가기 전에... 아래의 내용들을 숙지하시고 진행해주세요 https://ondolroom.tistory.com/279 자바 WindowBuilder 설치 들어가기 전에... 필자는 STS툴(이클립스)를 사용하..

ondolroom.tistory.com

 

파일생성 및 이미지 넣기

 

WindowBuilder로 파일을 하나 생성하고

이미지 객체를 생성하자.

이미지 좌표를 설정할 수 있게 변수를 전역공간에 배치하자

 

 

나만의 JPanel 만들기

 

JPanel을 상속받아 나만의 JPanel을 만들자

메인 클래스 안에 inner클래스로 생성한다

코드를 복사하려면 더보기 클릭

더보기
	class MyPanel extends JPanel {

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g); // 캔버스 비우기
			g.drawImage(img, imgX, imgY, this); // 이미지 그리기

		}

		public MyPanel() {
			setFocusable(true); // 입력 포커스 받기


			// addMouseListener(new MyMouseListener());
			addMouseMotionListener(new MouseAdapter() { // 드래그는 모션리스너다

				@Override
				public void mouseDragged(MouseEvent e) {
					imgX = e.getX(); // 마우스의 좌표를 받아서 이미지 좌표에 저장
					imgY = e.getY();
					System.out.println(e.getX());
				}
			});
		}
	}

여기서 하나 더 추가해야한다.

repaint를 무한반복하는 쓰레드를 추가하는 것이다.

위의 빨간 빈공간에 추가한다.

위 쓰레드 괄호안에 러너블 인터페이스를 넣고 run을 오버라이딩 해준다

 

while문에 repaint를 넣어 화면을 새로 갱신하자.

 daemon으로 만들어 메인이 종료되면 같이 꺼지게 만들자.
(굳이 이렇게 하지 않아도 된다.)

new Thread(러너블).start;을 이용해도 무방

코드를 복사하려면 더보기 클릭

더보기
			Thread nt = new Thread(new Runnable() {

				@Override
				public void run() {
					while (true) {

						repaint(); // 그림 다시그리기
						try {
							Thread.sleep(10);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			});

			nt.start(); // 스레드 실행

 

JPanel을 MyPanel로 바꾸기

 

이제 initialize에 있는 JPanel을 MyPanel로 바꾸자

전역공간에 추가하는것도 잊지말자

위 코드를 아래와 같이 바꾸자

 

 

 

결과

 

목표 : 마우스 리스너를 작동해본다.

 

들어가기 전에...

아래의 내용들을 숙지하시고 진행해주세요

https://ondolroom.tistory.com/279

 

자바 WindowBuilder 설치

들어가기 전에... 필자는 STS툴(이클립스)를 사용하고 있으며, WindowBuilder로 스윙을 간단히 구현하고, 자세한 코드는 직접 짜는 것을 추천한다. 이클립스 마켓에서 윈도우빌더를 설치하자. WindowBuilder생성..

ondolroom.tistory.com

 

기본화면 만들기

WindowBuilder로 Gui화면을 켜본다.

아래처럼 JPanel을 하나 추가해준다.

그리고 레이아웃을 앱솔루트로 바꿔주자.

 

 

이미지 담기

 

소스코드페이지로 가보자.

이미지를 2개 가져와서 넣을 것이다.

 

위 2개의 이미지 객체를 생성할 것이다.
클래스 최상단의 빈공간을 이용하자.

ic1,ic2로 이미지 객체를 생성하고, img에 이미지를 담는다

 

새로운 inner클래스 JPanel 생성

 

JPanel을 상속받아서 새로운 패널 클래스를 만들 것이다.

메인 클래스 안에 inner클래스로 생성하자.

 

JPanel을 MyPanel로 변경

 

위에서 만들어둔 JPanel을  MyPanel로 바꾸어야 한다.
메인클래스 최상단에 MyPanel 레퍼런스를 생성하자.

 

JPanel 녀석을 MyPanel로 바꿔주자

 

결과

화면을 클릭하면 이미지가 번갈아 가며 출력된다.

 

 

번외

 

드래그는 addMouseMotionListener

더보기
package example;

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;

public class ThreadSwing1 {

	private JFrame frame;

	ImageIcon ic = new ImageIcon("img/pa.png"); // 이미지아이콘 객체 생성
	Image img = ic.getImage(); // 이미지 객체 생성

	int imgX = 50;
	int imgY = 50;

	MyPanel panel;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ThreadSwing1 window = new ThreadSwing1();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public ThreadSwing1() {
		initialize();
	}

	class MyPanel extends JPanel {

		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g); // 캔버스 비우기
			g.drawImage(img, imgX, imgY, this); // 이미지 그리기

		}

		public MyPanel() {
			setFocusable(true); // 입력 포커스 받기

			addMouseMotionListener(new MouseAdapter() { // 드래그는 모션리스너다

				@Override
				public void mouseDragged(MouseEvent e) {
					imgX = e.getX(); // 마우스의 좌표를 받아서 이미지 좌표에 저장
					imgY = e.getY();
					repaint();
					System.out.println(e.getX());
				}
			});
		}
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		panel = new MyPanel();
		frame.getContentPane().add(panel, BorderLayout.CENTER);
		panel.setLayout(null);

	}

}

 

+ Recent posts