我在屏幕底部堆叠了 5 张图像。我的游戏目的是拖动这些图像并在特定条件下将它们连接起来。(有点像拼图游戏)我使用了以下代码
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 和教程并没有多大帮助。有没有一种方法可以在一个触摸实例上拖动一个图像?帮助表示赞赏
这是一个示例,它创建了两个 Sprite 并让您单独拖动它们。
设计:
- 你需要检测哪个 Sprite 被触摸,然后只移动那个 Sprite 。
- 在 OnTouchesBegan 中保存被触摸的 Sprite
- 在 OnTouchesMoved 中移动当前触摸的 Sprite
注意事项:
- OnTouchesBegan 为注册该事件的每个 Sprite 调用一次。所以如果20个 Sprite 添加监听器,OnTouchesBegan事件被调用20次(除非被吞噬,见下文)
- 您可以通过编程方式确定触摸位置是否在调用 OnTouchesBegan 的 Sprite 的边界框内。然而,“吞下”触摸将停止任何剩余的排队调用。要下咽,只需返回 true。
一旦找到感兴趣的 sprite,就返回 true 以“吞下”触摸事件并阻止其余 sprite 回调。这可以节省 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
}
}
我是一名优秀的程序员,十分优秀!