안녕하세요

 

이번시간에는 휴먼 클래스를 수정하여 게임이 정상적으로 실행되도록 만들어보겠습니다.

 

 

 

휴먼 클래스에는 슬라임 이미지(정확히는 이미지 아이콘)가 불붙은 모양으로 바뀌는 로직이 포함되어 있습니다. 그래서 원래의 이미지 아이콘을 저장할 original 변수를 선언해 두었습니다.

 

 

 

- 첫번째 네모 : 슬라임 객체에서 이미지 아이콘을 추출하여 오리지날 변수에 집어넣습니다. (슬라임 객체가 어느 것이냐에 따라서 블루슬라임 그림이 저장될 수도, 레드슬라임 그림이 저장될 수도 있습니다)

 

- 두번째 네모 : 불붙은 이미지 아이콘을 설정하는 코드입니다. 슬라임에 따라 설정됩니다.

 

- 세번째 네모 : 일정 시간 후에 원래의 이미지 아이콘으로 복귀합니다.

 

 

 

슬라임이 죽었을때 흑백으로 바꾸는 로직입니다.

 

- 1번 : getImage 메소드를 사용하여 이미지 아이콘을 이미지로 바꿔줍니다.

그리고 죽은 후에는 오리지날 이미지가 아니라 흑백 이미지로 바껴야 되기 때문에 타이머를 꺼줍니다.

 

- 2번 : 흑백으로 변경하는 핵심 로직입니다. colorImage에 들어있는 원본을 흑백으로 바꾸어 gImage에 집어 넣습니다.

 

- 3번 : 슬라임의 이미지 아이콘을 gImage로 설정합니다.

 

 

 

감사합니다.

 

더보기
// Human.java

package study;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.GrayFilter;
import javax.swing.ImageIcon;

class Human {

	String name;
	int hp = 100;
	ImageIcon original;

	public Human(String n) {
		name = n;
	}

	public void attack(Slime s) {

		// * 원래 그림
		original = (ImageIcon) s.getIcon();

		// 슬라임이 당하는 그림.
		ImageIcon bsImg_fire = new ImageIcon(Study01.class.getResource("/study/img/slime2(blue).png"));
		ImageIcon rsImg_fire = new ImageIcon(Study01.class.getResource("/study/img/slime2(red).png"));

		// * 슬라임에 따라 당하는 그림을 다르게 설정.
		if (s == Study01.bs1) {
			s.setIcon(bsImg_fire);
		} else {
			s.setIcon(rsImg_fire);
		}

		Timer timer1 = new Timer();
		TimerTask task1 = new TimerTask() {

			@Override
			public void run() {

				// * 일정 시간 후에 수행할 코드
				s.setIcon(original);

			}

		};

		timer1.schedule(task1, 500);

		s.hp = s.hp - 30;

		if (s.hp < 1) {

			// * 이미지 아이콘에서 이미지를 추출.
			Image colorImage = original.getImage();
			timer1.cancel(); // 이 코드 생략시 죽은후에 49행 실행됨.

			if (s == Study01.bs1) {
				Study01.btn1.setEnabled(false);
			} else {
				Study01.btn2.setEnabled(false);
			}

			// 흑백으로 변경.
			ImageFilter filter = new GrayFilter(true, 50);
			ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter);
			Image gImage = Toolkit.getDefaultToolkit().createImage(producer);
			
			s.setIcon(new ImageIcon(gImage));

			Study01.lbl.setText(s.name + "는 사망했다");
			Study01.lbl2.setText("");

		} else {
			Study01.lbl.setText(name + "의 공격. " + s.name + "의 체력은 " + s.hp + ".");

		}

	}

}

안녕하세요.

 

문득 코드를 더 간결하고 이해하기 쉽게 리펙토링하는 방법이 생각나서 적용해볼까 합니다.

 

기존 코드는 슬라임 객체 따로, 슬라임 그림을 표시하는 라벨 객체 따로였는데요, 그래서 코드도 길어지고 다루기도 힘들었습니다.

 

그래서 슬라임 클래스와 라벨 클래스를 합체시켜 버리도록 합시다. 어떻게요? 슬라임클래스가 라벨 클래스를 상속하는 거죠. 아래를 봅시다.

 

슬라임 클래스는 이렇게 9행만 살짝 수정하면 됩니다. 다른건 건드릴 필요가 없어요.

 

몇글자 추가한 거 밖에 없지만 영향력은 엄청납니다. 이제부터 슬라임 클래스는 라벨은 라벨인데 슬라임의 특성이 가미된 라벨입니다. 무슨말이냐구요? 차차 이해되실 겁니다.

 

이제 메인클래스인 스터디01로 가봅시다.

 

전역변수 선언하는 부분부터 상당히 간결해졌습니다.

 

bs1, rs1이 슬라임이자 라벨이므로 imgLbl, imgLbl2는 필요가 없습니다.

 

그리고 bsImg, rsImg도 없이 구현해보도록 하겠습니다.

 

bs1, rs1, h는 선언만 해놓고 할당은 아래쪽에서 하겠습니다.

 

 

 

프레임을 생성하기 전에 인간 객체를 생성하여 h 변수에 할당을 해둡니다.

 

 

 

오늘의 핵심코드 되겠습니다.

슬라임 객체를 생성하여 bs1과 rs1에 할당했는데요, 그러고나니 라벨처럼 사용할 수가 있습니다^^

아이콘도 설정하고, 위치도 설정하고, 정렬도 설정하고 말이죠^^

 

 

 

버튼객체가 슬라임객체보다 일찍 생성되면 91, 92행에서 에러가 나기 때문에 나중에 생성시켜 주었습니다.

 

 

 

회피동작을 구현하는 로직도 상당히 간결해졌습니다.

 

예전에는 s가 bs1인지 아닌지 판단해서 그에 맞는 그림을 움직여줘야 했지만 이제 그냥 s 자체를 움직여주면 됩니다^^

 

그런데 지금 코드를 실행하면 휴먼 클래스에서 에러가 납니다.

 

다음 시간에는 휴먼 클래스도 수정하고 슬라임이 죽으면 흑백으로 바뀌는 로직도 구현해보겠습니다.

 

감사합니다.

 

 

study01.txt
0.00MB


안녕하세요

 

이번에는 슬라임이 사망했을 경우 슬라임 그림 자체를 없애보도록 하겠습니다.

 

이렇게 말이죠.

 

이번 시간에 사용할 코드는 아래 두줄입니다.

 

프레임.remove(제거할_컴포넌트);
프레임.repaint();

 

프레임에 컴포넌트를 추가할때 add 메소드를 썼듯이, 제거할때는 remove 메소드를 사용합니다. (간단한 영어 매우 감사^^)

 

그런데 프로그램이 실행되어 있을때(전문용어로 런타임이라고 합니다) 그림을 추가하거나 삭제할 경우에는 repaint(다시 칠하기) 메소드를 써줘야 화면에 반영이 되니 주의하세요.

 

 

// 메인 클래스

frm 변수를 다른 클래스에서도 접근할 수 있도록 static 전역변수로 바꿔줍니다.

 

 

// 휴먼 클래스

슬라임의 체력이 1미만일때 이미지 라벨을 제거하고 다시 칠해줍니다.

 

감사합니다.


안녕하세요

 

프로젝트를 압축하여 다른 사람에게 전달해야 되는 경우가 있습니다.

 

방법은 아래와 같습니다.

 

파일 > 내보내기

 

 

아카이브 파일(압축 파일) > 다음

 

 

1. 내보낼 프로젝트 선택

2. 찾아보기로 저장할 경로 선택(파일명까지 입력해야 함)

3. 찾아보기를 완료하면 자동으로 적힙니다

4. 끝

 

 

이렇게 하면 프로젝트가 압축파일로 생성이 됩니다.

 

 

이번엔 압축된 프로젝트를 이클립스에서 불러오는 방법을 알아보겠습니다.

 

 

먼저 압축을 풀어놓고 파일 > 프로젝트 열기

 

 

디렉토리

 

 

slime 폴더가 아니라 그 속에 있는 study를 고르는게 중요합니다.

 

 

 

 

감사합니다.


안녕하세요.


주인공의 공격이 빗나갔을때 슬라임이 피하는 모습을 어떻게 구현하는지 문의하신 분이 계셔서 번외 강좌를 써봅니다.


일단 게임 실행중에 피하는 모습은 아래와 같습니다.




코드는 아래와 같습니다.





예전에 구현했던 화염공격과 비슷한 맥락입니다.



* if문을 통해서 두 슬라임 중에 어느 슬라임인지 특정하고,


* 대상 슬라임 그림의 X축을 20 증가시켜서 오른쪽으로 이동시킵니다.


* 그다음에 타이머를 이용해서 0.5초 후에 위치를 원위치로 옮기는 방식이죠.



코드 전문은 아래와 같습니다.


감사합니다.





안녕하세요. 이번 시간에는 완성한 슬라임 게임을 실행파일로 만들어보도록 하겠습니다.

 

 

 

 

 

먼저 이클립스상에서 게임이 정상작동 하는지 확인합니다.

 

 

 

 

파일 -> 내보내기

 

 

 

 

rannable jar 파일을 고릅니다. 파일을 바로 exe로 변경할 수는 없고 일단 jar 파일로 변환해야 됩니다.

 

 

 

 

 

메인 클래스를 골라주고, jar 파일을 생성할 위치도 잘 정해줍니다.

 

 

 

 

만약 이런 메세지가 나오면 걱정하지 말고 OK를 누릅니다.

 

 

 

해당 경로로 가서 생성된 jar 파일을 실행해 봅시다. (컴퓨터에 따라서 jar 파일이 실행이 안될 수도 있습니다. 하지만 exe 파일은 실행이 될테니까 계속 진행합시다)

 

 

 

이제 jar를 exe로 바꾸는 프로그램을 다운 받아봅시다.

Launch4j라는 프로그램입니다. 아래로 가서 다운 받으세요.

 

https://jinunthing.tistory.com/7

 

[Java] jar파일로 exe 실행파일 만들기/배포하기 by Launch4j

안녕하세요! Ji-nun입니다! 이번 포스팅에서 알아볼 내용은 Java로 작성할 프로그램을 exe 실행파일로 만들기입니다. 실행파일로 만들어주는 프로그램들중 제가 알고있는건 JSmooth, exe4j, Launch4j 3가지 인데..

jinunthing.tistory.com

출력할 exe파일명과, 원본 jar파일을 지정해줍니다.

 

 

 

다음 과정을 진행하기 전에 자바 버전을 확인해둡시다.

 

이클립스에서 아무 코드나 실행하면 이렇게 jdk 버전을 표기해줍니다.

 

 

 

JRE 탭으로 가서 아까 알아둔 자바 버전을 적고 톱니바퀴 버튼을 누릅니다.

 

 

 

exe파일 외에도 xml파일이 같이 생성될건데 xml파일의 경로지정창이 뜹니다. 별로 중요하지 않기 때문에 대충 해줍니다.

 

 

 

xml 지정이 끝나면 아래 로그창에 exe파일이 잘 만들어졌다고 뜹니다.

 

 

 

성공^^!

 

 

 

드디어 장장 75강에 걸친 슬라임 게임 만들기가 끝났네요. 간단한 게임이지만 만들어가면서 자바의 여러가지 개념과 객체들을 살펴볼 수 있었습니다. 나열하자면 대략 아래와 같겠네요.

 

변수, 자료형, 형변환, for문, if문, while문, 메세지박스, 인풋박스, 함수, 클래스, 생성자, break, null, 버튼, 레이아웃, 프레임, 라벨, 오버로드, 오버라이드, 상속, 타이머 등

 

강의를 보며 게임을 만들어나가면서 자바의 재미를 느끼셨기를 바랍니다^^ 그리고 어느정도 감이 잡히셨다면 자신만의 프로그램이나 게임을 만들어보시길 바랍니다. 만약 자바의 기본기를 좀 더 연마하고 싶으시면 아래 키워드들을 검색해서 공부해보시길 바랍니다.

 

캡슐화, 추상클래스, 인터페이스, 익명클래스, 익명이너클래스, 다형성, 제네릭

 

감사합니다.


안녕하세요.


이번 시간에 게임을 완성하고 다음 시간에 게임을 EXE 파일로 만들면 이 강좌도 끝이 나네요.


자, 1/3의 확률로 레드슬라임이 두배의 공격력으로 공격하도록 만들어 보겠습니다.




// Slime


레드슬라임 클래스에 데미지 30짜리인 어택2 함수를 만들어줍니다.




// Slime


슬라임 클래스의 어택 함수를 데미지가 30 이상일 경우 '강한 공격'이라는 텍스트를 출력하도록 수정합니다.




// Study01


메인 클래스에다가 랜덤수 0이 나왔을때 두배의 공격을 가하도록 코딩합니다. 어택2는 레드슬라임 클래스에 있기 때문에 형변환 필수입니다.





이렇게 해서 게임 완성이네요^^


이제 만든 게임을 이클립스나 다른 수단 없이 바로 실행할 수 있도록 실행 파일로 만들어야겠죠?


다음 시간에 그걸 해보도록 하겠습니다.


감사합니다.


(아래는 소스를 압축한 파일입니다)





Slime Game.zip


+ Recent posts