找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1540|回复: 6

[已解决] 如何实现动态化按钮的问题

[复制链接]
发表于 2022-6-9 15:03:33 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 w4xxx 于 2022-6-10 09:55 编辑

新人刚入门,想做一个打牌的玩法。

图片可以旋转,效果如下:
问题2.png

但如果用扑克牌作为一个imagebutton,又该如何旋转这个imagebutton呢?

另外,该如何实现imagebutton在hovered时播放小动画呢?(比如获得鼠标焦点的牌前置显示并放大)

求大大赐教
发表于 2022-6-10 01:16:02 | 显示全部楼层
class里面的东东有的可以写成property的,以及给card用的transform怎么直接套在frame上了,看着难受,不过我也懒得改了
暂且不提其它,imagebutton就里面放idle和hover的图片就行,然后挂上一个带on的transform
[RenPy] 纯文本查看 复制代码
screen test:
    frame id "card_area":
        xsize 320
        ysize 620
        at card_transform(0.05, 0.9, 1.0)
        for card in my_cards:
            $ p = card.get_pos(my_cards.index(card), len(my_cards))
            imagebutton:
                idle "gui/2_icon.png"
                hover "gui/2u_icon.png"
                hover_sound card.hover_sound_url
                at card_transform(p[0], p[1], 0.625, 90)
                
                action NullAction()

[RenPy] 纯文本查看 复制代码
transform card_transform(x,y,z = 1.0, r=0):
    zoom z
    align (x, y) alpha 0.0
    linear 0.1 alpha 1.0
    rotate r rotate_pad False
    on hover:
        zoom 1.5 * z
    on idle:
        zoom z
回复 支持 1 抱歉 0

使用道具 举报

 楼主| 发表于 2022-6-9 17:05:16 | 显示全部楼层
上面的代码是
[RenPy] 纯文本查看 复制代码
    frame id "card_area":
        xsize 320
        ysize 320
        at ca_pos(0.05, 0.9, 1.0)
        for card in my_cards:
            $ p = card.get_pos(my_cards.index(card), len(my_cards))
            add card.pic_url at ca_pos(p[0], p[1], 0.625) rotate p[2] rotate_pad False

其中
[RenPy] 纯文本查看 复制代码
transform ca_pos(x,y,z = 1.0):
    zoom z
    align (x, y) alpha 0.0
    linear 0.1 alpha 1.0


[RenPy] 纯文本查看 复制代码
init -1 python:
    class Card:
        def __init__(self, card_type = 0, hover_sound_url = "audio/click.wav"):

            self.card_type = card_type
            self.card_text = "card_text"
            self.pic_url = self.get_card_pic(card_type)
            self.hover_sound_url = hover_sound_url
            if card_type == 3:
                self.hover_sound_url = "audio/ding.wav"

        def get_card_pic(self, type):
            card_pic_list = ["gui/icon/card green.png", "gui/icon/card yellow.png",
             "gui/icon/card red.png", "gui/icon/card blue.png"]
            # card_pic_list = ["c1", "c2", "c3", "c4"]
            return card_pic_list[type]


        ## 获得位置三元组
        def get_pos(self, i, num):
            mid = [0.5, 0.5, 0]
            m_num = num/2
            k = 0.8 / num
            # if int(m_num) == m_num:
            x = 0.5 - (m_num - i) * k
            y = 0.5
            r = 0 - (m_num - i) * 5
            return [x,y,r]
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-6-10 09:44:38 | 显示全部楼层
本帖最后由 w4xxx 于 2022-6-10 09:46 编辑
Lost 发表于 2022-6-10 01:16
class里面的东东有的可以写成property的,以及给card用的transform怎么直接套在frame上了,看着难受,不过 ...

非常感谢,主要是只知道at,没见过on
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-6-10 11:09:16 | 显示全部楼层
任务完成,效果还行,类似扑克牌,至于card类的属性……暂时不考虑了。
来交作业

[RenPy] 纯文本查看 复制代码
transform choosed_card(x,y,z = 1.0,r = 0):
    align (x, y)
    zoom z
    on hover:
        rotate 0
    on idle:
        rotate r





[RenPy] 纯文本查看 复制代码
    frame id "card_area":
        xsize 320
        ysize 320
        at ca_pos(0.05, 0.9, 1.0)
        for card in my_cards:
            $ i = my_cards.index(card)
            $ p = card.get_pos(i, len(my_cards))
            if i != ch_card:
                imagebutton:
                    focus_mask True
                    idle card.pic_url
                    hover card.pic_url
                    if ch_card != -1 and ch_card > i:
                        at choosed_card(p[0] - 0.1, p[1] + 0.1, 0.5, p[2])
                    elif ch_card != -1 and ch_card < i:
                        at choosed_card(p[0] + 0.1, p[1] + 0.1, 0.5, p[2])
                    else:
                        at choosed_card(p[0], p[1], 0.5, p[2])
                    hovered [SetVariable("ch_card",-1), Play("sound", card.hover_sound_url), SetVariable("ch_card",i)]
                    action Call("my_card_add")
        if ch_card != -1 and ch_card < len(my_cards):
            $ p = my_cards[ch_card].get_pos(ch_card, len(my_cards))
            imagebutton:
                focus_mask True
                hover my_cards[ch_card].pic_url
                idle my_cards[ch_card].pic_url
                at choosed_card(p[0], p[1] - 0.05, 0.5, p[2])
                unhovered [SetVariable("ch_card", -1)]
                action Call("my_card_add")



回复 支持 抱歉

使用道具 举报

发表于 2022-7-9 23:29:56 | 显示全部楼层
楼主您好!在运行时出了以下这个问题,纯新人求教是哪里出了问题呢?
NameError: name 'my_cards' is not defined

回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2022-7-10 22:38:58 | 显示全部楼层
本帖最后由 w4xxx 于 2022-7-10 22:40 编辑

my_cards需要提前初始化
我的帖子里没有写,毕竟最初只是个提问
[RenPy] 纯文本查看 复制代码
init python:
    # 消息卡片
    my_cards = []
    card = Card(1)
    my_cards.append(card)
    card = Card(2)
    my_cards.append(card)
    card = Card(3)
    my_cards.append(card)
    card = Card(0)
    my_cards.append(card)
    ch_card = -1

后面是添加卡片的函数
[RenPy] 纯文本查看 复制代码
# 添加卡片
label my_card_add():
    python:
        if len(my_cards) < 7:
            card_type = random.randint(0,3)
            card = Card(card_type)
            my_cards.append(card)
    return

回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 07:38 , Processed in 0.117268 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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