Galgame开发之前的准备

前排提示:学习这个之前,你可以先去学习一下tkinter
(ACG圈的朋友可以选择跳过这里…)

  • 以下使用的是百度百科对Galgame的解释:

Galgame(日文假名:ギャルゲーム,平文式罗马字:Gyaru Gēmu,又称美少女游戏)是一种玩家可以与动画美少女进行互动的电子游戏,其受众主体是男性,galgame的游戏类型大多数是vng(视觉小说)但是也有交互式的galgame。
美少女游戏是特属于日本文化的现象;在美国或欧洲的电玩工业中,少有类似的游戏类型存在。美少女游戏占据相当大的日本市场,是日本个人电脑电子游戏的大宗;不过,由于确实存在的文化差异,只有小部分此类游戏被翻译成为其他语言(主要是英文和中文)版本。

  • 程序开发后的样图:
    以下是我们开发的Galgame的样式图(UI与剧本都可以自行修改的):

对于游戏运行的实际画面(样品),你可以前往:https://www.bilibili.com/video/av90715146去观看
开源程序放在这里的:https://download.csdn.net/download/tc9527_/12180013
本文章就是通过开发这些来实现Galgame的建立,这是之前写的可能有些Bug…

关于程序的数据

Galgame的数据

Galgame有三大要素:
立绘: 包含人物立绘与场景立绘;
音乐:音效与背景音乐
剧本:人物的对白与诸多的旁白描写

程序对于数据的存储路径放置:

控件的配色

  • 控件不配色的后果
    由于tkinter不支持单个控件的透明,所以我们只能为控件配置与背景相称的颜色,好比Label的bg参数为yellow类型,但是我得背景颜色是blue,就会出现类似的情况:

    我们可以使用PIL来获取Label所在位置的像素的RGB(需要纯色背景!)

对于数据的获取

相信大部分的小伙伴对于原画与音乐这一方面还不是太擅长,所以在这里推荐一些 网站,可以创建角色:

AI捏脸: https://artbreeder.com/_可以实现人物的组合与捏脸,不需要美工技巧.
(需要科学上网.)

背景(开放版权_运行商用_详见网站说明)_ 可以下载一些背景充当游戏背景.

音乐制作:https://learningmusic.ableton.com/

游戏数据: 建立

程序使用了tkinter 的 resizable 方法来不允许窗口随意更改大小,所以我们对于程序背景采取了强制的px大小,这里是我采用的像素大小

背景: 960*542 px
人物头像:139146 px**

根据这个大小我们可以来建立窗口.(当然你也可以不拘束于我的px大小,你可以将其改为1920*1080都可以.)

如果你是在网上搬运下来的图片,有苦于图片大小不一致,可以在Windows自带画图程序中修改分辨率,当然你也可以用PIL来实现全屏后实时的分辨率转换(这款游戏就没有这么做了,因为这么作会使我得图片有一定的失真)

from PIL import Image
im = Image.open('你的图片地址')
im.save(r'/home/uftp/jia/'+city+'.jpg',dpi=(300.0,300.0))

构建galgame的灵魂:剧本

对于剧本的保存,我们使用了json来保存,并且使用了列表来存储剧本,以下便是列表的格式:

# 文件: begin.json
[[{ "imgae":"客厅", # 规定背景图片,会默认在其后面添加.png"music":"欢快的", # 规定背景音乐,会默认在其后添加.wav"title":"第一章" # 游戏的章节标题},[["人物名称","对白"], # 人物与对白["人物名称","对白"],["无","对白"], # 这个一般用于内心独白["音乐","悲伤的"], # 切换音乐,这个也可以用于声优的配音["人物",[['开始','begin'],['结束','伤心']]] # 选择分支,[['开始','开心'],['结束','伤心']]中,以#['开始','begin']为例子 开始 为选择时展示的文本,开心指的是,选择该分支时所进行的剧本名称,后缀是json]]
]# 伤心.json
[[{"image":"街道","title":"第二章第一节","music":"快乐的"},[   ["人物",'对白'],["人物名称","对白"],["人物名称","对白"],["人物名称","对白"],['end','end_1',':普通结局'] # 结尾展示 ['end','音乐','结局显示文本']]]
],
[]
'''展示end字幕'''
end = '''
配音:
XXX - XXX
XXX - XXX
XXX - XXX'''
import json
with open("end.json",'w') as f:json.dump(end,f)

程序的建立

导包

在开始编程之前,我们先来看看今天需要导入一些什么包或者库

  • 首先是 tkinter,用于实现窗口对象的建立与UI的美化

  • 还有就是 tkinter.font 的Font虽然也是属于tkinter但是我还是不得不提一下,这个包是 对tkinter的文本的设置,下列是他的简单代码

import tkinter
from tkinter.font import Font
ft = Font(size=12,family="幼圆") #size 是字号参数,family 是字体参数
tkinter.Label(text = "开始",font=ft).pack() # 字体修改
  • json 用于序列化与反序列化的IO操作(说白了就是数据的读写操作)
  • pygame 在这个程序中pygame 只处于配角的状态,作用就是音乐的播放,在这里,展示一下pygame音乐播放的能力:
import pygame
pygame.init() # 我们在使用pygame大部分功能前都要将其初始化的哟
sound_yinxiao = pygame.mixer.Sound(r'./Gamedata/adi/Caidan.wav')
sound_yinxiao.play() # 播放
sound_yinxiao.stop() # 暂停
  • PIL包的Image

实现菜单窗口的UI与功能

我们现在背景图片文件目录中创建一个background.png的图片,大小为960*542 px ,可以参照以下的图片(最好最右侧是纯色)


再创建一个类似这样的图片,命名为XW.png(px:334*152)(建议背景为纯色):
以上就是程序所需要的图片,接下来打开网易云或者其他的音乐播放器,下载一首你认为可以作为开始菜单的背景音乐,放在音乐的文件夹下,改名为 Caidan.wav,记得将音频文件改为wav格式的哟,否则pygame会生闷气而报错的.
(使用剪辑软件或者格式工厂可以修改后缀名)
运行的效果:

好了,我们先来写写代码:

import pygame,json
import tkinter as tk
import tkinter.font as tf
from PIL import Image
pygame.init()def RGB_to_Hex(tmp):  # tkinter 的 bg 采用的是十六进制来表示颜色,所以我们要将其转化为16进制# 这段代码来自于https://blog.csdn.net/Forter_J/article/details/89145794rgb = tmp.split(',')  # 将RGB格式划分开来strs = '#'for i in rgb:num = int(i)  # 将str转int# 将R、G、B分别转化为16进制拼接转换并大写strs += str(hex(num))[-2:].replace('x', '0').upper()return strsclass Windows(): # 窗口对象def __init__(self):self.Sound = None # 这个变量用于设置背景音乐,诸如 pygame.mixer.Sound("背景音乐") 就是在这里建立self.nowSound = None # 这个变量用于设置当前正在播放的音乐名称,# 用于游戏中途前往界面(程序终止了当前的音乐,换了碟),在回来后,播放之前的音乐self.Sound_yinxiao = None # 设置播放的音效,诸如 pygame.mixer.Sound("背景音效")def Main(self):self.root = tk.Tk()# 以下是对音乐的设置self.Sound = pygame.mixer.Sound('./Gamedata/adi/Caidan.wav')  # 设置音乐self.Sound.play()  # 开始你的表演SHOW# 以下是图片的设置,只能在实例化Tk对象后创建,在__init__中创建会报错,并且他必须是全局变量,否则后期会出现Bug.self.Background=tk.PhotoImage(file=r'./Gamedata/pic/UI_菜单.png')tk.Label(image=self.Background).place(relheight=1, relwidth=1)  # 放置背景图片控件,你也可以是用Canvas来放置图片# 以下是对窗口的设置self.root.title("这是窗口的游戏名称")self.root.geometry("960x540") # 960x540,x是字母!self.nowSound = "Caidan" # 将now修改为音乐文件的文件名,没有后缀self.root.resizable(False,False)im = Image.open(r'./Gamedata/pic/UI_菜单.png')RGB = im.getpixel((650,100))[0:3] # 获取放置开始与继续游戏的像素RGBprint(RGB)im.close()Font = tf.Font(family="幼圆",size=30) # 设置字体newStart = tk.Label(text="开始游戏",font=Font, bg = RGB_to_Hex("%s,%s,%s" % (RGB[0], RGB[1], RGB[2])),fg="#FD3C5E")newStart.place(x=650,y=100)nextPlay = tk.Label(text="继续游戏",font=Font,bg=RGB_to_Hex("%s,%s,%s" % (RGB[0], RGB[1], RGB[2])),fg="#FD3C5E")nextPlay.place(x=650, y=300)self.root.mainloop()
if __name__ == '__main__':Windows().Main()

这样我们就实现了开始菜单的界面设置,但是这只是一副空壳,没法真正的运行,我们需要给两个Label绑定属于它们的事件.
但是,我们接下来要去捣鼓一个 选择对话框,类似于tkinter.message.askquetion的选择对话框,但是我们的对话框长这样。(可以自由选择哟)
来让我们为Windows类添砖加瓦吧!XunWen方法建立.

import pygame,json
import tkinter as tk
import tkinter.font as tf
from PIL import Image
pygame.init() # 初始化pygame def RGB_to_Hex(tmp):  # tkinter 的 bg 采用的是十六进制来表示颜色,所以我们要将其转化为16进制# 这段代码来自于https://blog.csdn.net/Forter_J/article/details/89145794rgb = tmp.split(',')  # 将RGB格式划分开来strs = '#'for i in rgb:num = int(i)  # 将str转int# 将R、G、B分别转化为16进制拼接转换并大写strs += str(hex(num))[-2:].replace('x', '0').upper()return strsclass Windows(): # 窗口对象def __init__(self):self.Sound = None # 这个变量用于设置背景音乐,诸如 pygame.mixer.Sound("背景音乐") 就是在这里建立self.nowSound = None # 这个变量用于设置当前正在播放的音乐名称,# 用于游戏中途前往界面(程序终止了当前的音乐,换了碟),在回来后,播放之前的音乐self.Sound_yinxiao = None # 设置播放的音效,诸如 pygame.mixer.Sound("背景音效")def XunWen(self,QUE,YesQ="确定",NoQ="不要",EY=None,EN=None,argY=None,argN=None):'''YesQ是确定按钮的文本,QUE是询问文本,NoQ是否认按钮的文本,EY是确定按钮后执行的操作,EN是否认的操作'''# 属性设置def pa():passif EY == None:EY = paif EN == None:EN = pa# 如果没有传入EY或者EN两个参数,则默认其没有多余的操作,只是单纯的关闭按钮self.XWW = True # 告诉程序已经打开了对话框,再去启动其余的对话框时无效的(木大木大木大)tf_Title = tf.Font(size=10)tf_XW = tf.Font(size=20)self.pic_XW = tk.PhotoImage(file=r'./Gamedata/pic/XW.png')# 因为这只是一个对话框说一没有必要去修改窗口背景对象,但是还是要设置为全局变量!# 窗口设置label =  tk.Label(image=self.pic_XW)label.place(x=270,y=160)im = Image.open("./Gamedata/pic/XW.png")RGB = im.getpixel((1, 1))[0:3]Color_16 = RGB_to_Hex("%s,%s,%s" % (RGB[0], RGB[1], RGB[2]))a3 = tk.Label(text="%s"%(QUE),font=tf_Title,bg=Color_16)a3.place(x=380,y=225)Yes = tk.Label(text=YesQ,font=tf_XW,bg=Color_16)Yes.place(x=340,y=255)No = tk.Label(text=NoQ,font=tf_XW,bg=Color_16)No.place(x=450,y=255)def re():self.XWW = False # 告诉系统你关闭了对话框,接下来你又可以肆意点开他了label.destroy()a3.destroy()Yes.destroy()No.destroy()def Tr(e):re()if argY == None:EY()else:EY(argY)def Fr(e):re()if argN == None:EN()else:EN(argY)Yes.bind("<Button-1>",Tr)No.bind("<Button-1>",Fr)def Start(self,event=0):# 因为可能为绑定的事件对象,所以需要一个event参数self.XunWen(QUE="是否开始新游戏?",NoQ="不可!",YesQ="允许!") # 暂时不绑定EYdef Main(self):self.root = tk.Tk()# 以下是对音乐的设置self.Sound = pygame.mixer.Sound('./Gamedata/adi/Caidan.wav')  # 设置音乐self.Sound.play()  # 开始你的表演SHOW# 以下是图片的设置,只能在实例化Tk对象后创建,在__init__中创建会报错,并且他必须是全局变量,否则后期会出现Bug.self.Background=tk.PhotoImage(file=r'./Gamedata/pic/UI_菜单.png')tk.Label(image=self.Background).place(relheight=1, relwidth=1)  # 放置背景图片控件,你也可以是用Canvas来放置图片# 以下是对窗口的设置self.root.title("这是窗口的游戏名称")self.root.geometry("960x540") # 960x540,x是字母!self.nowSound = "Caidan" # 将now修改为音乐文件的文件名,没有后缀self.root.resizable(False,False)im = Image.open(r'./Gamedata/pic/UI_菜单.png')RGB = im.getpixel((650,100))[0:3] # 获取放置开始与继续游戏的像素RGBprint(RGB)im.close()Font = tf.Font(family="幼圆",size=30) # 设置字体newStart = tk.Label(text="开始游戏",font=Font, bg = RGB_to_Hex("%s,%s,%s" % (RGB[0], RGB[1], RGB[2])),fg="#FD3C5E")newStart.place(x=650,y=100)nextPlay = tk.Label(text="继续游戏",font=Font,bg=RGB_to_Hex("%s,%s,%s" % (RGB[0], RGB[1], RGB[2])),fg="#FD3C5E")nextPlay.place(x=650, y=300)newStart.bind("<Button-1>",self.Start)# nextPlay.bind()self.root.mainloop()
if __name__ == '__main__':Windows().Main()

好了,这就是开始界面的建立了,因为游戏还没有完全的开发,所有有些函数或者绑定现在先空在那里,接下来的代码会逐步的完善与优化,那,我们继续吧.

[Python的奇妙开发]用tkinter实现Galgame引擎的建立(一)相关推荐

  1. python能制作游戏吗_python制作galgame引擎(一)

    写这个项目的直接原因是最近推galgame推得有点过头,gal推过头的直接结果就是YY能力上涨,抱着"我也想写好玩的剧本"的轻率念头,也就开始了这个项目.不过从直接感觉来说,gal ...

  2. python游戏引擎开发二_python制作galgame引擎(二)

    上一篇主要涉及的其实是我个人的一些初期目标,以及解决方式.虽然提了提Parser类的实现,但是代码毕竟不是主要讨论的对象.而且很明显的,上一篇几乎与galgame制作无关-- 这一篇主要讨论的实现,中 ...

  3. python 图形化开发用什么模块_用python进行GUI开发的选择/python的GUI模块(图形界面开发库)...

    Python最大的特点就在于她的快速开发功能.作为一种胶水型语言,python几乎可以渗透在我们编程过程中的各个领域.这里我简单介绍一下用python进行gui开发的一些选择. 1.Tkinter T ...

  4. 用python进行GUI开发的选择

    来自网络 Python最大的特点就在于她的快速开发功能.作为一种胶水型语言,python几乎可以***在我们编程过程中的各个领域.这里我简单介绍一下用python进行gui开发的一些选择.  1.Tk ...

  5. python基础—图形开发

    python基础-图形开发 python图形界面开发 认识tkinter模块 窗体的基本设置方法 几何布局管理器 pack布局管理器 grid布局管理器 place布局管理器: 使用tkinter设计 ...

  6. 不是python中用于开发用户界面的第三方库-python界面 | Tkinter图形界面开发库

    0 写在前面 未经允许,不得转载,谢谢~~ 毕设要在现有的基础上做一个可视化的界面,所以趁机也学习一波如何用python实现图形界面的开发. 本文主要学习并整理了: 简要介绍用于python图形界面开 ...

  7. python界面设计-python图形化界面设计tkinter

    匿名用户 1级 2017-12-13 回答 python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是P ...

  8. python界面开发工具-python图形界面开发用什么

    作为Python开发者,你迟早都会用到图形用户界面来开发应用.本文将推荐一些 Python GUI 框架,希望对你有所帮助. Python 的 UI 开发工具包 Kivy(推荐学习:Python视频教 ...

  9. python困难_Python开发总感觉困难重重,可能是你没用上这些开发工具

    Python工具多.功能搞不清.看见就头大?不存在的!千锋广州Python小编都帮你整理好了,快来上这波Python工具功能的车! Tkinter Python默认的图形界面接口.Tkinter是一个 ...

最新文章

  1. 把激光雷达放在iPad上是怎样的体验?看到“测距仪”App的效果我震惊了
  2. c#Process.Start无法启动exe程序的问题
  3. tcp接口测试工具_【转载】接口测试和性能测试的区别
  4. posman mocks_使用Mocks进行需求驱动的软件开发
  5. mysql数据表内容_MySQL数据表
  6. 关于http协议的理解
  7. 坐顺风车出事故 乘客诉“嘀嗒出行”索赔
  8. systemtap原理及使用
  9. 用matlab进行边缘检测,利用MATLAB进行数字图像的边缘检测
  10. JQuery时间轴timeline插件的学习-Lateral On-Scroll Sliding with jQuery+technotarek / timeliner
  11. git学习笔记-(12-git后悔药-1)
  12. QT绘制同心扇形(Paintevent实现)
  13. 杨校老师项目之基于SSM企业物流快递配送管理系统
  14. 激光雷达SLAM三维建图、点云算法 点云处理 自己写的算法 没用任何现成的库文件
  15. 王阳明心学:无善无恶心之体,有善有恶意之动,知善知恶是良知,为善去恶是格物。...
  16. python Pystaller 将python文件打包成exe
  17. 2014中韩大数据论坛发现大数据的价值
  18. [论文翻译]数据集的domian问题:Intramodality Domain Adaptation Using Self Ensembling and Adversarial Training
  19. TSMaster1.1版本更新补丁
  20. vSphere 通过 vMotion 实现虚拟机热迁移

热门文章

  1. matlab 对曲线积分,matlab计算曲线积分并画出积分曲线
  2. vue 数字金额转大写方法
  3. ZZULIOJ 1180-1198结构体专题 参考代码
  4. 计算机格式化后数据恢复的基础,电脑格式化了怎么恢复?——格式化数据恢复教程...
  5. (转载)终极解密---房价,物价飞涨--分析得不错的文章
  6. ​ 斯科特·马特森​与MIMO发明者谈话节选
  7. 银行欺诈banking fraud
  8. BOSS直聘一键屏蔽外包公司,找工作面试专用JAVA工具
  9. 中国移动光猫怎么进网页服务器,中国移动光猫设置方法(192.168.1.1进不了光猫)...
  10. 如何解决“计算机意外地重新启动或遇到错误,Windows 安装无法继续。”