質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

1回答

2754閲覧

Canvasの地色のみを透明にしたい

tomo1998

総合スコア34

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

1グッド

0クリップ

投稿2019/01/05 07:50

編集2019/01/10 12:16

前提・実現したいこと

今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のモジュールで背景が透明なスプライトを作ることは可能なのでしょうか?

naikoru👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

RGBAの情報がある画像であれば透過させて表示できるはずです。

下記ページなどが参考になりませんか。

python - How do I make Tkinter support PNG transparency? - Stack Overflow

投稿2019/01/05 08:33

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomo1998

2019/01/05 09:56

RGBA・・・調べてみたら、色を表す以外RGBに透過色が記載されている情報を含んだ画像、の事ですね? 申し訳ないのですが、この方法じゃダメなのです。 確かに画像に透明色があれば、透過されている部分から、画像下にある他の画像を見れたりできます。 1つのCanvas上で透明色がある画像を2つ重ねれば、この方法では問題ありません。 しかし・・・ 分かりにくかったらすいませんが、ちょっと文章で示しますね。 右側が人から見た方向で・・・ Canvasが1つの場合は・・・ CanvasA-画像1(透過色あり)-画像2(透過色あり) と、なるので画像1と2がCanvasAを覆っていない場所はCanvasAの色が表示されています しかし、自分がやろうとしているのは・・・ Canvasを2つ以上重ねたいので・・・ CanvasA-画像1(透過色あり)-CanvasB-画像2(透過色あり) といった感じなのです。例え画像2が透過されてても、CanvasBの地色が画像1の上をすべてをカバーしてしまい、画像1が見えなくなってしまいます。 どうかお力を貸してください m(_ _)m
tomo1998

2019/01/05 15:26

うーん・・・試してみたのですが、うまく行きません( ̄▽ ̄;) ちょっとコードを上の方に挙げてきますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問