当前位置: 首页 > 面试题库 >

SpriteKit中的“攻击”按钮

包子航
2023-03-14
问题内容

我是Xcode的新手,并且正在为我的课程制作2D游戏。我已经有一段时间的按钮问题了。我刚刚有一个解决方案,说明为什么我的跳转按钮不起作用,但是我也有一个攻击按钮。

我已经为按钮设置了代码,使其可以在屏幕上显示,并在按下按钮时进行图像更改。但是,我不知道要插入什么html" target="_blank">代码才能将播放器图像更改为跳转动画。我也不知道如何为它和敌人设置碰撞,以使攻击动画能够命中。

所以我的问题是,如何让按钮启动跳跃动画,以及如何设置碰撞以击中敌人?

到目前为止,这是我的代码:

override func sceneDidLoad() {
    //Setup start button
    jumpButton = SKSpriteNode(texture: jumpButtonTexture)
    jumpButton.position = CGPoint(x: 1850, y: 130)
    jumpButton.size = CGSize(width: 200, height: 200)
    jumpButton.zPosition = 20

    addChild(jumpButton)

    //Setup start button
    attackButton = SKSpriteNode(texture: attackButtonTexture)
    attackButton.position = CGPoint(x: 1550, y: 130)
    attackButton.size = CGSize(width: 200, height: 200)
    attackButton.zPosition = 20

    addChild(attackButton)
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        if selectedButton != nil {
            handleJumpButtonHover(isHovering: false)
            handleAttackButtonHover(isHovering: false)
        }

        if jumpButton.contains(touch.location(in: self)) {
            selectedButton = jumpButton
            handleJumpButtonHover(isHovering: true)
        } else if attackButton.contains(touch.location(in: self)) {
            selectedButton = attackButton
            handleAttackButtonHover(isHovering: true)
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        if selectedButton == jumpButton {
            handleJumpButtonHover(isHovering: false)

            if (jumpButton.contains(touch.location(in: self))) {
                handleJumpButtonClick()
            }
        } else if selectedButton == attackButton {
            handleAttackButtonHover(isHovering: false)

            if (attackButton.contains(touch.location(in: self))) {
                handleAttackButtonClick()
            }
        }
    }
    selectedButton = nil
    }

    func handleJumpButtonHover(isHovering : Bool) {
    if isHovering {
        jumpButton.texture = jumpButtonPressedTexture
    } else {
        jumpButton.texture = jumpButtonTexture
    }
}

func handleAttackButtonHover(isHovering : Bool) {
    if isHovering {
        attackButton.texture = attackButtonPressedTexture
    } else {
        attackButton.texture = attackButtonTexture
    }
}

func handleJumpButtonClick() {
    self.playerNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
    self.playerNode.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 20))
}

func handleAttackButtonClick() {
}

问题答案:

您的问题的前半部分非常简单。您只需要在该功能中设置播放器的新纹理,然后在完成动画后将其还原为原始播放器动画。因此,我建议在类级别上创建这两个动画,并将键分配给默认动画,并使用攻击动作的完成处理程序将其设置回去。

class GameScene: SKScene {
    let frame2 = SKTexture(imageNamed: "Ttam2")
    let frame3 = SKTexture(imageNamed: "Ttam3")
    let frame4 = SKTexture(imageNamed: "Ttam4")

    let attackFrame1 = SKTexture(imageNamed: "Ttam1_ATTACK")
    let attackFrame2 = SKTexture(imageNamed: "Ttam2_ATTACK")

    var animation: SKAction!
    var attackAnination: SKAction!

    override func sceneDidLoad(){
       animation = SKAction.repeatForever(SKAction.animate(with: [playerTexture, frame2, frame3, frame4], timePerFrame: 0.2))

       attackAnimation = SKAction.animate(with: [attackFrame1,attackFrame2],timePerFrame: 0.2)

       playerNode.run(animation,withKey:"animate")
    }

    func handleAttackButtonClick(){
        playerNode.removeAction(forKey:"animate")
        playerNode.run(attackAnimation,completion:{
             self.playerNode.run(animation,withKey: "animate")
        })
    }
}

至于关于碰撞的后半部分,您想要使用contactTestBitmask。您可以将SKPhysicsContactDelegate添加到场景类,并设置要在其上注册联系人的节点的位掩码。整个SO中都有许多关于此方面的问题和答案。我认为无需再次回答。如果您挂了一个新问题,请随时回来。



 类似资料:
  • 在本节中,我们将讨论中间人(MITM)攻击。这是在网络中执行的最危险的攻击之一。我们在连接到网络后执行此攻击。此攻击会将数据包流从任何客户端重定向到我们的设备。这意味着发送到客户端或从客户端发送的任何数据包都必须通过我们的设备。现在,我们知道网络的密码和密钥,因此将能够读取只读取这些数据包,修改它们,丢弃它们。这种攻击是如此有效和强大,因为它很难防范。这是由于ARP协议的工作方式。 ARP有两个主

  • 本文向大家介绍csrf 攻击是怎样攻击的? 如何防御相关面试题,主要包含被问及csrf 攻击是怎样攻击的? 如何防御时的应答技巧和注意事项,需要的朋友参考一下 get, post, delete, 分开, 避免使用get修改数据 避免让第三方站点访问cookie 对referrer进行验证 token 阻止第三方请求 .

  • 在GFW里屡见不鲜的,呵呵. 中间人攻击(Man-in-the-middle attack,通常缩写为MITM)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。

  • 问题内容: 嘿,我的应用程序几乎可以发布了,但是我想添加一个Facebook分享按钮。事情是我不知道场景和ViewController之间的通信是如何工作的。我做了我的研究,但只在obj- c中找到了像这样的代码 我的经验和知识不足,无法迅速移植,因此我需要与此D相关的帮助: 谢谢 问题答案: 这是我不久前为twitter做的一些代码,现在仍然可以迅速使用。我在下面向您展示如何将其转换为Faceb

  • “点击劫持”攻击允许恶意页面 以用户的名义 点击“受害网站”。 许多网站都被黑客以这种方式攻击过,包括 Twitter、Facebook 和 Paypal 等许多网站。当然,它们都已经被修复了。 原理 原理十分简单。 我们以 Facebook 为例,解释点击劫持是如何完成的: 访问者被恶意页面吸引。怎样吸引的不重要。 页面上有一个看起来无害的链接(例如:“变得富有”或者“点我,超好玩!”)。 恶意

  • 在本节中,我们将讨论如何攻击网站。对于攻击网站,我们有两种方法: 我们可以使用攻击迄今为止学到的网站方法的方法。因为我们知道网站安装在计算机上,所以可以像其他任何计算机一样尝试攻击和破解它。但是,我们知道网站安装在计算机上,可以像其他计算机一样尝试攻击和破解它。还可以使用服务器端攻击来查看安装了哪个操作系统,Web服务器或其他应用程序。如果发现了漏洞,我们可以使用它们中的任何一个来访问计算机。 另