2017-01-14 56 views
1

所以我在玩BouncyGame。我做到了,所以當你開始遊戲時,你需要按下屏幕才能開始遊戲。我希望在你進行新一輪比賽時實現這一點。我試圖在代碼底部重複使用它,但它使其非常滯後。試圖找出如何暫停和恢復在Cocossharp(BouncyGame)

// Register for touch events 
     var touchListener = new CCEventListenerTouchAllAtOnce(); 
     touchListener.OnTouchesEnded = OnTouchesEnded; 

     touchListener.OnTouchesMoved = OnTouchesEnded; 
     AddEventListener(touchListener, this); 


    } 

    void OnTouchesEnded(List<CCTouch> touches, CCEvent touchEvent) 
    { 
     if (touches.Count > 0) 
     { 
      Schedule(RunGameLogic); 
      scoreLabel.Text = "Score: 0"; 
      paddleSprite.RunAction(new CCMoveTo(.1f, new CCPoint(touches[0].Location.X, paddleSprite.PositionY))); 
     } 
    } 

我不知道如何做到這一點,嘗試了2小時0結果。歡迎任何建議。

以下是完整的代碼。

using System; 
using System.Collections.Generic; 
using CocosSharp; 
using Microsoft.Xna.Framework; 

namespace CocosSharpGameTest 
{ 
public class IntroLayer : CCLayerColor 
{ 

    // Define a label variable 
    CCLabel scoreLabel; 
    CCSprite paddleSprite, ballSprite; 

    public IntroLayer() : base(CCColor4B.Black) 
    { 

     // create and initialize a Label 
     scoreLabel = new CCLabel("Tap to GO!", "Arial", 80, CCLabelFormat.SystemFont); 

     // add the label as a child to this Layer 
     scoreLabel.PositionX = 50; 
     scoreLabel.PositionY = 1000; 
     scoreLabel.AnchorPoint = CCPoint.AnchorUpperLeft; 
     AddChild(scoreLabel); 

     paddleSprite = new CCSprite("paddle.png"); 
     AddChild(paddleSprite); 

     ballSprite = new CCSprite("ball.png"); 
     AddChild(ballSprite); 

    } 

    protected override void AddedToScene() 
    { 
     base.AddedToScene(); 

     // Use the bounds to layout the positioning of our drawable assets 
     CCRect bounds = VisibleBoundsWorldspace; 

     // position the label on the center of the screen 


     paddleSprite.PositionX = 100; 
     paddleSprite.PositionY = 100; 
     ballSprite.PositionX = 320; 
     ballSprite.PositionY = 640; 

     // Register for touch events 
     var touchListener = new CCEventListenerTouchAllAtOnce(); 
     touchListener.OnTouchesEnded = OnTouchesEnded; 

     touchListener.OnTouchesMoved = OnTouchesEnded; 
     AddEventListener(touchListener, this); 


    } 

    void OnTouchesEnded(List<CCTouch> touches, CCEvent touchEvent) 
    { 
     if (touches.Count > 0) 
     { 
      Schedule(RunGameLogic); 
      scoreLabel.Text = "Score: 0"; 
      paddleSprite.RunAction(new CCMoveTo(.1f, new CCPoint(touches[0].Location.X, paddleSprite.PositionY))); 
     } 
    } 
    float ballXVelocity; 
    float ballYVelocity; 
    // How much to modify the ball's y velocity per second: 
    const float gravity = 140; 

    int score = 0; 

    void RunGameLogic(float frameTimeInSeconds) 
    { 
     // This is a linear approximation, so not 100% accurate 
     ballYVelocity += frameTimeInSeconds * -gravity; 
     ballSprite.PositionX += ballXVelocity * frameTimeInSeconds; 
     ballSprite.PositionY += ballYVelocity * frameTimeInSeconds; 

     bool overlap = ballSprite.BoundingBoxTransformedToParent.IntersectsRect(paddleSprite.BoundingBoxTransformedToParent); 
     bool movingDown = ballYVelocity < 0; 
     if (overlap && movingDown) 
     { 
      ballYVelocity *= -1; 
      const float minXVelocity = -300; 
      const float maxXVelocity = 300; 
      ballXVelocity = CCRandom.GetRandomFloat(minXVelocity, maxXVelocity); 

      score++; 
      scoreLabel.Text = "Score: " + score; 
     } 

     float ballRight = ballSprite.BoundingBoxTransformedToParent.MaxX; 
     float ballLeft = ballSprite.BoundingBoxTransformedToParent.MinX; 

     float screenRight = VisibleBoundsWorldspace.MaxX; 
     float screenLeft = VisibleBoundsWorldspace.MinX; 

     bool shouldReflectXVelocity = 
      (ballRight > screenRight && ballXVelocity > 0) || 
      (ballLeft < screenLeft && ballXVelocity < 0); 
     if (shouldReflectXVelocity) 
     { 
      ballXVelocity *= -1; 
     } 
     if (ballSprite.PositionY < VisibleBoundsWorldspace.MinY) 
     { 
      ballSprite.PositionX = 320; 
      ballSprite.PositionY = 640; 

      ballXVelocity = 0; 
      ballYVelocity = 0; 
      ballYVelocity *= -1; 
      scoreLabel.Text = "Score: 0"; 
      score = 0; 
     } 
    } 
} 
} 

在此先感謝!

回答

0

想通了! Cocossharp內置了一個「Unschedule」方法。 Ref。 https://developer.xamarin.com/api/namespace/CocosSharp/

我只是說

Unschedule(RunGameLogic);

在非常恩我RunGameLogic方法下

if (ballSprite.PositionY < VisibleBoundsWorldspace.MinY)

所以一旦ballSprite是出界,將取消預定我的計劃我的OntouchesEnded方法。這意味着代碼可以回溯到傾聽觸摸。

可能犯了一些錯誤,但這是最好的,我可以弄明白,它的工作原理!