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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1534閲覧

【python】イラストアプリの色替えにバグが出る

Gluek731

総合スコア26

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2015/11/08 09:54

編集2015/11/10 01:00

始めまして、python もといpygameを用いたプログラミングについてご質問があり、書き込ませていただきました。

pygameを用いたイラストアプリケーションを下記のサイトを参考にして作成しているのですが
マウスイベントの作成

色を変更すると既にキャンバスに描いた色も変わってしまうバグが治らず、苦戦しております。

python

1#!/usr/bin/env python 2# _*_ coding: utf-8 _*_ 3 4import pygame 5from pygame.locals import * 6import sys 7 8####ウィンドウサイズ横640縦480#### 9SCREEN_SIZE = (640, 480) 10 11pygame.init() #初期化 12screen = pygame.display.set_mode(SCREEN_SIZE) 13pygame.display.set_caption("お絵かき") #タイトル名 14 15####素材の追加#### 16#背景 17backImg = pygame.image.load("canvas.png").convert() 18#色 19blackImg = pygame.image.load("circle_black.png").convert_alpha() 20redImg = pygame.image.load("circle_red.png").convert_alpha() 21yellowImg = pygame.image.load("circle_yellow.png").convert_alpha() 22mizuiroImg = pygame.image.load("circle_mizuiro.png").convert_alpha() 23perplueImg = pygame.image.load("circle_perplue.png").convert_alpha() 24blueImg = pygame.image.load("circle_blue.png").convert_alpha() 25greenImg = pygame.image.load("circle_green.png").convert_alpha() 26#カラーアイコン 27blackIcon = pygame.image.load("block_black.png").convert_alpha() 28redIcon = pygame.image.load("block_red.png").convert_alpha() 29yellowIcon = pygame.image.load("block_yellow.png").convert_alpha() 30mizuiroIcon = pygame.image.load("block_mizuiro.png").convert_alpha() 31perplueIcon = pygame.image.load("block_perplue.png").convert_alpha() 32blueIcon = pygame.image.load("block_blue.png").convert_alpha() 33greenIcon = pygame.image.load("block_green.png").convert_alpha() 34whiteIcon = pygame.image.load("block_white.png").convert_alpha() 35#ボタン 36changebutton = pygame.image.load("button.png").convert_alpha() 37 38#色と太さ 39color_list = [blackImg, redImg, yellowImg, mizuiroImg, perplueImg, 40 blueImg, greenImg] 41 42color_Icon = [blackIcon, redIcon, yellowIcon, mizuiroIcon, perplueIcon, 43 blueIcon, greenIcon, whiteIcon] 44 45cur_pos = (0,0) #色の位置 46pythons_pos = [] 47c = 5 #色番号を格納する変数と初期色 48 49 50####描画ループ処理#### 51while True: 52 53 screen.blit(backImg,(0,0)) #背景 54 screen.blit(color_Icon[0],(30,6)) #ボタンの位置 55 screen.blit(color_Icon[1],(60,6)) 56 screen.blit(color_Icon[2],(90,6)) 57 screen.blit(color_Icon[3],(120,6)) 58 screen.blit(color_Icon[4],(150,6)) 59 screen.blit(color_Icon[5],(180,6)) 60 screen.blit(color_Icon[6],(210,6)) 61 screen.blit(color_Icon[7],(240,6)) 62 63 #描画処理 64 mouse_pressed = pygame.mouse.get_pressed() 65 if mouse_pressed[0]: 66 #メニューに色が及ばないようにする 67 if y >= 30: 68 x, y = pygame.mouse.get_pos() 69 x -= color_list[c].get_width() / 2 70 y -= color_list[c].get_height() / 2 71 pythons_pos.append((x,y)) 72 73 #黒変更 74 if x >= 30 and x <= 50 and y >= 6 and y <= 26: 75 c = 0 76 77 #赤変更 78 if x >= 60 and x <= 80 and y >= 6 and y <= 26: 79 c = 1 80 81 #黄変更 82 if x >= 90 and x <= 110 and y >= 6 and y <=26: 83 c = 2 84 85 #マウスの位置に色を追従させる 86 x, y = pygame.mouse.get_pos() 87 #メニュー領域に色が追従しないようにする 88 if y >= 35: 89 x -= color_list[c].get_width() / 2 90 y -= color_list[c].get_height() / 2 91 cur_pos = (x,y) 92 93 #キャンパスに色を落とす 94 screen.blit(color_list[c], cur_pos) 95 for i, j in pythons_pos: 96 screen.blit(color_list[c],(i,j)) 97 pygame.display.update() 98 99 #終了処理 100 for event in pygame.event.get(): 101 if event.type == QUIT: 102 sys.exit() 103 104

どなたかわかる方は回答して頂けると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

x, y = pygame.mouse.get_pos() の位置が変だとは思いますが、それは一先ず置いておいて・・・

pythons_pos.append((x,y)) を pythons_pos.append((x,y,c)) に
for i, j in pythons_pos: を for i, j,d in pythons_pos: に
screen.blit(color_list[c],(i,j)) を screen.blit(color_list[d],(i,j)) に
それぞれ変更すると、色の上書きは無くなるのではないでしょうか。

上記で何が変わるか?ですが、
1個目の変更で、pythons_pos リストに 位置だけ(x,y) を格納していたのを、位置と色(x,y,c)を格納するように変更しました。
2個目の変更で、for 文を位置(i,j)を取り出していたのを、位置と色(i,j,d)を取り出すように変更しました。
3個目の変更で、blitに与える色が 全部共通のc だったのを 上記変更で出てくる色dを与えるように変更しました。

投稿2015/11/10 07:21

編集2015/11/10 07:24
hiro-k

総合スコア902

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

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

Gluek731

2015/11/10 07:39

出来ました!  pygameの扱いになれてなくてpythons_posに位置以外の値も入れられるのを初めて知りました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問