2016-07-26 2 views
1

私はゲームをコーディングしています。ユーザーが紛失したときに、画面の中央にリセットボタンが残り、残りの部分が暗くなってしまいます。何らかの理由で私は透明性を得ることができません。私は解決策を見てきたが、それは私のもので動作するように得ることができませんでした(定義されていない、あまりにも多くの変数があります)、私は十分に担当者を持っていないので、私はコメントすることはできません。SKScene/SKViewまたはUIViewを追加してぼかしを施すことでぼかしをかける

Making a SKScene's background transparent not working... is this a bug?

私は、SKSceneを拡張して、すべてのSKNodesをmainViewノードに追加する、gamesceneを持っています。私はYESに透明度を設定し、その上にclearColorで新しいsksceneを追加しようとしましたが、それはただの黒い画面を示しています。

SKView *dimView = [[SKView alloc] initWithFrame:self.frame]; 
[self.view addSubview:dimView]; 
[dimView setBackgroundColor:[UIColor clearColor]]; 
[dimView setAllowsTransparency:YES]; 

私は私がちょうど何を知っていない何か間違ったことをやっている知っているがそうです。誰も私のミスを突き止めることができますか?

更新:

黒い画面も、私もこれを試してみたし、それはどちらか動作しません。

CGRect screenRect = [[UIScreen mainScreen] bounds]; 
//create a new view with the same size 
UIView* coverView = [[UIView alloc] initWithFrame:screenRect]; 
// change the background color to black and the opacity to 0.6 
coverView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6]; 
// add this new view to your main view 
[self.view addSubview:coverView]; 

はアップデート2:

私は最初のコードセットを編集しました透明度がtrueに設定され、色が透明に設定されている別のSkviewでSkviewをオーバーレイしようとします。これで灰色の画面が表示されます。私はしばらくこの状態にいましたが、なぜこれが動作していないのかわからないようです。どんな助けもありがとう。

アップデート3:

CGRect screenFrame = [UIScreen mainScreen].bounds; 
    SKView *dimView = [[SKView alloc] initWithFrame:screenFrame]; 
    SKScene *currentScene = [[SKScene alloc]initWithSize:dimView.bounds.size]; 
    [self.view addSubview:dimView]; 
    [currentScene setBackgroundColor:[[UIColor clearColor] colorWithAlphaComponent:0.5f]]; 
    [dimView setAllowsTransparency:YES]; 
    [dimView presentScene:currentScene]; 

答えて

0

私はFINIALLYそれを考え出しました!私の問題は、更新メソッドに自分のコードがあり、既に追加されているかどうかをチェックしていないことでした。私は更新ループの反復ごとに複数のビューを追加していましたが、不透明度は.5で黒く見えました。

+0

それはすべてに起こる可能性があります。だから、良いニュースです。 –

0

の概要セクションによると:

だから私は別でビューを重ねるの正しい実装はとても似ていますが、でもこれでそれはまだ完全に黒い画面が表示さだと思いますSKScene Class Reference

SKSceneオブジェクトは、Sprite Kitのコンテンツのシーンを表します。シーン は、Sprite Kitノード(SKNode)のツリー内のルートノードです。これらのノード は、シーンがアニメーション化され、表示用にレンダリングされるコンテンツを提供します。 シーンを表示するには、SKViewオブジェクトから表示します。

SKSceneさんのネストはありません。同時に2つのシーンを実行することはできません(それらの間での切り替えのみ)。

2つのシーンを「オーバーレイ」する場合は、常にトランジションの使用を切り替える必要があります。

代替は、シェーダと遷移シーンをカスタマイズするためのGitHubプロジェクトは、以下の情報源からもわかるように、シェーダを統合するSKSceneを拡張していますSpriteKitShaderTransitionExample

を呼び出すことができます。

出典

//private let totalAnimationDuration = 1.0 
private let kNodeNameTransitionShaderNode = "kNodeNameTransitionShaderNode" 
private let kNodeNameFadeColourOverlay = "kNodeNameFadeColourOverlay" 
private var presentationStartTime: CFTimeInterval = -1 
private var shaderChoice = -1 

extension SKScene { 
    private var transitionShader: SKShader? { 
     get { 
      if let shaderContainerNode = self.childNodeWithName(kNodeNameTransitionShaderNode) as? SKSpriteNode { 
       return shaderContainerNode.shader 
      } 
      return nil 
     } 
    } 
    private func createShader(shaderName: String, transitionDuration: NSTimeInterval) -> SKShader { 
     var shader = SKShader(fileNamed:shaderName) 
     var u_size = SKUniform(name: "u_size", floatVector3: GLKVector3Make(Float(UIScreen.mainScreen().scale * size.width), Float(UIScreen.mainScreen().scale * size.height), Float(0))) 
     var u_fill_colour = SKUniform(name: "u_fill_colour", floatVector4: GLKVector4Make(131.0/255.0, 149.0/255.0, 255.0/255.0, 1.0)) 
     var u_border_colour = SKUniform(name: "u_border_colour", floatVector4: GLKVector4Make(104.0/255.0, 119.0/255.0, 204.0/255.0, 1.0)) 
     var u_total_animation_duration = SKUniform(name: "u_total_animation_duration", float: Float(transitionDuration)) 
     var u_elapsed_time = SKUniform(name: "u_elapsed_time", float: Float(0)) 
     shader.uniforms = [u_size, u_fill_colour, u_border_colour, u_total_animation_duration, u_elapsed_time] 
     return shader 
    } 
    func presentScene(scene: SKScene?, shaderName: String, transitionDuration: NSTimeInterval) { 
     // Create shader and add it to the scene 
     var shaderContainer = SKSpriteNode(imageNamed: "dummy") 
     shaderContainer.name = kNodeNameTransitionShaderNode 
     shaderContainer.zPosition = 9999 // something arbitrarily large to ensure it's in the foreground 
     shaderContainer.position = CGPointMake(size.width/2, size.height/2) 
     shaderContainer.size = CGSizeMake(size.width, size.height) 
     shaderContainer.shader = createShader(shaderName, transitionDuration:transitionDuration) 
     self.addChild(shaderContainer) 
     // remove the shader from the scene after its animation has completed. 
     let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(transitionDuration * Double(NSEC_PER_SEC))) 
     dispatch_after(delayTime, dispatch_get_main_queue(), {() -> Void in 
      var fadeOverlay = SKShapeNode(rect: CGRectMake(0, 0, self.size.width, self.size.height)) 
      fadeOverlay.name = kNodeNameFadeColourOverlay 
      fadeOverlay.fillColor = SKColor(red: 131.0/255.0, green: 149.0/255.0, blue: 255.0/255.0, alpha: 1.0) 
      fadeOverlay.zPosition = shaderContainer.zPosition 
      scene!.addChild(fadeOverlay) 
      self.view!.presentScene(scene) 
     }) 
     // Reset the time presentScene was called so that the elapsed time from now can 
     // be calculated in updateShaderTransitions(currentTime:) 
     presentationStartTime = -1 
    } 
    func updateShaderTransition(currentTime: CFTimeInterval) { 
     if let shader = self.transitionShader { 
      let elapsedTime = shader.uniformNamed("u_elapsed_time")! 
      if (presentationStartTime < 0) { 
       presentationStartTime = currentTime 
      } 
      elapsedTime.floatValue = Float(currentTime - presentationStartTime) 
     } 
    } 
    // this function is called by the scene being transitioned to when it's ready to have the view faded in to the scene i.e. loading is complete, etc. 
    func completeShaderTransition() { 
     if let fadeOverlay = self.childNodeWithName(kNodeNameFadeColourOverlay) { 
      fadeOverlay.runAction(SKAction.sequence([SKAction.fadeAlphaTo(0, duration: 0.3), SKAction.removeFromParent()])) 
     } 
    } 
} 
+0

私は実際に2つのシーンをオーバーレイしたいとは限りません。私が実際に望むのは、上のビューが.5-.6の不透明度を持つ黒色である別のビューでオーバーレイすることです。これは、ユーザーがゲームを失ったときに背景を薄暗くします。上記のコードでは、オーバーレイシーンが常に不透明なので、これを達成できませんでした。 – Minimi

+0

私はあなたを理解していません、どういう意味ですか?あなたはSprite-kitとUIKitを区別しなければならないので、実際に何を得るのですか? –

+1

混乱して申し訳ありませんが、私はSKSceneを別のSKViewにオーバーレイしようとしましたが、これはうまくいかず、透明ではありません。私はまた、私のSKSceneをUIViewでオーバーレイしようとしましたが、これも透過的ではありません。私が望むのは、私のSKSceneノードが別のビューやシーンから見えるようにすることです。私は本当に気にしません。私が探している効果は、私の元のシーンのぼやけた効果です。 – Minimi

関連する問題