2015-06-22 6 views
1

Я пытаюсь имитировать линейку следующего робота в 2-й быстрой игре.Как получить данные о цветах из 3 очков в моей игре с комплектом спрайтов?

Теперь вот скриншот того, что он выглядит так далеко: screenshot

Желтый штуковина является роботом и 3 прозрачных круги должны быть его датчиками.

Теперь я хочу получить данные о цвете центральных пикселей этих трех прозрачных кругов. Потому что я хочу знать, являются ли эти три «сенсора» «воспринимающими» либо красную линию, либо белый фон. Но для жизни я не могу понять, как это сделать.

Я нашел этот код здесь, на StackOverflow (модифицировал его немного, чтобы соответствовать моему проекту):

extension SKTexture { 
    func getPixelColor(pos: CGPoint) -> SKColor { 

     let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) 
     var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

     let pixelInfo: Int = ((Int(self.size().width) * Int(pos.y)) + Int(pos.x)) * 4 

     let r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
     let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
     let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
     let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

     return SKColor(red: r, green: g, blue: b, alpha: a) 
    } 
} 

Но когда я называю эту функцию я получаю:

2015-06-22 02:47:04.012 SKTryout[16325:1119579] -[SKTexture CGImage]: unrecognized selector sent to instance 0x6080001c0690 
2015-06-22 02:47:04.016 SKTryout[16325:1119579] -[SKTexture CGImage]: unrecognized selector sent to instance 0x6080001c0690 
2015-06-22 02:47:04.054 SKTryout[16325:1119579] (
    0 CoreFoundation      0x00007fff88cec03c __exceptionPreprocess + 172 
    1 libobjc.A.dylib      0x00007fff81f0e76e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff88cef0ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x00007fff88c34e24 ___forwarding___ + 1028 
    4 CoreFoundation      0x00007fff88c34998 _CF_forwarding_prep_0 + 120 
    5 SKTryout       0x0000000100003669 _TFE8SKTryoutCSo9SKTexture13getPixelColorfS0_FVSC7CGPointCSo7NSColor + 57 
    6 SKTryout       0x0000000100003a86 _TToFE8SKTryoutCSo9SKTexture13getPixelColorfS0_FVSC7CGPointCSo7NSColor + 54 
    7 SKTryout       0x000000010000139c _TFC8SKTryout9GameScene7keyDownfS0_FCSo7NSEventT_ + 444 
    8 SKTryout       0x00000001000013fa _TToFC8SKTryout9GameScene7keyDownfS0_FCSo7NSEventT_ + 58 
    9 SpriteKit       0x0000000100041fc4 -[SKView keyDown:] + 67 
    10 AppKit        0x00007fff8ea0e11b -[NSWindow _reallySendEvent:isDelayedEvent:] + 5452 
    11 AppKit        0x00007fff8e39fd76 -[NSWindow sendEvent:] + 470 
    12 AppKit        0x00007fff8e39c9b1 -[NSApplication sendEvent:] + 4199 
    13 AppKit        0x00007fff8e2c5c68 -[NSApplication run] + 711 
    14 AppKit        0x00007fff8e242354 NSApplicationMain + 1832 
    15 SKTryout       0x0000000100002ef7 main + 87 
    16 libdyld.dylib      0x00007fff84bf35c9 start + 1 

Может кто-нибудь сказать мне, что Я должен делать вместо этого?

Btw, в случае, если это имеет значение, я делаю это в XCode 7 (бета-версия) и Swift 2.

ответ

3

Метод CGImage был введен только в SKTexture прошивкой 9/OS X 10.11. Вы не используете OS X 10.11 - вы все еще вернулись в OS X 10.10 - поэтому этот метод не существует на вашем компьютере.

+0

Лучшее решение, однако, на мой взгляд, было бы: не пытаться «смысле» что-нибудь. Вы знаете, где находится красная линия, и вы знаете, где находятся «датчики». Поэтому просто используйте эти знания, чтобы определить, перекрываются ли они. Например, если красная линия построена путем заполнения CGPath, вы можете спросить, содержится ли определенная точка - центр «датчика» - по этому пути. – matt

+0

Спасибо за ваше объяснение, что очень помогает. Я бы предпочел «почувствовать» это, потому что хотел бы (позже) заменить фон случайным png строки всякий раз, когда захочу. Этот текущий фон также представляет собой png-изображение. – Evert

+0

Это означает, что свойство 'texture' неправильно помечено в заголовках как« доступно с 10.11 », иначе компилятор Xcode 7 должен предупреждать (или даже ошибочно) при использовании его с целью развертывания 10.10. –

0

Fixed его с этим:

func getPixelColor(name: String, pos: CGPoint) -> SKColor? { 
    guard let img = NSImage(named: name) else {return nil} 

    var pointer = CGRect(origin: CGPoint(x: 0, y: 0), size: img.size) 

    guard let pixel = img.CGImageForProposedRect(&pointer, context: nil, hints: nil) else {return nil} 

    let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(pixel.takeRetainedValue())) 
    let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

    let pixelInfo: Int = ((Int(img.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

    let r = CGFloat(data[pixelInfo+0])/CGFloat(255.0) 
    let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
    let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
    let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

    return SKColor(red: r, green: g, blue: b, alpha: a) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^