Smalltalk에서 Scratch를 만지기 (4) 스프라이트를 드래그시켰을 때의 궤도를 기록/재생
(Smalltalk를 사용할 수 있도록 하는 방법 등은 여기를 참조)
※이번은 Scratch의 코드를 괴롭히지 않습니다만, 반드시 백업은 해 둡시다. (백업 절차는 여기)
하고 싶은 일
다음 스크립트가 있다고 가정합니다. ( 여기 에서 다운로드할 수 있습니다.)
paths-x 와 paths-y 라는 리스트의 값을 순서대로 꺼내, X 좌표, Y 좌표로서 이동합니다. (이 스크립트는 목록의 마지막 요소를보기 전에 index가 1로 돌아가지만 미세한 것은 걱정하지 않습니다)
리스트의 값을 하나하나 입력하면 힘듭니다. 이번에는 스프라이트를 드래그했을 때의 궤도를 스프라이트의 변수에 저장하는 Smalltalk의 코드를 설명합니다.
절차
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
해설
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로 대응시키면 이런 느낌입니다.
목록의 요소 추가.st100 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의 어떤 코드가 호출되는지 확인하는 방법을 소개합니다.
Reference
이 문제에 관하여(Smalltalk에서 Scratch를 만지기 (4) 스프라이트를 드래그시켰을 때의 궤도를 기록/재생), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/maeda_/items/2d68d440ead4c9134fcb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[(self lineCountOfList: 'paths-x') = 0] whileFalse:[
self deleteLine: 1 ofList: 'paths-x'
]
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
]
Reference
이 문제에 관하여(Smalltalk에서 Scratch를 만지기 (4) 스프라이트를 드래그시켰을 때의 궤도를 기록/재생), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/maeda_/items/2d68d440ead4c9134fcb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)