2013-08-22 2 views
3

사용 netwire-4.0.7Netwire - 위치를 생성하고 벽을 수신 거부하는 와이어를 만드는 방법은 무엇입니까?

질문 제목에서 말하자면, 다른 대상에서 "수신 거부"되는 위치를 생성하는 선을 만들려고합니다. 각 단계마다 특정 속도로 위치를 이동합니다. 내가 생각할 수있는 가장 간단한 예는 일부 화면 보호기와 같이 상자 안에서 움직이는 것입니다.

난 그냥 할 수있는 시도로이 기능을 썼다 (한 축 전용) :

import Control.Wire 
bouncyWire :: Double -> Double -> Double -> Double -> Wire() IO a Double 
bouncyWire startPosition startVelocity lowerBound upperBound = proc _ -> do 
    rec 
    v <- delay startVelocity -< if p < lowerBound || p > upperBound 
            then -v else v 
    p <- integral_ startPosition -< v 
    returnA -< p 

(I 실제로 다른 모나드와 함께 사용하지만,이 코드는 실제로 그것을 사용하지 않습니다 여기서 문제를 복잡하게 만든다).

counterSession $ 1/60으로 스테핑하지만 문제가 생깁니다. 벽에서 "튀어 오르는"대신에 문제가 발생합니다. 나는 그것이 일어날 것이라고 생각한다. 속도가 계속 흐트러져 계속 v인데, 왜 그런지 모르겠다. 지연이나 잘못된 것을 사용하고있을 수도 있습니다.

답변

5

리처드 헉스 톤 (Richard Huxton)이 설명했듯이, 철사가 국경 뒤에 붙어 있습니다. 한 가지 해결책은 속도를 역전시킬뿐만 아니라 항상 올바른 방향으로 향하게하는지 확인하는 것입니다. 이렇게하면 철사가 항상 국경 뒤에서옵니다. 또 다른 해결책은 그것이 나오면 테두리 안쪽으로 다시 위치를 변경하는 것입니다. 이 방법은 철사가 결코 뒤에서 지각되는 것을 결코 감지하지 못합니다 (게임에서 보통하고 싶은 것입니다). 함께 결합 그것은 내가 CategoryApplicative 표기법을 사용하여 화살표가 표기 (.를 사용하여 전선의 구성)에 익숙하지 않다

import Prelude hiding ((.), id) 
import Control.Category 
import Control.Wire 
import Control.Wire.Wire 
import Control.Wire.Prefab.Move 

bouncyWire :: (Monad m) 
      => Double -> Double -> Double -> Double -> Wire() m a Double 
bouncyWire startPosition startVelocity lowerBound upperBound = 
    objPosition <$> object_ update (ObjectState startPosition startVelocity) 
     . constant (Accelerate 0,()) 
    where 
    update _ [email protected](ObjectState pos vel) 
     | (pos > upperBound) = ObjectState (2*upperBound - pos) (- abs vel) 
     | (pos < lowerBound) = ObjectState (2*lowerBound - pos) (abs vel) 
     | otherwise    = s 

처럼 보일 수 있습니다. 이 작업에서는 object_이 특히 편리합니다. 속도와 루프를 내부적으로 통합하므로 우리는 수정 함수를 제공하고 출력에서 ​​위치를 추출해야합니다.

2

아, 내 일간의 지식을 다시 말하면서 BASIC과 어셈블러를 혼합하여 8 비트 게임을 작성하는 기회!

아마도 '볼'이 반올림 오류로 인해 벽의 잘못된면에만 붙어있는 것입니다. 따라서 벽이 10.0 인 경우 v = -1.0, + 1.0, -1.0 등으로 볼이 11.0001에서 10.0001 사이에서 진동합니다. 와이어를 사용하여 위치를 확인하는 방법을 잘 모르겠습니다.

(고대) 메모리에서 이전 단계의 "남은"벡터를 포함하여 바운스를 계산하거나 바운스하기 전에 정확하게 벽에 공을 배치하려고합니다.

관련 문제