我需要将纹理放入 PolygonMorph,但这些似乎需要 InfiniteForm 作为颜色/填充。
InfiniteForm 不是解决方案,因为我需要稍后旋转 PolygonMorph 并且移动 PolygonMorph 也会对显示的纹理产生副作用。
如果也可以缩放插入的纹理,那将非常有用。
如果不替换现有的 PolygonMorph(或至少保持 PolygonMorph 的形状),您将如何做到这一点?
这是您的问题的另一个想法。该解决方案包括 2 个阶段。
第 1 阶段:(drawTextures)我们使用 BitBlt 用我们的纹理图块填充表单。表单存储在一个称为纹理的实例变量中。此表格在第 2 阶段剪辑
第 2 阶段:(clipTextures)现在我们生成一个形状像我们的多边形填充的多边形的表格。然后我们从一个完整的黑色形式中减去它。现在我们有一个负形状的多边形。有了这个,我们剪辑纹理。现在我们可以创建一个 Image Morph 并将其添加到多边形或我们想要对其进行的任何操作。
不幸的是,filledForm 实现不能处理凹凸形状。所以要小心你的多边形是什么样子的。
这个解决方案非常快,也可以在运行时应用。我们每 10 毫秒更改一次多边形的形状,并且渲染效果很好。
!PgiTexturedMorph methodsFor: 'graphics' stamp: 'pre 2/12/2011 13:30:15.156'!
drawTexture
| textureForm aTexture aBitBlt |
textureForm := Form extent: (self shape extent) depth: 32.
aTexture := self baseImage deepCopy .
textureForm := Form extent: (self shape extent) depth: 32.
(0 to: ((textureForm extent x) / (aTexture extent x))) do: [ :eachX |
(0 to: ((textureForm extent y) / (aTexture extent y))) do: [ :eachY |
aBitBlt := BitBlt destForm: textureForm
sourceForm: aTexture
fillColor: nil
combinationRule: 7
destOrigin: (eachX * (aTexture extent x))@(eachY *(aTexture extent y))
sourceOrigin: 0@0
extent: (aTexture extent)
clipRect: (textureForm computeBoundingBox).
aBitBlt copyBits.
]].
self texturing: textureForm.! !
!PgiTexturedMorph methodsFor: 'graphics' stamp: 'pre!
clipTextures
| clippingForm aBitBlt |
clippingForm := (Form extent: (self shape extent + (1@0))) fillBlack.
aBitBlt := BitBlt destForm: clippingForm
sourceForm: (self shape filledForm)
fillColor: nil
combinationRule: 6
destOrigin: 0@0
sourceOrigin: 0@0
extent: (self shape extent)
clipRect: (clippingForm computeBoundingBox).
aBitBlt copyBits.
aBitBlt := BitBlt destForm: (self texturing)
sourceForm: (clippingForm )
fillColor: nil
combinationRule: 17
destOrigin: 0@0
sourceOrigin: 0@0
extent: (clippingForm extent)
clipRect: (self texturing computeBoundingBox).
aBitBlt copyBits.
self texturePart image: (self texturing).
self texturePart changed.! !