找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1229|回复: 2

[教程] 高级猜球盅小游戏

[复制链接]
发表于 2024-8-17 22:23:05 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 烈林凤 于 2024-8-19 16:45 编辑

2024-8-18更新:重新优化了代码,将5个transform合并成2个(其实可以只用一个,但不利于维护,不建议合并);添加了“重新开始”按钮,将点击其他盒子下落的行为改成了空行为,将原本的行为注释掉了
———————————————————————————————————————————————————————————————————————————
因为在论坛上看到了@leech 发的一篇猜球盅小游戏插件,发现其代码优化的空间还有很大,而且局限性也很大
于是,我便以小游戏的规则,按照自己的思路写了一个有着更高自由度的猜球盅小游戏,原理很简单,可以根据自己的需要去更改内核以适配自己的游戏。

*此版本的优点:
1-盒子的数量可以任意选择,不过过多的盒子数量会导致程序卡顿,解决方式是去掉hover的部分

2-只需要2~3张图片——盒子的idle、hover图片和骰子的图片
3-骰子和盒子的位置替换是完全随机的,无需使用固定的变换样式
4-有着更丰富的动画效果

该版本的思路和原理较为简单,但使用了许多不常用的renpy界面语言,因此不建议对renpy还不熟悉的同学使用,具体的写法已经放在注释中了,有需要请自行查阅文档
该教程使用的是8.2.1版本,请尽可能换成此版本或更高的版本,低版本有可能发生报错!
该教程内的所有代码都可以尽情改编,如果需要改编或直接放入自己的游戏当中,请表明出处,感谢!

接下来是教程内所使用的代码——
[RenPy] 纯文本查看 复制代码
label ceshi_19:
    ## 改变盒子数量
    $ random_num_19 = 16
    call screen screen_dicegame_19()

## 定义图片
image dicegame_box_idle:
    "#92c1ffff"
    xysize(80,150)

image dicegame_box_hover:
    "#9992ffff"
    xysize(80,150)
    
image dicegame_dice:
    "#ffe292ff"
    xysize(50,50)

## 定义随机变量函数
init python:
    import random

    random_num_19 = 6           ## 盒子数量
    random_list_19 = []         ## 盒子序列列表
    random_xpos_list_19 = []    ## 盒子位置列表
    dice_tf = None              ## 判断骰子的状态,None表示未开始,False表示抬起,True表示落下

    ## 将每一个盒子都绑定一个数字,并随机排列
    def random_box():
        random_list_19.clear()
        for i in range(random_num_19):
            random_list_19.append(i)
        random.shuffle(random_list_19)
    
    ## 使每一个盒子都获得一个位置,并随机排列
    def random_xpos():
        random_xpos_list_19.clear()
        for i in range(random_num_19):
            random_xpos_list_19.append(960-random_num_19*50+i*100)
        random.shuffle(random_xpos_list_19)

## 变换行为
## 盒子的状态
transform random_pos_box(linear_x,pos_x,linear_y,pos_y):
    parallel:
        linear linear_x xpos pos_x
    parallel:
        linear linear_y ypos pos_y

## 盒子不同状态时,骰子的状态
transform random_pos_dice(pos_x,alpha_num):
    ypos 600
    xpos pos_x+15
    linear 0.5 alpha alpha_num

## 本体界面
screen screen_dicegame_19():
    ## 界面出现时调用函数(初始化)
    on "show" action [Function(random_box),Function(random_xpos)]
    vbox:
        xycenter(0.5,0.7)
        ## 每次点击使盒子和骰子的位置随机打乱
        ## 可以使用使用循环,使每次点击后进行多次换位
        textbutton "打乱骰子":
            action Function(random_xpos)
        ## 点击后将盒子落下
        textbutton "猜选骰子":
            action SetVariable("dice_tf",True)
        ## 点击后将盒子抬起
        textbutton "重新开始":
            action SetVariable("dice_tf",False)

    for i in random_list_19:
        button:
            anchor(0.0,1.0)
            vbox:
                ## 将vbox翻转,保证骰子的图层在盒子下
                box_reverse True

                ## 骰子
                if i == 0:
                    ## 改变骰子的状态
                    if (dice_tf == None) or (dice_tf == False):
                        add "dicegame_dice" at random_pos_dice(random_xpos_list_19[i],1.0)
                    elif dice_tf == True:
                        add "dicegame_dice" at random_pos_dice(random_xpos_list_19[i],0.0)
                else:
                    ## 使用null占位,防止高度不一致
                    ## 这里的大小需要与骰子大小一致
                    add Null(width=50, height=50)

                ## 盒子
                imagebutton:
                    idle "dicegame_box_idle"
                    hover "dicegame_box_hover"
                    ## 将藏有骰子的盒子设定为0
                    if i == 0:
                        ## 正确时将盒子打开
                        action SetVariable("dice_tf",False)
                    else:
                        action NullAction()
                        ## 错误时将盒子关闭
                        ## 可以设计成计数器,每次猜错时+1,到达一定数量游戏失败
                        # action SetVariable("dice_tf",True)
                    
                    ## 改变盒子的状态
                    if dice_tf == None:
                        at random_pos_box(0,random_xpos_list_19[i],0,600)
                    elif dice_tf == False:
                        at random_pos_box(1.0,random_xpos_list_19[i],0.5,600)
                    elif dice_tf == True:
                        at random_pos_box(1.0,random_xpos_list_19[i],0.5,660)


有任何问题请在楼下留言说明,希望各位用得高兴(@·v·@)
结束
QQ截图20240817222236.png
发表于 2024-8-17 22:39:15 | 显示全部楼层
感谢大哥优化
回复 支持 抱歉

使用道具 举报

发表于 2024-12-13 18:17:11 | 显示全部楼层
感谢大佬分享!
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 00:07 , Processed in 0.301116 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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