Project1

标题: [小远童鞋靴脚本_第一波]鼠标控制窗口移动/关闭 [打印本页]

作者: a774741359    时间: 2013-9-16 23:38
标题: [小远童鞋靴脚本_第一波]鼠标控制窗口移动/关闭
本帖最后由 a774741359 于 2013-9-18 16:18 编辑

{:2_287:}[小远童鞋靴脚本_第一波]鼠标控制窗口移动/关闭

这块开始的想法是使用窗口自身的z坐标来实现窗口的区分,不过后来发现根本一点可行性都没有,因为他们的Z坐标默认基本都是相同的(窗口的默认Z坐标是多少勒?)答对有姜
后来无奈只能自己添加一个Z坐标,这个Z坐标必须是唯一的。
一开始打算在Window_Base里处理窗口的叠加与移动,但是后来发现不可行,于是移动到了Scene_Base里处理。

A.注册句柄
核心就是一个存放着window句柄的数组wnd_list了。(什么是window句柄=>我也不知道该管创建窗口返回值叫什么)
这个数组的[0]=>首位是在屏幕上最高的一个窗口,我称为置顶窗口
这个窗口必定是激活的(active)
如果窗口类里标明了可移动(can_move)可关闭(can_close),这个窗口就可以被移动和关闭。
方法:def regiter_handle(wnd)
           注册句柄(窗口句柄)
解释:在窗口创建的同时调用该方法注册句柄,如果没有注册则不参与窗口移动。
           这个方法向数组wnd_list尾压入一个成员。wnd不能为空。(因此,越晚被注册的窗口Z坐标越低,写文章的时候才觉得好怪。)

B.窗口置顶
第二就是判断鼠标选择置顶窗口
从数组wnd_list首位开始判断=>即Z坐标从最高开始递减
循环判断数组中的成员的矩形是否被鼠标按下(click),如果是的话,该成员移到首位。
首位活跃=真
次位活跃=假 =>如果允许后台运行 则跳过
方法:def handle_to_top(wnd)
         窗口置顶(窗口句柄)
解释:这个方法把一个窗口句柄移动到首位,原位置以前的项目依次后退。

C.窗口移动和关闭
第三就是判断鼠标是否被拖动和是否被关闭
进入移动状态判定条件:鼠标在窗体范围内 and 鼠标左键状态为Down
                                      如果满足上面的条件,窗体就进入了Moving状态,记录抓取点=>此时的鼠标的坐标
离开移动状态判定条件:鼠标离开了窗体范围 or 鼠标左键状态为Up
                                      如果满足上面的条件,窗体就离开了Moving状态,抛弃记录点=>记录点清空
关闭判定条件:鼠标在关闭范围内 and 鼠标click
                        如果满足了上面的条件,窗体调用Base的close关闭
Moving状态:窗体的坐标=鼠标现行的坐标-抓取点坐标

D.注销句柄
注销句柄:从数组中剔除某个成员,这个成员将不再参与移动和关闭操作。

E.场景退出
注销所有句柄:清空数组

根据上面的方法,现在已经实现了基本的鼠标移动窗口和鼠标关闭窗口。
根据测试可以达成窗口叠加,置顶窗口的绘画Z坐标比其他所有窗口高
根据测试可以达成窗口关闭,在窗口指定了可关闭的时候。
根据测试可以达成窗口移动,在窗口指定了可移动的时候。
这就是小远童鞋靴脚本的第一波,本文中如果有错误或者您有更好的方法跟帖回复,由于脚本还处于概念阶段,并不稳定,就不上传了,请大家见谅。
小远童鞋希望大家在回复中发表一下自己对Rm的鼠控窗口(即本文中所述)的看法无论贬褒,请您留下足迹。


作者: 无脑之人    时间: 2013-9-17 12:17
看起来很科学的样子0 0
不过这个功能很可能被一些xiao玩pen家you玩坏的……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1