Smalltalk에서 Scratch를 만지기 (4) 스프라이트를 드래그시켰을 때의 궤도를 기록/재생

4342 단어 SmalltalkScratch
지난번은 스프라이트의 위치를 ​​트랜스 스크립트에 출력했지만 이번에는 스프라이트의 위치를 ​​Scratch 목록에 추가합니다.
(Smalltalk를 사용할 수 있도록 하는 방법 등은 여기를 참조)

※이번은 Scratch의 코드를 괴롭히지 않습니다만, 반드시 백업은 해 둡시다. (백업 절차는 여기)

하고 싶은 일



다음 스크립트가 있다고 가정합니다. ( 여기 에서 다운로드할 수 있습니다.)


paths-x 와 paths-y 라는 리스트의 값을 순서대로 꺼내, X 좌표, Y 좌표로서 이동합니다. (이 스크립트는 목록의 마지막 요소를보기 전에 index가 1로 돌아가지만 미세한 것은 걱정하지 않습니다)

리스트의 값을 하나하나 입력하면 힘듭니다. 이번에는 스프라이트를 드래그했을 때의 궤도를 스프라이트의 변수에 저장하는 Smalltalk의 코드를 설명합니다.

절차


  • 배경을 클릭하고 open → transcript에서 트랜 스크립트를 표시합니다.
  • 스프라이트의 할로를 열고 렌치 아이콘에서 Inspector를 엽니다.

  • Inspector에서 다음 코드를 입력하여 실행합니다. (Alt/Command + d)

    Inspector에서 실행.st
    [
      #('paths-x'  'paths-y') do:[:variableName|
        [(self lineCountOfList: variableName) = 0] whileFalse:[
          self deleteLine: 1 ofList: variableName
        ]
      ].
    
      Transcript show: 'recording.'.
      100 timesRepeat:[
        (self owner isKindOf: HandMorph) ifTrue:[
          self append: self xpos toList: 'paths-x'.
          self append: self ypos toList: 'paths-y'.
          Transcript show: '.'
        ].
        (Delay forMilliseconds: 100) wait
      ].
      Transcript show: 'done!';cr
    ] fork
    

  • 실행 후 10 초 동안 스프라이트를 드래그하면 수시로 스프라이트의 위치가 목록에 추가됩니다. 트랜스크립트에 기록 시작시에는 'recording.'이 표시되고 위치가 기록될 때마다 '.'를 추가, 10초 후에 'done!'로 표시되어 기록이 종료됩니다.
  • 깃발을 클릭하면 기록된 궤도에 따라 스프라이트가 이동합니다.

  • 해설



    doit 등으로 실행하면 실행한 코드가 완료될 때까지 기다립니다. [ ... ] fork 로 둘러싸면 그 안의 처리의 완료를 기다리지 않고, 뒤에서 실행됩니다. [ ... ] fork 없이 실행해 보면 처리가 끝날 때까지의 10초간 움직이지 않게 되는 것을 확인할 수 있습니다.

    포크의 내용은 목록의 내용을 삭제하는 부분과 목록에 현재 위치를 넣는 부분으로 나뉩니다.
    리스트의 요소 삭제의 Smalltalk의 코드를 Scratch의 블록과 대응시키면 이런 느낌입니다.


    목록의 모든 요소 삭제.st
    [(self lineCountOfList: 'paths-x') = 0] whileFalse:[
      self deleteLine: 1 ofList: 'paths-x'
    ]
    

    3단계에서 실행한 코드는 'paths-x'와 'paths-y'라는 “변수 이름”을 variableName이라는 변수에 넣어 요소를 삭제합니다.

    한편, 리스트에 값을 격납하는 부분을 Smalltalk와 Scratch로 대응시키면 이런 느낌입니다.


    목록의 요소 추가.st
    100 timesRepeat:[
      (self owner isKindOf: HandMorph) ifTrue:[
        self append: self xpos toList: 'paths-x'.
        self append: self ypos toList: 'paths-y'
      ].
      (Delay forMilliseconds: 100) wait
    ]
    
    (self owner isKindOf: HandMorph) 의 부분이 드래그중인가 어떤가의 판단이 됩니다. 드래그 중의 판단은 부모모프의 클래스로 판단하고 있습니다. 스테이지에 스프라이트가 놓여 있는 상태에서는 부모 모프가 스테이지가 되지만, 드래그를 개시하면 HandMorph라는 커서를 나타내는 모프가 부모 모프가 됩니다. (인스펙터에서 owner의 값을 보면 확인할 수 있습니다.)
    isKindOf : 메서드에서 부모 모프가 HandMorph인지 확인합니다.

    목록에 값을 추가하거나 값을 삭제하는 Smalltalk 코드는 실제 Scratch 블록의 내용을 살펴 보았습니다. 다음 번에는 블록 내용에서 Smalltalk의 어떤 코드가 호출되는지 확인하는 방법을 소개합니다.

    좋은 웹페이지 즐겨찾기