개인 자료란 (JE)

  서버 커뮤니티

Profile 윈초 디벨로퍼 인증 개발자

wincho_ 8ff851e059fb4dd59be0b55d44f8149f

Profile

커뮤니티 소통 개발하기 프로그래밍

[게임개발로 시작하는 자바 EP. 6] 게임 루프 제작하기

2022.03.06 조회 수 2777 추천 수 0

이전 글: EP. 5 - 창 띄우기

다음 글: EP. 7 - 렌더러 만들기


| Step 1. 게임 루프 제작하기

마인크래프트로 생각해봅시다.

마인크래프트에선 1틱은 0.05초, 1초는 20틱이에요.

1틱당 게임 업데이트가 한번 일어납니다.


그러면 fps로 생각해봅시다.

1초당 60번 렌더링. 120번..

이렇게 수치를 정할수 있죠.

1초당 60번 렌더링이면, 렌더 함수를 1초에 60번 호출하면 됩니다.


여기서 문제가 발생합니다.

게임 업데이트와 게임 렌더링은 1초당 작동 횟수가 달라요.


요새 프로그래밍은 대단하신분들이 만든 코드 복사해오기랍니다..

Minicraft+라는 프로젝트에서 게임 루프 코드를 가져오겠습니다.

게임 루프 잘짜놨더라구요,, 아이디어가.. <- 대충 핑계


첫번째로 새 class를 생성해줍니다.

이름은 Game으로요

이곳에서 상속이라는 개념이 사용됩니다.

class이름 뒤에 extends 상속할 클래스 를 넣어서 사용할수 있어요.

상속받은 class(자식 class)는 상속 class의 자식이 됩니다.

현실에서 아이는 부모의 영향을 받습니다.

여기서도 자식 class는 부모 클래스에 있던 메서드, 필드들을 사용할수 있어요.


Game 클래스는 Thread를 상속할겁니다.

Thread는 자바에서 비동기개발을 할때 자주 쓰이지만, 너무 많이 (1만개정도) 생성하면 오히려 모든 Thread가 느려집니다.

Thread는 CPU의 다른 공간에서 연산을 한다고 생각하면 쉽습니다.


Thread에는 run이라는 함수가 정의되어있습니다.

저희는 그 함수를 오버라이딩해줄겁니다.

(오버라이딩 = 부모 클래스에 있는 메서드의 본문을 덮어쓰는 것)


IJ에서 클래스 본문 부분에 run을 입력해 보세요.

Thread에 public void run() {...} 이라는 메서드가 존재한다고 알려줍니다.

저기서 키를 한번 눌러보세요.


자동으로 새로운 메서드가 생겼네요!

super.run();부분에 다른 구역에서 작동시킬 코드를 써주시면 됩니다.

(super = 부모 클래스를 가리킴 / super.run() -> 부모 클래스의 run함수 실행)

저희는 Game에선 무한 반복을 실행시켜볼게요.


자바에서 무한반복은 while으로 할수있어요.

while (조건) { //본문 } 

while문은 조건이 일때 반복하고, 거짓이 되는순간 반복을 종료합니다.

우리는 무한반복을 원하기때문에 true를 넣어 조건을 참으로 만들어줍니다.

IDE에서 while문이 (예외가 발생하지 않으면) 영원히 끝나지 않는다는 경고를 하지만, 무시해도 괜찮습니다.

게임 루프를 작성하기 전 Game 클래스에 필드를 몇개 추가할거에요.

public (모든곳에서), static (정적인), final (수정되지 않는), int(정수형) 변수를 만들어줄겁니다.

이름은 GAME_SPEED로요.

이것은 게임이 1초에 몇번 작동할지에 대한 값을 저장해두는 변수입니다.

저는 60으로 설정해둘게요.


run의 본문, while 위쪽에 새로운 변수들을 또 만들어야합니다.

타이머관련 변수들이에요.

long lastTime = System.nanoTime(); // 마지막 시간

long lastRender = System.nanoTime();  // 마지막으로 렌더링 한 시간

double unprocessed = 0;  // 틱 계산할때 필요한 변수

int frames = 0; int ticks = 0; // 초당 프레임 수와 업데이트 수 저장

long lastTimer1 = System.currentTimeMillis();  // 타이머

모두 넣어주시고,


while 본문에 다른 코드를 작성해보겠습니다.

이해 못하셔도 되는 코드에요.


run 함수 아래에 두개의 함수를 더 만들거에요.

이름은 update와 render.

이렇게요.


이제 Main에서 게임 루프를 실행시켜봅시다.

main함수 맨 밑줄에

Game game = new Game(); game.start(); 를 작성해줍니다.

Game클래스에선 start라는 함수를 작성한적이 없죠?

start라는 함수는 부모인 Thread에 존재하는 함수랍니다.

그러니 사용할수 있는거죠

thread에서 start 메서드는, 새로운 공간에서 run 함수를 실행시켜주는 함수에요.


이상태로 프로그램을 실행하면.

잘 나옵니다.


참고:

이 오류들은 주석이나 문자, 문자열에 영어가 아닌 다른 문자가 왔을때 생기는 인코딩 오류에요.

그냥 무시하거나 주석을 지워주시면 해결됩니다!


원랜 렌더러까지 하려햇지만 게임루프가 너무 길어져서..

그냥 다음에 하겠습니다! <- 이러다 안할거같은데




1개의 댓글

윈초
2022.05.07

.. 가 사실이 되었습니다!


뉴스 및 창작물
/files/thumbnails/477/930/003/262x150.crop.jpg?20241201030912

레드스톤

뉴진스 - Super Shy | 마크 노트블럭 커버

노트블럭전문가

2024-12-01

0

/files/thumbnails/483/916/003/262x150.crop.jpg?20241127115329

레드스톤

[노트블럭 커버] 뉴진스 - ETA 3

노트블럭전문가

2024-11-27

1

/files/thumbnails/150/925/003/262x150.crop.jpg?20241123005717

건축

응답하라 1988 ? 1

팀뉴일리시

2024-11-23

5

/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 6

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2