吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 854|回复: 13
收起左侧

[已解决] C#中如何实现一个拼图游戏的拖拽交换两个碎片图?

[复制链接]
ilovecomputer66 发表于 2023-7-29 09:24
本帖最后由 ilovecomputer66 于 2023-7-29 22:02 编辑

我用picbox作为每个随机碎片正方形图的展示容器

我只知道mouseDown能监听到在某个碎片上鼠标按住,但是我想监听按下后拖拽移动,应该监听什么事件?试了下,不是MouseMove也不是Move,因为他俩就触发一次,而不是移动过程中时刻触发

免费评分

参与人数 1热心值 +1 收起 理由
shengruqing + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ilovecomputer66 发表于 2023-7-29 09:28
我大致思路就是,先监听按下,然后标记已经按下。然后不知道什么能监听它一直移动,如果能实现,然后在移动过程中,计算与按下时鼠标位置的delta值,从而计算出碎片现在的位置,然后设置其位置为现在的位置

(都是技术版区,请讨论技术问题。然后想比如不做成拖拽,点击交换这种程序员可以离开了)
adamfh 发表于 2023-7-29 10:14
你为什么要监听按下后拖拽移动这个事件?
没必要啊

按下后,高亮显示被选定的方块
再次按下后,鼠标再次选定的方块,与之前高亮显示的方块对换

再处理一下意外情况就完了。
apull 发表于 2023-7-29 10:31
mouseDown里isDown=true
MouseMove里判断isDown后进行计算和移动
MouseUp里isDown=false
saidom1949 发表于 2023-7-29 12:42
mousedown+mousemove
ccbbaa 发表于 2023-7-29 14:26
如果您想要在拖动图片的过程中持续监听鼠标移动事件,您可以尝试使用drag事件。这个事件会在鼠标拖动的时候持续触发。

以下是一个基本的示例,展示了如何使用drag事件:

javascript
box.on('drag', function(ev) {  
  // 在这里添加处理拖动事件的代码  
  console.log('正在拖动图片:', ev.target);  
});
在这个示例中,当您拖动图片时,将会打印出正在被拖动的图片的信息。
lcjok92021 发表于 2023-7-29 14:54
ccbbaa 发表于 2023-7-29 14:26
如果您想要在拖动图片的过程中持续监听鼠标移动事件,您可以尝试使用drag事件。这个事件会在鼠标拖动的时候 ...

您推荐是好像是js代码,版主需要是的C#代码。
Broadm 发表于 2023-7-29 15:11
[C#] 纯文本查看 复制代码
public partial class MainWindow : Form
{
    public MainWindow()
    {
        InitializeComponent();

        StartPosition = FormStartPosition.CenterScreen;

        pictureBox1.Cursor = Cursors.SizeAll;
        pictureBox1.MouseDown += PictureBox1_MouseDown;
        pictureBox1.MouseMove += PictureBox1_MouseMove;
        pictureBox1.MouseUp += PictureBox1_MouseUp;
    }

    private bool _isMouseDown = false;
    private Point _startLocation;
    private int _startX;
    private int _startY;

    private void PictureBox1_MouseDown(object? sender, MouseEventArgs e)
    {
        _isMouseDown = true;
        pictureBox1.Capture = true;
        _startX = e.X + pictureBox1.Left;
        _startY = e.Y + pictureBox1.Top;
        _startLocation = pictureBox1.Location;
    }


    private void PictureBox1_MouseMove(object? sender, MouseEventArgs e)
    {
        if (!_isMouseDown)
        {
            return;
        }

        var x = e.X + pictureBox1.Left;
        var y = e.Y + pictureBox1.Top;

        var diffX = x - _startX;
        var diffY = y - _startY;

        var left = diffX + _startLocation.X;
        var top = diffY + _startLocation.Y;

        pictureBox1.Left = left;
        pictureBox1.Top = top;
    }

    private void PictureBox1_MouseUp(object? sender, MouseEventArgs e)
    {
        _isMouseDown = false;
        pictureBox1.Capture = false;
    }


    private void Window_Load(object sender, EventArgs e)
    {

    }
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ilovecomputer66 + 1 + 1 感谢,之前我不了解Capture属性

查看全部评分

Bszk 发表于 2023-7-29 15:27
本帖最后由 Bszk 于 2023-7-29 15:28 编辑

在win窗口查询中,如果想要实现鼠标离开组件还触发move消息的话,想要在按下中使用SetCapture(组件句柄)捕获鼠标,在不需要的时候ReleaseCapture ()释放鼠标。
关于这两个api,可以去msdn看官方文档

我不玩c#,但是这是win窗口相关的知识,可能c#窗口操作已经涵盖了
 楼主| ilovecomputer66 发表于 2023-7-29 20:15
adamfh 发表于 2023-7-29 10:14
你为什么要监听按下后拖拽移动这个事件?
没必要啊

我2楼括号里就是提前预料,一定会有你这种程序员,不钻研技术,破坏用户体验只为自己省事

免费评分

参与人数 2吾爱币 +1 热心值 +1 收起 理由
limit7 + 1 我很赞同!
adamfh + 1 我很赞同!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 12:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表