马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 立笔犊 于 2019-10-8 21:11 编辑
如题,之前尝试过在RenPy中写一个打地鼠,不过一直没有成功。系统地学习了一下Python和面向对象的知识后再来改程序,最终做了出来这个打地鼠。
注意一下RenPy中有以下问题:
1、有很多种声明变量的方式,并且变量所在存储区十分奇怪,进行高级操作时有时会有找不到声明的变量的情况。
2、不是继承自Action类的action不可带参,否则会引发奇怪的bug。
之前这两个问题一直解决不了,所以一直失败。
现在的解决方法:
完全面向对象,全部写成类。
数据全放对象中从而避免RenPy名称空间混乱的问题。
方法全部使用类的数据从而避免RenPy非继承的动作函数不可带参的问题,
两个类:
Room类:定义了打地鼠中一个格子的基础状态、行为、变化。
MyGame类:统筹了4×4个格子的变化。
下面是效果视频和资源图,把图放到image文件夹下,再把代码贴在script.rpy等文件里即可(注意一下start标签不可重复):
游戏演示.zip
(454.04 KB, 下载次数: 103)
关于这个不想讲太多,其实就是简单的面向对象,会简单python语法就会,一看就懂,否则就不会。
更多功能,比如记分、判定游戏结束等等,如果看得懂这些代码的话,要加进入也不难。
[RenPy] 纯文本查看 复制代码 init python:
import random
class Room():
def __init__(self):
self.state=0
def display(self):
if self.state == 0:
ui.imagebutton(idle="apoto.png")
else:
ui.imagebutton(idle="apoto2.png",action=[self.click,SetScreenVariable("a",1)])
def click(self):
self.state=0
def random(self):
self.state=0
result=random.randint(0,4)
if result==0:
self.state=1
class MyGame():
def __init__(self):
self.grid=[]
for i in range(0,16):
self.grid.append(Room())
def display(self):
ui.grid(4,4,align=(0.5,0.5),spacing=20)
#ui.vbox(align=(0.5,0.5))
for room in self.grid:
room.display()
ui.close()
def random(self):
for room in self.grid:
room.random()
mygame=MyGame()
screen test():
default a=1
python:
mygame.display()
timer 2.0:
action [mygame.random,SetScreenVariable("a",1)]
repeat True
#游戏开始的标记
label start:
call screen test
另外还有一点,RenPy中screen需要修改界面变量后才会刷新,否则即使实际上图片的现实改变了,但是screen没有刷新。所以需要声明一个界面变量default a=1,然后timer的action中用动作列表,带上更新界面变量,从而刷新。
|