나는 FOP (다중 패러다임, 불순하고 기능 우선 언어)를 사용하여 OOP에서 FRP에 이르는 몇 가지 게임을 작성했습니다 . 이것은 광범위한 질문이지만 최선을 다하겠습니다.
함수형 프로그래밍 언어에서 상태 (일반적으로)를 처리하는 일반적인 기술이 있습니까?
내가 선호하는 방법은 전체 게임을 나타내는 불변 유형을 갖는 것입니다 State
. 그런 다음 State
각 틱마다 업데이트 되는 전류에 대한 변경 가능한 참조가 있습니다. 이것은 순전히 순수하지는 않지만 변경 가능성을 한 곳으로 제한합니다.
전체 게임 상태를 모든 함수에 적용하면 전역 변수 또는 명령 방식과 달리 이점이 없습니다.
사실이 아니다. State
타입은 불변 이므로, 구식 컴포넌트를 잘못 정의 된 방식으로 월드를 변형시킬 수 없습니다. 이렇게하면 GameObject
접근 방식 의 가장 큰 문제가 해결됩니다 (Unity에서 인기 있음). Update
통화 순서를 제어하기가 어렵습니다 .
전역을 사용하는 것과 달리 단위 테스트 및 병렬화가 용이합니다.
또한 문제를 해결하기 위해 상태의 하위 속성을받는 도우미 함수를 작성해야합니다.
예를 들면 다음과 같습니다.
let updateSpaceShip ship =
{
ship with
Position = ship.Position + ship.Velocity
}
let update state =
{
state with
SpaceShips = state.SpaceShips |> map updateSpaceShip
}
여기서는 update
전체 상태에 영향을 미치지 updateSpaceShip
만 개인 SpaceShip
에 대해서는 단독으로 만 행동합니다 .
관련 정보 만 함수에 넣고 주어진 입력에 대해 취할 조치를 리턴 할 수 있습니다.
Input
키보드, 마우스, 게임 패드 등 상태를 유지 하는 유형 을 만드는 것이 좋습니다. 그런 다음받는 함수 쓸 수 State
와는 Input
다음을 반환를 State
:
let applyInput input state =
// Something
이것이 어떻게 맞는지에 대한 아이디어를 제공하기 위해 전체 게임은 다음과 같습니다.
let mutable state = initialState ()
// Game loop
while true do
// Apply user input to the world
let input = collectInput ()
state <- applyInput input state
// Game logic
let dt = computeDeltaTime ()
state <- update dt state
// Draw
render state
그래서 제 질문은 함수형 프로그래밍 언어, 특히 게임 개발에서 방대한 양의 상태를 어떻게 처리합니까?
간단한 게임의 경우 위의 접근 방식을 사용할 수 있습니다 (도움말 기능). 더 복잡한 것을 원한다면 " 렌즈 " 를 사용해 볼 수 있습니다 .
여기에 언급 된 의견 들과는 달리, (불완전한) 기능적 프로그래밍 언어로 게임을 작성하거나 적어도 시도해 보라고 강력히 제안합니다! 반복이 빨라지고 코드베이스가 작고 버그가 적다는 것을 알았습니다.
또한 (불완전한) FP 언어로 게임을 작성하기 위해 모나드를 배울 필요 가 없다고 생각합니다. 코드가 대부분 차단되고 단일 스레드이기 때문입니다.
멀티 플레이어 게임을 작성하는 경우 특히 그렇습니다. 그러면이 접근 방식을 사용하면 게임 상태를 간단하게 직렬화하고 네트워크를 통해 전송할 수 있기 때문에 훨씬 쉬워집니다.
더 많은 게임이 이런 식으로 쓰여지지 않은 이유는 말할 수 없습니다. 그러나 이것은 모든 프로그래밍 영역 (금융을 제외하고)에서 사실이므로, 기능 언어가 게임 프로그래밍에 적합하지 않다는 주장으로 이것을 사용하지 않을 것입니다.
또한 읽을만한 가치가있는 것은 순전히 기능적인 Retrogames 입니다.
move()
아마도 '현재'객체 (또는 식별자)와 이동하는 세계를 전달하고 현재 위치와 속도를 도출해야합니다 . 출력은 전체 물리 세계 또는 적어도 변경된 객체의리스트