배열로 발판과 젤리를 만드는 것은 직관적이지 않고 배치하기가 쉽지 않다.

그래서 이미지를 읽어들여서 발판과 젤리를 배치하도록 만들어 보려고 한다.

 

참고 사이트

https://sunnyholic.com/79

 

이미지에서 픽셀 배열 얻기.

File imgf = new File("source.png"); BufferedImage img = ImageIO.read(imgf); int width = img.getWidth(); int height = img.getHeight(); int[] pixels=new int[width*height]; PixelGrabber grab = new Pixe..

sunnyholic.com

 

 

맵이미지 그리기

맵의 크기는 200 * 12로 하였다.

아주 작게 보이니 돋보기로 확대를 하여 그리도록 하자.

8배로 확대한 사진이다.

발판은 검은색이며 2칸 2칸 마다 만들어 두면 된다. (귀찮음 때문에 쭉 그어 버렸다.)

젤리는 1칸1칸마다 만들 수 있다. 

 

이미지를 값으로 가져오는 클래스 생성

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

더보기
package Test3;

import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.io.File;

import javax.imageio.ImageIO;

public class Bf2 {
	
	static int[] getSize(String src) throws Exception { // 이미지의 사이즈를 가져오는 메서드
		File imgf = new File(src); // 이미지 경로를 입력받아서 파일객체를 만든다.
		BufferedImage img = ImageIO.read(imgf); // 이미지를 버퍼드이미지에 넣는다.
		int width = img.getWidth(); // 이미지의 넓이
		int height = img.getHeight(); // 이미지의 높이
		int[] tempPos = {width, height}; // 넓이 높이를 배열로 만든다.
		return tempPos; // 리턴한다.
	}
	
	static int[][] getPic(String src) throws Exception{ // 아래 코드는 어디다가 갖다두고 쓰자.
		File imgf = new File(src);
		BufferedImage img = ImageIO.read(imgf);
		int width = img.getWidth();
		int height = img.getHeight();
		int[] pixels=new int[width*height];
		PixelGrabber grab = new PixelGrabber(img, 0, 0, width, height, pixels, 0,width);
		grab.grabPixels();
		
		int[][] picture=new int[width][height];
		for(int i=0;i<pixels.length;i++)
		      picture[i%width][i/width]=pixels[i] + 16777216;
		return picture;
	}
	
	public static void main(String[] args) {
        int x = 10;
        int y = 21;
        try {
        	int[] tempArr1 = getSize("img/firstMap.png");
        	int maxX = tempArr1[0];
        	int maxY = tempArr1[1];
        	
        	int[][] tempArr = getPic("img/firstMap.png");
        	
        	for (int i = 0; i <	 maxX; i+=1) {
        		for (int j = 0; j < maxY; j+=1) {
        			System.out.println(tempArr[i][j]);
					
				}
			}
        	
        	
		} catch (Exception e) {
			e.printStackTrace();
		}
        
	}
}

 

 

전역공간에 젤리이미지와 리스트 추가

젤리리스트와 발판리스트를 만든다.

색값을 담을 2차원 배열과

이미지의 사이즈를 담을 배열을 선언한다.

 

패널에서 이미지 불러오기

sizeArr과 colorArr를 초기화 해준다.

미리만들어둔 fieldList와 jellyList에 발판과 젤리를 추가한다.

 

배경 및 발판 이동 쓰레드 수정

배경 및 발판 이동 쓰레드 내용에 아래 내용들을 추가하자

 

 

paintComponent에 발판과 젤리를 그려주자

buffg는 더블버퍼링 관련 내용이기 때문에, 쓰지않는 사람은 g로 바꾼다.

 

결과

 

 

리스트를 하나더 추가하여 아래와 같이 장애물도 만들어보자

들어가기 전에...

아래 페이지를 먼저보시고 어려우시다면 넘어오세요.

https://ondolroom.tistory.com/294

 

자바 스윙 다중 발판 구현하기 (프로젝트 대비)

들어가기 전에... 아래 페이지를 먼저 보시는 것이 빠른 이해에 도움이 됩니다. https://ondolroom.tistory.com/289 자바 스윙 발판 구현하기 (프로젝트 대비) 들어가기 전에... 아래 페이지를 먼저 보시는 것이..

ondolroom.tistory.com

 

* 2중 for문 없이 제작하려면 매우 노가다가 심하니 주의하세요.

 

 

전역공간에 변수 및 배열 추가

발판의 모습을 보여주는 스트링과 리스트들을 추가한다.

벌써부터 물량의 압박이 느껴진다. (이 글에서 빠르게 이해를 하고 이중포문으로 만들어보자.)

 

 

패널에서 발판 추가하기

각각 리스트에 위의 문자열에서 1이면 발판을 추가한다.

복붙하다가 숫자를 잘못적지 않도록 주의한다.

 

 

배경 및 발판 이동 쓰레드 수정

여기로 이동하자.

 

발판들이 왼쪽으로 이동할 수 있도록 -4씩 빼주자. 복붙하다보면 위의 숫자들이 같을 경우가 있다 주의하자.

 

마찬가지로 현재 캐릭터 범위 안에 발판들이 있는지 스캔한다.

footList0번까지 만들어주자.

 

마지막에 꼭 배열을 뒤집어주자.

 

현재 캐릭이 밟을 수 있는 발판 정보를 저장한다.

 

paintComponent로 그림을 그리자

buffg는 더블버퍼링 관련 코드이기때문에 쓰지않는 사람은 g로 바꿔주자.

 

 

결과

 

들어가기 전에...

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

https://ondolroom.tistory.com/289

 

자바 스윙 발판 구현하기 (프로젝트 대비)

들어가기 전에... 아래 페이지를 먼저 보시는 것이 빠른 이해에 도움이 됩니다. https://ondolroom.tistory.com/288 자바 스윙 더블점프 구현하기 (프로젝트 대비) 들어가기 전에... 아래 페이지를 먼저 읽��

ondolroom.tistory.com

 

이전에는 문자열 하나로 발판을 만들었다면 이제는 발판을 배열로 저장하여 구현하려고 한다.

2중 배열 또는 2중 포문이 포함되어 있으니 천천히 따라해보자.

 

 

전역공간에 배열 추가하기

추후 문자열로 된 필드 정보를 담기위한 fieldStr 배열이다.

두번째로 발판 리스트를 담는 fieldList배열이다.(발판 정보를 담은 배열을 저장하는 배열이다.)

 

 

패널에 발판 정보를 입력

 

 

배경 및 발판이동 쓰레드를 수정

이전 글에서 배경이 왼쪽으로 이동하는 쓰레드를 만들어 두었다.

그 아래에 발판을 이동시키는 코드를 추가하자.

 

이중포문이라고 쫄지말자.

결국 개별발판을 불러오기 위함이다.

각각 발판을 -4씩 해주는 내용일 뿐이니 천천히 이해하도록하자.

 

이것도 마찬가지이다.

개별 발판이 캐릭터가 밟을 수 있는 범위 안에 있는지 판별하는 것이다.

 

마지막으로 범위 안에 발판이 있다면, 캐릭터에 높이에 따라 현재 밟을 수 있는 발판을 지정해준다.

 

그림 그리기

paintComponent에 발판코드를 추가하자

마찬가지로 개별발판을 각각 그려주는 것이다.

buffg는 더블버퍼링을 위한 변수로서, 더블버퍼링을 쓰지 않는다면  g로 변경하자.

 

결과

아이템을 먹으면 효과가 나면서 투명해지는 것을 구현 해보려한다.

 

 

참고 사이트

https://bluelimn.tistory.com/entry/java-%ED%88%AC%EB%AA%85%EB%8F%84alpha%EC%A1%B0%EC%A0%88

 

java 투명도(alpha)조절

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AlphaImage implements AdjustmentListener { private JFrame frame; private Canvas canvas; private JScrollBar jsp; private..

bluelimn.tistory.com

 

 

젤리 클래스 생성

새로 파일을 만들어서 젤리 클래스를 생성하였다.

 

 

변수 추가

테스트를 위해 젤리 2개를 추가할 것이다.

그리고 AlphaComposite 변수를 추가한다. (투명도 조절을 위한 변수)

 

 

패널에 젤리 생성

패널에 젤리들을 추가한다.

이미지와 시작 좌표 크기, 투명도를 설정한다.

 

 

젤리를 이동, 이미지 변경, 알파값 조절

젤리들을 0.01초마다 왼쪽으로 이동시키고, 범위 안에 들어오면 이미지를 바꾸고 알파값을 조절한다.

 

 

이미지 그리기

알파 값을 그림 그리기 전에 정해주고 그린다.
(그림 하나하나 그릴때마다 알파 값을 지정해줘야하며 한번만 지정해줄 경우 모든 그림이 투명해지는 불상사가 생긴다.)

 

 

결과

원본 페인트컴포넌트이다.

더블 버퍼링을 추가해보자.

 

전역공간에 변수추가

전역공간에 더블버퍼링 관련 변수를 추가하자

 

paintComponent를 변경하자

buffImage라는 도화지에 buffg가 그림을 그리고 완성된 그림을 g가 출력하게 된다.

 

 

현재 연습용으로 만든 것이라 엔터키를 칠 경우 페이드 하도록하였다.

 

컬러 변수를 추가하자

0 0 0 은 검은색을 뜻하고 마지막 0은 투명도를 뜻한다 (0이면 투명, 255면 불투명이다.)

 

엔터키를 누를 시 투명도를 조절하자

backFade의 색깔은 검은색 그대로 하되 i값을 for문으로 돌려서 값을 늘렸다가 다시 줄이도록 한다.

 

페인트컴포넌트에 추가

현재 더블버퍼링을 사용하기 때문에 update에 넣었지만

기본적으로 paintComponent에 넣어도된다.(그럴경우 buffg를  g로 바꾸자)

 

결과

 

들어가기 전에...

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

https://ondolroom.tistory.com/287

 

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

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

ondolroom.tistory.com

https://ondolroom.tistory.com/288

 

자바 스윙 더블점프 구현하기 (프로젝트 대비)

들어가기 전에... 아래 페이지를 먼저 읽는 것이 빠른 이해에 도움이 됩니다. https://ondolroom.tistory.com/287 자바 스윙 이미지 점프 + 낙하 하게 만들기 (프로젝트 대비) 스윙에 이미지를 하나 올리자 낙하가..

ondolroom.tistory.com

 

이미지들을 추가하자

전역공간에 추가하자

다운 키를 눌렀을 때 반응 할 downKeyOn을 선언 및 초기화

 

점프시/ 더블점프시/ 더블점프후 떨어질 때/ 누웠을 때

등등의 이미지를 추가 하였다.

 

누웠을 때 이미지 변경

keyPressed에는 down키를 눌렀을 시 동작을 입력한다.

downKeyOn이 true가 되고 

점프 / 낙하 / 누은 이미지가 아닐 때 누은 이미지로 바꾼다.

 

keyReleased에는 down키를 뗐을 시 동작을 입력한다.

downKeyOn이 false가 되고

점프 / 낙하 / 기본이미지가 아닐 때 기본이미지로 바꾼다.

 

점프시 이미지 변경

일반점프인지 더블점프인지 구분하여 이미지를 추가한다.

 

낙하시 이미지 변경

낙하 이미지는 더블점프 후에만 바뀐다.

조건을 걸어서 변경되도록 하자.

 

낙하 종료시 이미지 변경

낙하 반복문이 끝났을 경우 다시 이미지를 변경 해주어야한다.

조건이 복잡해보이지만 크게 어려울 것이 없다.

다운키를 눌렀을시 + not점프 + not낙하 +이미지가 누은 이미지가 아닐 때 - 누은 이미지로 변경

다운키를 떼었을시 + not점프 + not낙하 +이미지가 기본이미지가 아닐 때 - 기본이미지로 변경

 

결과

 

들어가기 전에...

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

https://ondolroom.tistory.com/288

 

자바 스윙 더블점프 구현하기 (프로젝트 대비)

들어가기 전에... 아래 페이지를 먼저 읽는 것이 빠른 이해에 도움이 됩니다. https://ondolroom.tistory.com/287 자바 스윙 이미지 점프 + 낙하 하게 만들기 (프로젝트 대비) 스윙에 이미지를 하나 올리자 낙하가..

ondolroom.tistory.com

 

발판 클래스 생성

발판 정보를 담는 Foot클래스를 생성하였다.

이미지, x, y, 넓이, 높이 등을 저장한다.

(@data 등은 lombok을 이용하여 게터 세터 생성자를 만드는 것이다. 모른다면 인터넷 검색.)

 

변수와 메서드 추가

발판 위치를 담는 fieldStr

발판객체를 저장하는 fieldList

캐릭터 아래에 발판이 있는지 확인하는 count

캐릭터 높이에 따른 발판 위치 조정 변수 nowField

 

패널 생성자에 발판 추가

fieldStr의 길이만큼 반복하여

미리 만들어둔 getGround 메서드를 이용해 1일 경우에만 발판을 추가한다.

 

int tempX = i * landimg.getWidth(null); 를 if문안에 넣지 않은 것은 빈칸을 만들기 위해서이다.

 

 

발판 그리기

paintComponent에서 리스트에 추가한 발판들을 모두 그린다.

(temp들은 보기쉽도록 만들어 둔것이고 g.drawImage에 바로 적어도 된다.)

 

 

새로 추가한 쓰레드들

현재 모두 제작한 것이 아니라 한쓰레드에 다 넣으면 정리가 안될 것 같아서 쓰레드를 쪼개서 만들어 놓았다.

(추후 정리예정)

전용 쓰레드들은 패널 클래스 안에 넣는다.

repaint만 전담하는 쓰레드이다.

 

발판을 왼쪽으로 이동시키는 쓰레드이다.

발판이동 반복문 , 캐릭터 아래에 발판이 있는지 확인하는 반복문으로 구성되어 있다.

 

count가 0이면 발판이 없는 상태로

발판이 있지만 캐릭터가 발판 아래에 있다면 발판이 없는 상태로

발판이 있고 캐릭터가 발판 위에 있다면 발판을 지정해준다.

 

낙하 스레드이다.

field로 되어 있던 것들을 nowField로 모두 변경하였다.

 

그리고 낙하량 보정방법도 변경하였다.

 

결과

 

 

ps 점프와 낙하에 이미지 변경 코드를 넣으면 아래와 같이 가능

(주의 : 이미지를 변경하면 이미지의높이가 달라질 수 있기 때문에 사이즈가 같은 이미지를 쓰거나 높이고정이 필요함)

+ Recent posts