2015-10-16 71 views
3

我有5个图像堆积在屏幕的底部。我的游戏的目标是拖动这些图像,并将它们连接在一定条件下(排序拼图) 我用下面的代码Android游戏:从一组图像一次拖拽一个图像到屏幕

var touchListener = new CCEventListenerTouchAllAtOnce(); 
touchListener.OnTouchesEnded = OnTouchesEnded; 
touchListener.OnTouchesMoved = HandleTouchesMoved; 
AddEventListener (touchListener, this); 
void HandleTouchesMoved (List touches, CCEvent touchEvent) 
{ 
    foreach(var tap in touches) 
    { 
     var locationOnScreen = tap.Location; 
     alarmicSprite.PositionY = locationOnScreen.Y; 
     alarmicSprite.PositionX = locationOnScreen.X; 
     pressSwitchSprite.PositionY = locationOnScreen.Y; 
     pressSwitchSprite.PositionX = locationOnScreen.X; 
    } 
} 

该代码同时将所有图像到触摸的坐标。我的要求是一次只能拖动一个图像,而不是一次拖动一次。我脑海中Xamarin和Github给出的Cocossharp API和教程并不是那么有用。 有没有一种方法可以在一个触摸实例上拖动一个图像? 帮助赞赏

+0

当你说 “堆叠”,是否意味着你有精神上的另一个? – jaybers

回答

5

这里是一个例子,它创建两个精灵并让你单独拖动它们。

设计

  • 您需要检测哪个精灵被触摸,然后只能移动精灵。
  • 拯救精灵被触摸的OnTouchesBegan
  • 将当前的触摸精灵在OnTouchesMoved

注意

  • 的OnTouchesBegan为EVERY精灵,其登记为被调用一次事件。因此,如果20个精灵添加侦听器,则OnTouchesBegan事件被调用20次(除非被吞噬,见下)
  • 以编程方式确定触摸位置是否在调用OnTouchesBegan的精灵的边界框内。然而,“吞咽”触摸将停止任何剩余的排队等待呼叫。要吞咽,只需返回true。
  • 一旦找到感兴趣的精灵,您将返回true以“吞下”触摸事件,并停止其他精灵回拨。这可以节省CPU并更快地执行您的OnTouchesMoved。在完全处理OnTouchesBegan之前,系统不会调用OnTouchesMoved。

    CCSprite currentSpriteTouched; 
    CCSprite Sprite1; 
    CCSprite Sprite2; 
    protected override void AddedToScene() 
    { 
        base.AddedToScene(); 
    
        // Use the bounds to layout the positioning of our drawable assets 
        CCRect bounds = VisibleBoundsWorldspace; 
    
        Sprite1 = new CCSprite("redball.png"); 
        Sprite2 = new CCSprite("blueball.png"); 
    
        Sprite1.Position = bounds.Center; 
        Sprite2.Position = bounds.Center; 
        AddChild(Sprite1); 
        AddChild(Sprite2); 
    
        // Register for touch events 
        var touchListener = new CCEventListenerTouchOneByOne(); 
        touchListener.IsSwallowTouches = true; 
        touchListener.OnTouchBegan = this.OnTouchesBegan; 
        touchListener.OnTouchMoved = this.OnTouchesMoved; 
    
        AddEventListener(touchListener, Sprite2); 
        AddEventListener(touchListener.Copy(), Sprite1); 
    
    } 
    
    
    void OnTouchesMoved(CCTouch touch, CCEvent touchEvent) 
    { 
        if (currentSpriteTouched != null) 
        { 
         currentSpriteTouched.Position = touch.Location; 
        } 
    } 
    
    bool OnTouchesBegan(CCTouch touch, CCEvent touchEvent) 
    { 
        // This is called once for each sprite 
        // To stop the remaining sprites from calling, 
        // "swallow" the touch by returning true 
        CCSprite caller = touchEvent.CurrentTarget as CCSprite; 
        currentSpriteTouched = null; 
        if (caller == Sprite1) 
        { 
         if (Sprite1.BoundingBoxTransformedToWorld.ContainsPoint(touch.Location)) 
         { 
          System.Diagnostics.Debug.WriteLine("Sprite 1 touched "); 
          currentSpriteTouched = Sprite1; 
          return true; // swallow  
         } 
         else 
         { 
          return false; // do not swallow and try the next caller 
         } 
    
        } 
        else if (caller == Sprite2) 
        { 
         if (Sprite2.BoundingBoxTransformedToWorld.ContainsPoint(touch.Location)) 
         { 
          currentSpriteTouched = Sprite2; 
          System.Diagnostics.Debug.WriteLine("Sprite 2 touched "); 
          return true; // swallow  
         } 
         else 
         { 
          return false; // do not swallow and try the next caller 
         } 
        } 
        else 
        { 
         // something else touched 
         System.Diagnostics.Debug.WriteLine("Something else was touched"); 
         return false; // Do not swallow 
        } 
    } 
    
0

我跟着这个链接TouchableSpriteTest并取得我需要的功能(从jaybers帮助)

示例代码

protected override void AddedToScene() 
     { 
      -------------------------- 
      -------------------------- 
      // Register for touch events 
     var touchListener = new CCEventListenerTouchOneByOne(); 
     touchListener.IsSwallowTouches = true; 
     touchListener.OnTouchBegan = OnTouchBegan; 
     touchListener.OnTouchEnded = OnTouchesEnded;    
     touchListener.OnTouchMoved = HandleTouchesMoved; 
     batterySprite.AddEventListener (touchListener); 
     pressSwitchSprite.AddEventListener (touchListener.Copy()); 
     wireSprite3.AddEventListener (touchListener.Copy()); 
     lampSprite.AddEventListener (touchListener.Copy()); 
     wireSprite2.AddEventListener (touchListener.Copy()); 
     } 

     bool OnTouchBegan (CCTouch touch, CCEvent touchEvent) 
     {  
      var target = (CCSprite)touchEvent.CurrentTarget; 

      var locationInNode = touch.Location; 
      var s = target.ContentSize; 
      CCRect rect = target.BoundingBoxTransformedToWorld; 

      if (rect.ContainsPoint (locationInNode)) {    
       target.Opacity = 180; 
       return true; 
      } 
      return false; 
     } 

     void HandleTouchesMoved (CCTouch touch, CCEvent touchEvent) 
     {  

      var target = (CCSprite)touchEvent.CurrentTarget; 
      CCPoint pt = touch.PreviousLocation + touch.Delta; 
      target.Position = target.WorldToParentspace (pt); 
     } 
相关问题