根据下面的图片(我为圆形和平坦的表面使用了不同的颜色,因此可以看到它们,但最终颜色将是相同的),使用Swift和Spritekit,我试图创建一个圆形对象进入的效果浓稠的物质(不一定是粘稠的)并与浓稠的物质分离。基本上,当圆形物体分离时,当它形成一个圆形时,它将从平面上拉开。
我想使用图像动画帧,但是由于对象是带有物理主体的SKSpriteNodes,因此很难确定对象与动画的碰撞时间。另一种方法是使用CAAnimation,但我不知道如何将其与具有物理物体的SKSpriteNodes结合使用。如何使用上述任何一种方法或其他方法来产生这种分离效果?
更新
下图显示了圆形物体进入厚物质直至被淹没时,厚物质表面的变化。
最佳答案
您正在寻找流体模拟器
使用现代硬件确实可以做到这一点。
让我们看看我们将在这里构建什么。
组件
为了实现这一点,我们需要
分子
这是分子类(class)
import SpriteKit
class Molecule: SKSpriteNode {
init() {
let texture = SKTexture(imageNamed: "molecule")
super.init(texture: texture, color: .clear, size: texture.size())
let physicsBody = SKPhysicsBody(circleOfRadius: 8)
physicsBody.restitution = 0.2
physicsBody.affectedByGravity = true
physicsBody.friction = 0
physicsBody.linearDamping = 0.01
physicsBody.angularDamping = 0.01
physicsBody.density = 0.13
self.physicsBody = physicsBody
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
着色器
接下来,我们需要一个片段着色器,让我们创建一个名称为
Water.fsh
的文件void main() {
vec4 current_color = texture2D(u_texture, v_tex_coord);
if (current_color.a > 0) {
current_color.r = 0.0;
current_color.g = 0.57;
current_color.b = 0.95;
current_color.a = 1.0;
} else {
current_color.a = 0.0;
}
gl_FragColor = current_color;
}
现场
最后我们可以定义场景
import SpriteKit
class GameScene: SKScene {
lazy var label: SKLabelNode = {
return childNode(withName: "label") as! SKLabelNode
}()
let effectNode = SKEffectNode()
override func didMove(to view: SKView) {
physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
effectNode.shouldEnableEffects = true
effectNode.shader = SKShader(fileNamed: "Water")
addChild(effectNode)
}
var touchLocation: CGPoint?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let touchLocation = touch.location(in: self)
if label.contains(touchLocation) {
addRedCircle(location: touchLocation)
} else {
self.touchLocation = touchLocation
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
touchLocation = nil
}
override func update(_ currentTime: TimeInterval) {
if let touchLocation = touchLocation {
let randomizeX = CGFloat(arc4random_uniform(20)) - 10
let randomizedLocation = CGPoint(x: touchLocation.x + randomizeX, y: touchLocation.y)
addMolecule(location: randomizedLocation)
}
}
private func addMolecule(location: CGPoint) {
let molecule = Molecule()
molecule.position = location
effectNode.addChild(molecule)
}
private func addRedCircle(location: CGPoint) {
let texture = SKTexture(imageNamed: "circle")
let sprite = SKSpriteNode(texture: texture)
let physicsBody = SKPhysicsBody(circleOfRadius: texture.size().width / 2)
physicsBody.restitution = 0.2
physicsBody.affectedByGravity = true
physicsBody.friction = 0.1
physicsBody.linearDamping = 0.1
physicsBody.angularDamping = 0.1
physicsBody.density = 1
sprite.physicsBody = physicsBody
sprite.position = location
addChild(sprite)
}
}
关于swift - 如何产生圆形物体进入浓稠物质并与之分离的效果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35405372/