개인 자료란 (JE)

  서버 커뮤니티


Profile 윈초 루비 유저

wincho_ 8ff851e059fb4dd59be0b55d44f8149f

Profile

커뮤니티 개발 개발자 강좌 일반 프로그래밍

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

2022.03.06 조회 수 2209 추천 수 0

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

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


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

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

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

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


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

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

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

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


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

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


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

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

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


첫번째로 새 클래스를 생성해줍니다.

이름은 Game으로요

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

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

상속받은 클래스는 상속 클래스의 자식이 됩니다.

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

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


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

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

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


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

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

여기서 오버라이딩은 부모 클래스에 있는 함수의 내용을 수정하는것을 의미합니다.


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

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

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


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

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

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


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

while (언제까지?) { //본문 } 

언제까지? 부분에는 true (무한반복) 을 넣어주도록 할게요.

영원히 끝나지 않는다고 하지만, 일단 무시해줄게요.

게임 루프를 작성하기 전 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/023/322/003/262x150.crop.jpg?20221007005559

소식

마인크래프트 라이브 2022 : 응회암 골렘에게 투표하세요!

Dalsu

2022-10-07

0

/files/thumbnails/566/321/003/262x150.crop.jpg?20221006145310

상품

마인크래프트 신규 피규어 출시: 크리에이터 시리즈

Dalsu

2022-10-06

0

/files/thumbnails/521/321/003/262x150.crop.jpg?20221007001648

소식

마인크래프트 라이브 2022 : 라스칼에게 투표하세요!

Dalsu

2022-10-06

0

/files/thumbnails/048/321/003/262x150.crop.jpg?20221005033802

업데이트

마인크래프트 베드락 에디션 1.19.31 업데이트

Dalsu

2022-10-05

0

/files/thumbnails/021/321/003/262x150.crop.jpg?20221007001645

소식

마인크래프트 라이브 2022 : 스니퍼에게 투표하세요!

Dalsu

2022-10-05

0