마인크래프트/커맨드 강좌

마크 커맨드 강좌 #2 [2단 점프]

Hino 2024. 5. 13. 00:00

0. 서론

커맨드로 화살을 강화해봤었는데,  플레이를 하다보면 2단 점프가 있으면 좋지 않을까?

라는 생각을 할 수 있습니다.

 

저 또한 이를 구현했던 기억이 있으며, 사람들의 방식은 다양했었지요!

 

오늘은 2단 점프를 구현해보도록 하겠습니다.

 

 

 

 

1. 사전 설정 : 스코어보드

우선 설명에 앞서, scoreboard라는 명령어를 추후에 다룰 예정입니다만,

오늘은 간단하게 설명만 하려고합니다.

 

scoreboard란, 플레이어 목록 점수를 관리하는 명령어입니다.

 

프로그래밍을 해보셨다면 '변수'에 대해서 알 수 있는데,

이 scoreboard는 '변수'와 가장 유사한 형태의 기반으로 이해하시면 좋을 것 같습니다.

 

이론보단 실전이죠? 스코어보드를 만듭시다.

/scoreboard objectives add test dummy "test"

 

 

명령창에 입력해주세요.

 

test는 정말로 테스트 용도로 만든 것이기 때문에, 다른 이름으로 만드셔도 상관없습니다!

 

이후 다음 명령입니다

/scoreboard objectives setdisplay sidebar test

 

 

모니터 우측에 이름이 정상적으로 표시된다면 잘 따라오고 있다는 증거입니다!

 

이제 여기에 변수를 추가해보겠습니다.

/scoreboard players add @s test 1

 

 

 

다음 명령은 저의 이름으로 test라는 점수판에 1점을 추가하는 것 입니다.

이러면 어떠한 변화가 나타날까요?

 

 

 

다음과 같은 형식으로 점수가 추가되는 것을 볼 수 있습니다!

 

이번에는 간단히 제작 용으로 진행하지만, 추후에 적극적으로 강의에 응용될 예정입니다.

이제 기본적인 셋팅은 끝났으니 작업을 진행해봅시다.

 

우측 스코어보드가 뜨는 화면을 없애고 싶다면,

/scoreboard objectives setdisplay sidebar

 

해당 코드를 입력하면 사라진답니다

 

 

 

 

 


2. 구상

자 이제 2단 점프를 만들어보겠습니다.

 

여러분의 발상으로 2단 점프를 만든다면 어떠한 원리로 만들 수 있을까요?

 

사실 개발과 발상은 유사한 개념을 가지고 있으므로,

어? 내가 만들만한데? 에서 코드로 작성할 수 있다면 그것을 구현할 수 있는 부분이라 할 수 있습니다!

 

제가 생각하기엔 이전 강의에서 일부 응용하고, 일부 개념을 추가한다면 가능할꺼 같네요.

 

 

 

우선 저의 생각을 먼저 이야기 해볼까요?

 

- 마인크래프트는 점프를 하면 1.5칸 살짝 안되게 튀어오르는데, 만약 한칸 밑이 공기라면

그 아래에 투명블록을 설치하면 되지 않을까?

 

그리고 아랫 블록이 투명블록이면 더 이상 아랫 블록이 공기여도 투명 블록이 설치되지 않고,

바닥에 닿으면 이를 초기화해주는 시스템을 구현하면되는겁니다.

 

 

제가 생각한 방식은 이미 해외에서도 가장 많이 사용되는 2단 점프의 커맨드 명령이였습니다.

이 부분은 근본적인 학습 형태로 일반화되었다고 볼 수 있겠네요.

 

 

다른 방식으로는 scoreboard 중 시프트를 누르면 이를 감지하는 것이 있는데,

시프트를 누르면 공중 부양을 부여하여, 추가로 점프시키는 방법도 있습니다.

 

 

 

 

또 한가지 예로 든다면, 아이템을 버리는 행위로도 가능할 수 있겠네요!

아이템을 던져서 버린다면, 이는 엔티티 취급되는데, 여기로 tp시켜서 2단점프로도 구현할 수 있겠지요!

 

이는 아이템을 버릴때 포물선으로 던져지는 원리를 응용하면 충분히 가능합니다.

 

다양한 방식이 있고, 어떠한 방식으로 만들어도 상관없지만,

오늘은 근본있는 배리어와 스코어보드를 적절히 혼합하여 강의를 진행하겠습니다.

 

 

 

 


3. 구현 및 코드

(반복형 / 무조건 / 항상 활성화)
execute as @a[nbt={OnGround:0b},scores={test=0}] at @s unless block ~ ~-1 ~ air run scoreboard players set @s test 1
// 바닥을 감지하는 코드


(반복형 / 무조건 / 항상 활성화)
execute as @a[nbt={OnGround:0b},scores={test=1}] at @s if block ~ ~-1 ~ air run fill ~-1 ~-1 ~-1 ~1 ~-1 ~1 minecraft:barrier replace air
(연쇄형 / 조건적 / 항상 활성화)
execute as @a[nbt={OnGround:0b},scores={test=1}] at @s run scoreboard players set @s test 2
// 점프 후, 2단 점프를 할 수 있는 환경일 때 블럭을 설정


(반복형 / 무조건 / 항상 활성화)
execute as @a[nbt={OnGround:1b},scores={test=2}] at @s run fill ~-7 ~-1 ~-7 ~7 ~0 ~7 air replace minecraft:barrier
(연쇄형 / 조건적 / 항상 활성화)
execute as @a[scores={test=2},nbt={OnGround:1b}] at @s run scoreboard players set @s test 0
// 바닥에 땅이 닿는 경우 투명 블럭 제거 및 초기화

 

작동만 해보고 싶다면 위 코드를 복사하세요!

 

위 코드를 사용한다면 2단 점프는 가능하지만, 아마 완벽하기엔 아쉬울 것이고

멀티에서 응용할 수 없는 코드 구조이므로 멀티인 경우 코드 수정은 필수입니다.

 

사유는 위 코드는 가장 기본적인 개념인 '점프하면 밑에 발판이 생긴다.' 이므로,

실제로 응용하려면 점프에는 추가적인 작업 요소가 필요합니다.

(Ex. 달리면서 점프, 허공에 떨어지며 원할 때 점프 등)

 

 

블럭을 배치하면 요러한 형태가 나와야합니다!

 

두번째 강의가 어렵다 느낄 수 있지만, 아직 쉬운 정도이므로 따라와주셔야합니다!

 

첫 강의는 맛보기 강의이며, 잘 따라오셔야 혼자서 원하는 것을 만들거나 구현할 수 있기때문입니다.

 

우선 많이 어려운 부분이나 혼란스러운 부분은 없지만,

조금 길어진 코드이니 이번 강의에서만 분석을 도와드리겠습니다.

 

다음 강의에선 직접 분석해야합니다!

execute 
as @a[nbt={OnGround:0b},scores={test=0}] 
at @s 
unless block ~ ~-1 ~ air 
run scoreboard players set @s test 1

 

우선 첫 문장을 분석해볼게요.

execute = 대상 선정을 시작

as @a 전체 플레이어 중, nbt={OnGround:0b} 공중 상태의 nbt를 보유하고, scores={test=0} test라는 스코어가 0인 대상

at @s 위 조건 대상을 기준으로 실행

unless 부정 조건 - 자신의 기준 밑 블록이 공기가 아니라면?

(~와 같은 물결 모양은 현 플레이어 좌표를 기준으로 합니다)

(개발에서는 if / else를 쓴다면 마크에서는 if / unless를 사용합니다)

run scoreboard players set @s test 1 실행하여, 나의 점수를 1로 변경한다.

 

요약하면, 플레이어 중 공중 상태에서 자신의 발 밑이 공기가 아니라면 나의 점수를 1점으로 설정한다는 의미입니다.

 

왜 발 밑이 공기가 아닌 경우 점수를 추가할까요?

- 이는 2단 점프가 아닌 3단 점프, 제자리 점프를 방지하기 위함입니다.

 

이러한 코드 작성으로 스코어가 1점으로 설정되려면, -1칸 미만 즉, 0 ~ 1 공간 사이의 값이 공기일때만 1점이 되도록 설정되며, 이는 낙하 직전과 점프 직전 말고는 발생할 가능성이 적습니다.

 

따라서 해당 코드로 작성되었습니다

 

execute 
as @a[nbt={OnGround:0b},scores={test=1}] 
at @s if block ~ ~-1 ~ air 
run fill ~-1 ~-1 ~-1 ~1 ~-1 ~1 minecraft:barrier replace air


execute
as @a[nbt={OnGround:0b},scores={test=1}] 
at @s 
run scoreboard players set @s test 2

 

다음 구문입니다.

분석하면 공중 상태에서 스코어가 1일 때, 자신의 발 밑이 공기라면 배리어를 아래에 설치합니다.

그리고 연계되어 해당 플레이어의 스코어를 2로 설정합니다.

 

 

이번과 같은 경우 명령이 2개인데, 이는 연쇄/조건 블럭을 이용했습니다.

 

이는 앞 블록이 정상적으로 실행되었다면?

뒤에 블럭이 연쇄적으로 실행된다는 의미입니다.

 

다만 실행되지 않았다면 뒤에 블럭도 동작되지 않으며, 이는 if문과 유사한 속성을 지니고 있습니다.

 

 

마지막 구문입니다!

execute 
as @a[nbt={OnGround:1b},scores={test=2}] 
at @s 
run fill ~-7 ~-1 ~-7 ~7 ~0 ~7 air replace minecraft:barrier



execute 
as @a[scores={test=2},nbt={OnGround:1b}] 
at @s 
run scoreboard players set @s test 0

 

이번 구문은 OnGround:1b 즉, 땅에 닿은 상태이네요.

바닥에 닿은 상태에서 test 스코어가 2인 경우, 근처에 배리어를 삭제하는 코드입니다.

 

그러곤 스코어 보드를 0으로 설정하는 코드를 가지고 있습니다.

 

 

이번에는 코드를 분석했지만, 사실 이 정도 코드는 직접 읽을 수 있어야합니다.

다음 시간부터는 구글링을 해서라도 직접 작성하는 습관을 길렀으면 좋겠네요.

 

 

 

 

 

4. 결과 영상

 

마지막으로 결과 시연입니다.

 

 

 

 

해당 강의는 여기서 마치도록 하겠습니다.

본래라면 코드는 직접 짜는 게 맞지만, 구현만 해보고 싶은 플레이어들이 있을 수 있어 전체 코드는 매번 공유하겠습니다.

 

감사합니다