日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/15 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Python的奇妙开发]用tkinter实现Galgame引擎的建立(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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引擎的建立(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。