如何从单击返回 SKSpriteNode 子类对象
How to get SKSpriteNode subclassed object back from click
我有以下对象我从 SKSpriteNode
子class编辑
class PlayingCard : SKSpriteNode
{
var suit:Int = 0
var rank:Int = 0
var visible:Bool = false
init()
{
super.init(
texture: SKTexture(imageNamed: "card.png"),
color: NSColor.blackColor(),
size: SKTexture(imageNamed: "card.png").size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func updateSprite()
{
if (suit == 1 && rank ==1)
{ self.texture = SKTexture(imageNames: "ace_of_clubs.png") }
.
.
.
.
// A bunch of switches and if's to assign the right image
}
}
现在我初始化这个 class 并将它添加到我的场景中。一切正常,卡片出现了。除了当我点击后寻找 self.nodeAtPoint(location)
时,我得到了 SKNode
!!我的价值观都丢了吗?这是怎么回事?
override func mouseDown(theEvent: NSEvent)
{
// Called when a mouse click starts
let location = theEvent.locationInNode(self)
let t = self.nodeAtPoint(location)
NSLog("%s",String(t.suit)) //<-------- Won't Compile
}
知道怎么做吗?尝试使用以下方式进行类型转换:t as! PlayingCard
构建项目,但我在日志中打印出乱码。
这是枚举和 PlayingCards class:
enum Suits:Int
{
case Diamond, Heart, Club, Spade
}
enum Ranks:Int
{
case ace, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king
}
class PlayingCards : SKSpriteNode
{
var CardRank:Ranks = Ranks.ace
var CardSuit:Suits = Suits.Club
var Visible:Bool = false
//var Sprite:SKSpriteNode
init()
{
super.init(texture: SKTexture(imageNamed: "b1fv.png"), color: NSColor.blackColor(), size: SKTexture(imageNamed: "b1fv.png").size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func updateSprite()
{
self.name = Description(Set: 2)
if self.Visible
{
self.texture = SKTexture(imageNamed: generateSpriteFilename())
} else {
self.texture = SKTexture(imageNamed: "b1fv.png")
}
}
func generateSpriteFilename() -> String
{
return self.Description(Set: 2) + ".png"
}
func Description(Set s:Int) -> String
{
var cr = ""
var cs = ""
switch self.CardRank
{
case .ace:
cr = (s == 1) ? "ace" : "1"
break
case .jack:
cr = (s == 1) ? "jack" : "j"
break
case .king:
cr = (s == 1) ? "king" : "k"
break
case .queen:
cr = (s == 1) ? "queen" : "q"
break
default:
cr = String(self.CardRank.rawValue + 1)
}
switch self.CardSuit
{
case .Club:
cs = (s == 1) ? "clubs" : "c"
break
case .Diamond:
cs = (s == 1) ? "diamonds" : "d"
break
case .Heart:
cs = (s == 1) ? "hearts" : "h"
break
case .Spade:
cs = (s == 1) ? "spades" : "s"
break
}
return (s == 1) ? cr + "_of_" + cs : cs + cr
}
}
这是我填充数组的方式:
func prepareDeck() -> [PlayingCards]
{
var deck = [PlayingCards]()
for i in 0...3
{
let s:Suits = Suits(rawValue: i)!
for j in 0...12
{
let r:Ranks = Ranks(rawValue: j)!
let c:PlayingCards = PlayingCards()
c.CardRank = r
c.CardSuit = s
deck.append(c)
}
}
return deck
}
方法 nodeAtPoint
return 你 SKNode
。
当然我们知道 node 可以更具体,但在编译时我们只能说它将是 SKNode
.
现在,如果您认为该对象比简单的 SKNode(如 PlayingCard
)更具体,您可以尝试将该节点转换为您的类型。
override func mouseDown(theEvent: NSEvent) {
let location = theEvent.locationInNode(self)
let node = self.nodeAtPoint(location)
if let playingCard = node as? PlayingCard {
// here you have your PayingCard object!
print(playingCard.suit)
}
}
在上面的代码中,仅当检索到的节点是 PlayingCard
时才输入 IF
的正文。在这种情况下,将创建一个类型为 PlayingCard
的新常量 playingCard
。
因此,在 IF
的正文中,您可以使用在 PlayingCard
class.
中定义的所有方法和属性
我有以下对象我从 SKSpriteNode
子class编辑class PlayingCard : SKSpriteNode
{
var suit:Int = 0
var rank:Int = 0
var visible:Bool = false
init()
{
super.init(
texture: SKTexture(imageNamed: "card.png"),
color: NSColor.blackColor(),
size: SKTexture(imageNamed: "card.png").size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func updateSprite()
{
if (suit == 1 && rank ==1)
{ self.texture = SKTexture(imageNames: "ace_of_clubs.png") }
.
.
.
.
// A bunch of switches and if's to assign the right image
}
}
现在我初始化这个 class 并将它添加到我的场景中。一切正常,卡片出现了。除了当我点击后寻找 self.nodeAtPoint(location)
时,我得到了 SKNode
!!我的价值观都丢了吗?这是怎么回事?
override func mouseDown(theEvent: NSEvent)
{
// Called when a mouse click starts
let location = theEvent.locationInNode(self)
let t = self.nodeAtPoint(location)
NSLog("%s",String(t.suit)) //<-------- Won't Compile
}
知道怎么做吗?尝试使用以下方式进行类型转换:t as! PlayingCard
构建项目,但我在日志中打印出乱码。
这是枚举和 PlayingCards class:
enum Suits:Int
{
case Diamond, Heart, Club, Spade
}
enum Ranks:Int
{
case ace, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king
}
class PlayingCards : SKSpriteNode
{
var CardRank:Ranks = Ranks.ace
var CardSuit:Suits = Suits.Club
var Visible:Bool = false
//var Sprite:SKSpriteNode
init()
{
super.init(texture: SKTexture(imageNamed: "b1fv.png"), color: NSColor.blackColor(), size: SKTexture(imageNamed: "b1fv.png").size())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func updateSprite()
{
self.name = Description(Set: 2)
if self.Visible
{
self.texture = SKTexture(imageNamed: generateSpriteFilename())
} else {
self.texture = SKTexture(imageNamed: "b1fv.png")
}
}
func generateSpriteFilename() -> String
{
return self.Description(Set: 2) + ".png"
}
func Description(Set s:Int) -> String
{
var cr = ""
var cs = ""
switch self.CardRank
{
case .ace:
cr = (s == 1) ? "ace" : "1"
break
case .jack:
cr = (s == 1) ? "jack" : "j"
break
case .king:
cr = (s == 1) ? "king" : "k"
break
case .queen:
cr = (s == 1) ? "queen" : "q"
break
default:
cr = String(self.CardRank.rawValue + 1)
}
switch self.CardSuit
{
case .Club:
cs = (s == 1) ? "clubs" : "c"
break
case .Diamond:
cs = (s == 1) ? "diamonds" : "d"
break
case .Heart:
cs = (s == 1) ? "hearts" : "h"
break
case .Spade:
cs = (s == 1) ? "spades" : "s"
break
}
return (s == 1) ? cr + "_of_" + cs : cs + cr
}
}
这是我填充数组的方式:
func prepareDeck() -> [PlayingCards]
{
var deck = [PlayingCards]()
for i in 0...3
{
let s:Suits = Suits(rawValue: i)!
for j in 0...12
{
let r:Ranks = Ranks(rawValue: j)!
let c:PlayingCards = PlayingCards()
c.CardRank = r
c.CardSuit = s
deck.append(c)
}
}
return deck
}
方法 nodeAtPoint
return 你 SKNode
。
当然我们知道 node 可以更具体,但在编译时我们只能说它将是 SKNode
.
现在,如果您认为该对象比简单的 SKNode(如 PlayingCard
)更具体,您可以尝试将该节点转换为您的类型。
override func mouseDown(theEvent: NSEvent) {
let location = theEvent.locationInNode(self)
let node = self.nodeAtPoint(location)
if let playingCard = node as? PlayingCard {
// here you have your PayingCard object!
print(playingCard.suit)
}
}
在上面的代码中,仅当检索到的节点是 PlayingCard
时才输入 IF
的正文。在这种情况下,将创建一个类型为 PlayingCard
的新常量 playingCard
。
因此,在 IF
的正文中,您可以使用在 PlayingCard
class.