Galgame開發之前的準備
前排提示:學習這個之前,你可以先去學習一下tkinter
(ACG圈的朋友可以選擇跳過這里…)
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來保存,并且使用了列表來存儲劇本,以下便是列表的格式:
[[{ "imgae":"客廳", "music":"歡快的", "title":"第一章" },[["人物名稱","對白"], ["人物名稱","對白"],["無","對白"], ["音樂","悲傷的"], ["人物",[['開始','begin'],['結束','傷心']]] ]]
]
[[{"image":"街道","title":"第二章第一節","music":"快樂的"},[ ["人物",'對白'],["人物名稱","對白"],["人物名稱","對白"],["人物名稱","對白"],['end','end_1',':普通結局'] ]]
],
[]
'''展示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
="幼圓")
tkinter
.Label
(text
= "開始",font
=ft
).pack
()
- json 用于序列化與反序列化的IO操作(說白了就是數據的讀寫操作)
- pygame 在這個程序中pygame 只處于配角的狀態,作用就是音樂的播放,在這里,展示一下pygame音樂播放的能力:
import pygame
pygame
.init
()
sound_yinxiao
= pygame
.mixer
.Sound
(r
'./Gamedata/adi/Caidan.wav')
sound_yinxiao
.play
()
sound_yinxiao
.stop
()
實現菜單窗口的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
): rgb
= tmp
.split
(',') strs
= '#'for i
in rgb
:num
= int(i
) strs
+= str(hex(num
))[-2:].replace
('x', '0').upper
()return strs
class Windows(): def __init__(self
):self
.Sound
= None self
.nowSound
= None self
.Sound_yinxiao
= None def Main(self
):self
.root
= tk
.Tk
()self
.Sound
= pygame
.mixer
.Sound
('./Gamedata/adi/Caidan.wav') self
.Sound
.play
() self
.Background
=tk
.PhotoImage
(file=r
'./Gamedata/pic/UI_菜單.png')tk
.Label
(image
=self
.Background
).place
(relheight
=1, relwidth
=1) self
.root
.title
("這是窗口的游戲名稱")self
.root
.geometry
("960x540") self
.nowSound
= "Caidan" self
.root
.resizable
(False,False)im
= Image
.open(r
'./Gamedata/pic/UI_菜單.png')RGB
= im
.getpixel
((650,100))[0:3] print(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
() def RGB_to_Hex(tmp
): rgb
= tmp
.split
(',') strs
= '#'for i
in rgb
:num
= int(i
) strs
+= str(hex(num
))[-2:].replace
('x', '0').upper
()return strs
class Windows(): def __init__(self
):self
.Sound
= None self
.nowSound
= None self
.Sound_yinxiao
= None 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
= pa
if EN
== None:EN
= paself
.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):self
.XunWen
(QUE
="是否開始新游戲?",NoQ
="不可!",YesQ
="允許!") def Main(self
):self
.root
= tk
.Tk
()self
.Sound
= pygame
.mixer
.Sound
('./Gamedata/adi/Caidan.wav') self
.Sound
.play
() self
.Background
=tk
.PhotoImage
(file=r
'./Gamedata/pic/UI_菜單.png')tk
.Label
(image
=self
.Background
).place
(relheight
=1, relwidth
=1) self
.root
.title
("這是窗口的游戲名稱")self
.root
.geometry
("960x540") self
.nowSound
= "Caidan" self
.root
.resizable
(False,False)im
= Image
.open(r
'./Gamedata/pic/UI_菜單.png')RGB
= im
.getpixel
((650,100))[0:3] print(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
)self
.root
.mainloop
()
if __name__
== '__main__':Windows
().Main
()
好了,這就是開始界面的建立了,因為游戲還沒有完全的開發,所有有些函數或者綁定現在先空在那里,接下來的代碼會逐步的完善與優化,那,我們繼續吧.
總結
以上是生活随笔為你收集整理的[Python的奇妙开发]用tkinter实现Galgame引擎的建立(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。