RenPy中文空间

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 278|回复: 0

[旧版文档] 拖放系统

 关闭 [复制链接]
发表于 2017-12-24 17:00:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 BuErShen 于 2018-9-17 08:10 编辑

拖放
注意
此处为旧版文档,不再更新。

查阅最新Ren’Py简体中文文档,请到下面网址(同步官方)
https://www.renpy.cn/doc/index.html




Ren'Py引擎是含有拖放系统的,即允许用鼠标对displayable(可显示对象)在视屏上进行拖放操作。一般拖放系统的用途是:

  • 允许用户重新定位窗口,存储窗口位置。
  • 需要在视屏上拖动卡片的纸牌类游戏。(例如:扑克。)
  • 库存系统。
  • 重新排序系统。

拖放displayable(可显示对象)可以实现拖放的其他用途。 这里涉及两个类。 Drag类表示可以在视屏上拖动的东西,可拖动的东西,或者可以同时执行的东西。 DragGroup类表示一组拖动 - 要进行拖放,两个拖动必须是同一个拖动组的一部分。

拖放系统可以通过Screen语言或直接用作displayable(可显示对象)。 当您不需要参考创建后创建的 Drag时,使用 Screen语言 是有意义的。 如果可拖动对象(draggable)表示用户在视屏上放置的窗口,则可能是这种情况。如果您在创建完成后需要引用 Drag,则最好直接创建 Drag,然后将它们添加到DragGroup(拖放组)中。

Displayables

class Drag(d=None, drag_name=None, draggable=True, droppable=True, drag_raise=True, dragged=None, dropped=None, drag_handle=(0.0, 0.0, 1.0, 1.0), drag_joined=..., clicked=None, hovered=None, unhovered=None, **properties)

表示可以在其封闭区域内拖动的displayable(可显示对象)。 Drag也可以表示其他Drag类可以放置的区域。

可以在内部移动的Drag, 通常它的父级要么是一个 Fixed() 要么是 DragGroup

Drag有一个子级。 子级的状态反映了拖放操作的状态:

selected_hover - 当它被拖动时
selected_idle - 当它被放下时
hover - 鼠标点击时拖动项可被拖动
idle - 其它

拖动句柄是子级内的矩形。 鼠标必须位于拖动句柄内部的非透明像素上才能进行拖动或单击。

新创建的可拖动对象默认添加到DragGroup(拖放组)中。 一个可拖动对象只能在一个DragGroup(拖放组)中 - 如果它被添加到第二个组中,它将从第一个组中移除。

当首次渲染Drag时,如果它的位置不能从它所在的DragGroup(拖放组)中确定,那么它的左上角的位置是使用标准布局算法计算的。

d
如果存在的话,用这个Drag子级。 如果不是None,则Drag类优先使用子样式。

drag_name
如果不是None,则是这个可拖动对象的名称。 这可用作可拖动对象的名称属性。 如果在DragGroup(拖放组)中具有相同名称的Drag,则该Drag的起始位置来自该 可拖动对象。

draggable
如果为true,则Drag可以用鼠标在视屏上拖动。

droppable
如果为true,则可以将其他Drag拖放到此Drag上。

drag_raise
如果为true,则在拖动时将此Drag拖放在最顶端。 如果连接到其它Drag,则所有Drag都会被一起链接拖动。

dragged
拖动Drag时调用的回调(或回调列表)。它有两个参数。 第一个是正在拖动的Drags列表。第二个是要拖放的Drag,或者没有拖放发生。 如果回调返回的值不是None,则作为交互结果返回该值。

dropped
当这个Drag被拖放时调用的回调(或回调列表)。 它有两个参数。 首先是将Drag拖放到上面。 第二个是拖动的Drag列表。 如果回调返回的值不是None,则作为交互结果返回该值。

当同一事件触发拖放回调时,只有当拖放回调为None时才会调用拖放回调。

clicked
当单击Drag而不移动时, 将调用此回调 (不带参数)。 可删除也可以聚焦和点击。 如果回调返回的值不是None,则作为交互结果返回该值。

drag_handle
一个(x,y,width,height)元组,给出了子级内的拖动句柄的位置。 在这个元组中,整数被认为是像素的字面数,而浮点数是相对于子级的大小。

drag_joined
用当前的Drag作为参数调用。 预计会返回[(drag,x,y)]元组的列表,并将可拖动的元素拖放为一个单位。 x和y是拖动相对于彼此的偏移,它们不是相对于拖动的角点。

drag_offscreen
如果为true,则能将此可拖动对象拖放到屏幕外。 由于拖动可以完全离开视屏,无法将它们放回到视屏上,所以使用drag_joined或拖放操作可能会改变大小并且会很危险。

除了d之外,所有的参数都可以作为Drag对象上的域(具有相同的名称)。 另外,在拖动完成后,以下字段可用:

x, y
Drag相对于其父级的位置,以像素为单位。

w, h
Drag的子级的宽度和高度,以像素为单位。

set_child(d)
将此拖动的子级更改为d。

snap(x, y, delay=0)
改变拖动的位置。 如果没有显示拖动,那么位置改变是即时的。 否则,位置改变需要延迟几秒,并以线性移动改变。

top(self)
将此displayable(可显示对象)提升到drag_group的上面。

class DragGroup(*children, **properties)
代表一组Drag。 Drag被限制在DragGroup(拖放组)的边界。 只能在同一个DragGroup(拖放组)内的Drag,进行拖放。拖放操作只能在DragGroup(拖放组)内部时才会产生。

DragGroup被设置为 Fixed()
所有DragGroup(拖放组)构造函数的位置参数都应该是Drag,并被添加到DragGroup(拖放组)中。

add(child)
向此DragGroup(拖放组)的添加必须是Drag拖动的子项。

get_child_by_name(name)

返回此DragGroup(拖放组)第一个具有 [drag_name] 名称的子级。

remove(child)
从此DragGroup(拖放组)中移除子项。

例子

一个screen(视屏)例子,允许用户通过在屏幕上的拖动来选择窗口位置。
[RenPy] 纯文本查看 复制代码
screen say:

    drag:
        drag_name "say"
        yalign 1.0
        drag_handle (0, 0, 1.0, 30)

        xalign 0.5

        window id "window":
            # 确保窗口比视屏小。
            xmaximum 600

            has vbox

            if who:
                text who id "who"

            text what id "what"

这是一个更复杂的例子,它展示了如何使用拖放系统影响游戏玩法。 并显示了如何使用拖放系统让角色到达到某个位置:
[RenPy] 纯文本查看 复制代码
init python:

    def detective_dragged(drags, drop):

        if not drop:
            return

        store.detective = drags[0].drag_name
        store.city = drop.drag_name

        return True
screen send_detective_screen:

    # 地图作为背景。
    add "europe.jpg"

    # 一个DragGroup(拖放组)确保侦探和城市
    # 可以互相拖放。
    draggroup:

        # 我们的侦探。
        drag:
            drag_name "Ivy"
            child "ivy.png"
            droppable False
            dragged detective_dragged
            xpos 100 ypos 100
        drag:
            drag_name "Zack"
            child "zack.png"
            droppable False
            dragged detective_dragged
            xpos 150 ypos 100

        # 他们可以去的城市。
        drag:
            drag_name "London"
            child "london.png"
            draggable False
            xpos 450 ypos 140
        drag:
            drag_name "Paris"
            draggable False
            child "paris.png"
            xpos 500 ypos 280
label send_detective:
    "我们需要调查,我们应该派谁去,他们应该去哪里?"

    call screen send_detective_screen

    "好的,我们会派 [detective] 到 [city]."

更复杂的系统需要大量的编程技巧才能正确使用。 Ren'Py Cardgame (纸牌游戏)框架 既是一个如何在复杂系统中使用拖放的例子,也可以用于制作卡牌游戏。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号 | 苏公网安备 32092302000068号 )

GMT+8, 2018-12-13 03:06 , Processed in 0.047334 second(s), 21 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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