前提・実現したいこと
今tkinterのCanvasを使ってゲームを作っています。
しかし1つ問題があり、canvasではオブジェクト同士が重なると、新しく作成されたオブジェクトのほうが上の様に来るようになります。
例えば、ゲーム内の画面では、背景の上にキャラクターが来て、キャラクターの前に手前側オブジェクトが来る、といった仕組みになっているのでこれを作成しようと思えば・・・
canvas=tk.Cancas.....
ゲームの背景=canvas.create_image.....
キャラクター=canvas.create_image.....
手前側オブジェクト=canvas.create_image.....
といった順番で作成されます。
しかし、ゲーム中で新しいキャラクターを登場させることになれば、それは手前側オブジェクトよりも新しく作成されることになるので、その新しいキャラクターとオブジェクトが重なったら、キャラクターが手前側に来てしまいます。
つまり、
手前側オブジェクト=canvas.create_image.....
の後で
キャラクター2=canvas.create_image.....
をすると、キャラクター2が手前側オブジェクトの前に来てしまう。
該当のソースコード
python
1import tkinter as tk 2 3class App(object): 4 def GUI(self): 5 root=tk.Tk() 6 root.geometry("300x300") 7 img001=tk.PhotoImage(file="picture001.png") 8 img002=tk.PhotoImage(file="picture002.png") 9 10 #奥側のCanvas 11 Background_Layer=tk.Canvas(width=400, height=400) 12 Background_Layer.place(x=0,y=0) 13 #手前のCanvas 14 Floor_Layer=tk.Canvas(width=400, height=400) 15 Floor_Layer.place(x=0,y=0) 16 17 #奥側のCanvasに書くもの 18 Background_Img=Background_Layer.create_image(220, 220, image=img001) 19 #手前のCanvasに書くもの 20 item_Img=Floor_Layer.create_image(20, 20, image=img002) 21 22 #id = Floor_Layer.create_bitmap(0, 0,bitmap=img002)うまく行かなかった・・・ 23 24 root.mainloop() 25 26 27app=App() 28app.GUI() 29
試したこと
そこでこの問題を解決するには、1つのCanvas上に画像を生成するのではなく、ゲーム背景専用、キャラークター専用そして手前側オブジェクト専用のCanvasを作成して、Canvasを重ね合わせて、それぞれのオブジェクト(ゲーム背景、キャラクター、オブジェクト)をそれぞれの対応するCanvas(ゲーム背景専用、キャラークター専用そして手前側オブジェクト専用)で作成すれば問題は解決できると思うんです。
つまり、1つのCanvasの上にすべての画像を作成しようとすると、新しいもの順に表示されてしまうけど
それぞれのCanvasで新しい画像を生成しても、その上にはほかのCanvasがあるからしっかりと期待した順番に表示される という感じになると思うんです。
Back_Ground_Layer=tk.Cancas.....
Character_Layer=tk.Cancas.....
Object_Layer=tk.Cancas.....
ゲームの背景=Back_Ground_Layer.create_image.....
キャラクター=Character_Layer.create_image.....
手前側オブジェクト=Object_Layer.create_image.....
しかしそこで他の問題がありまして・・・
実は、Canvasを作成するときには、Canvasの地色も設定しないといけないのですが、この地色が問題なのです。
地色を透明に出来れば、下に来るCanvasのアイテムも見れるようになるのですが、透明になれなければ下のCanvasを覆いかぶさなってしまいます。
そこで、Canvasの地色を透明にする方法を探しているのですが・・・どうすればいいでしょうか?
また、他の解決方法などはありますでしょうか?
もう少し調べてみたところ、外国語のサイトでちらっと、pygameモジュールを使って透明なスプライトが作れる、といったページを見かけたのですが、tkinterで背景だけが透明なスプライトを作成するのは無理なのでしょうか?
また、pygameのモジュールで背景が透明なスプライトを作ることは可能なのでしょうか?

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/05 09:56
2019/01/05 11:20
2019/01/05 15:26