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

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

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

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

Q&A

解決済

1回答

475閲覧

self.rect.xなどに値が代入されない

sharomu

総合スコア17

Python 3.x

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

0グッド

0クリップ

投稿2017/10/09 08:31

壁のあたり判定をつけたいのですがflgだけ確認でき、値が代入されません。
解決方法、こうしたほうがいい点ありましたらお願いします

python

1import pygame 2from pygame.locals import * 3import sys 4import os 5SCR_HEIGHT = 480.0 6SCR_WIDTH = 640.0 7SCR_RECT = (int(SCR_WIDTH), int(SCR_HEIGHT)) 8 9PLAYER_IMG = [[0 for i in range(3)] for j in range(4)] 10IMG_NAME = ["player_down","player_left","player_right","player_up"] 11 12class test_play: 13 def __init__(self): 14 pygame.init() 15 screen = pygame.display.set_mode(SCR_RECT) 16 pygame.display.set_caption("テスト画面") 17 18 #画像 19 for j in range(4): 20 for i in range(3): 21 PLAYER_IMG[j][i] = pygame.image.load("image/"+IMG_NAME[j]+"_"+str(i)+".png").convert_alpha() 22 print("image/"+IMG_NAME[j]+"_"+str(i)+".png==>success") 23 #グループ作成 24 self.all = pygame.sprite.RenderUpdates() 25 Player.containers = self.all 26 Player() 27 clock = pygame.time.Clock() 28 while True: 29 clock.tick(60) 30 self.update() 31 self.draw(screen) 32 pygame.display.update() 33 self.key_handl() 34 35 def key_handl(self): 36 for event in pygame.event.get(): 37 if event.type == QUIT: 38 pygame.quit() 39 sys.exit() 40 if event.type == KEYDOWN: 41 if event.key == K_ESCAPE: 42 pygame.quit() 43 sys.exit() 44 def update(self): 45 self.all.update() 46 def draw(self, screen): 47 screen.fill((0,0,0)) 48 self.all.draw(screen) 49 50class Player(pygame.sprite.Sprite): 51 MOVE_SPEED = 5.0 52 53 def __init__(self): 54 pygame.sprite.Sprite.__init__(self, self.containers) 55 self.image = PLAYER_IMG[0][0] 56 self.rect = self.image.get_rect() 57 #小数点 58 self.x = float(self.rect.x) 59 self.y = float(self.rect.y) 60 self.move_x = 0.0 61 self.move_y = 0.0 62 self.walk = 0 63 64 def update(self): 65 key_handl = pygame.key.get_pressed() 66 print(self.rect) 67 #アクション 68 if key_handl[K_LEFT]: 69 self.image = PLAYER_IMG[1][int(self.walk)] 70 self.move_x = -self.MOVE_SPEED 71 elif key_handl[K_RIGHT]: 72 self.image = PLAYER_IMG[2][int(self.walk)] 73 self.move_x = self.MOVE_SPEED 74 else: 75 self.move_x = 0.0 76 if key_handl[K_UP]: 77 self.image = PLAYER_IMG[3][int(self.walk)] 78 self.move_y = -self.MOVE_SPEED 79 elif key_handl[K_DOWN]: 80 self.image = PLAYER_IMG[0][int(self.walk)] 81 self.move_y = self.MOVE_SPEED 82 83 else: 84 self.move_y = 0.0 85 86 if self.walk < 2: 87 self.walk += 0.2 88 else: 89 self.walk = 0 90 91 if self.rect.x < 0: 92 print("flg") 93 self.rect.x = 0.0 94 elif self.rect.x > SCR_WIDTH: 95 self.rect.x = SCR_WIDTH 96 if self.rect.y < 0: 97 self.rect.y = 0.0 98 elif self.rect.y > SCR_HEIGHT: 99 self.rect.y = SCR_HEIGHT 100 self.x += self.move_x 101 self.y += self.move_y 102 #intへ整形 103 self.rect.x = int(self.x) 104 self.rect.y = int(self.y) 105 106 107 108if __name__ == "__main__": 109 test_play()

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

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

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

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

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

guest

回答1

0

ベストアンサー

self.rect.xなどに値が代入されない

原因
self.rect.x = 0.0に値を設定後に、再度別の値でself.rect.xに値を代入して上書きしてます。

Python

1 if self.rect.x < 0: 2 print("flg") 3 self.rect.x = 0.0 4 elif self.rect.x > SCR_WIDTH: 5 self.rect.x = SCR_WIDTH 6 if self.rect.y < 0: 7 self.rect.y = 0.0 8 elif self.rect.y > SCR_HEIGHT: 9 self.rect.y = SCR_HEIGHT 10 self.x += self.move_x 11 self.y += self.move_y 12 #intへ整形 13 self.rect.x = int(self.x) #←ここ! 14 self.rect.y = int(self.y)

◆参考ソース

Python

1# -*- coding: utf-8 -*- 2import pygame 3from pygame.locals import * 4import sys 5import os 6SCR_HEIGHT = 480.0 7SCR_WIDTH = 640.0 8SCR_RECT = (int(SCR_WIDTH), int(SCR_HEIGHT)) 9 10PLAYER_IMG = [[0 for i in range(3)] for j in range(4)] 11IMG_NAME = ["player_down", "player_left", "player_right", "player_up"] 12 13 14class test_play(object): 15 def __init__(self): 16 pygame.init() 17 self.screen = pygame.display.set_mode(SCR_RECT) 18 pygame.display.set_caption("テスト画面") 19 20 #画像 21 for j, name in enumerate(IMG_NAME): 22 for i in range(3): 23 PLAYER_IMG[j][i] = pygame.image.load("image/" + name + "_"+str(i)+".png").convert_alpha() 24 print("image/" + name + "_" + str(i) + ".png==>success") 25 #グループ作成 26 self.all = pygame.sprite.RenderUpdates() 27 Player.containers = self.all 28 Player() 29 30 def mainloop(self): 31 """ 32 メインループ 33 :return: 34 """ 35 clock = pygame.time.Clock() 36 while True: 37 clock.tick(60) 38 self.update() 39 self.draw(self.screen) 40 pygame.display.update() 41 self.key_handl() 42 43 def key_handl(self): 44 for event in pygame.event.get(): 45 if event.type == QUIT: 46 self.on_application_exit(1) 47 if event.type == KEYDOWN: 48 if event.key == K_ESCAPE: 49 self.on_application_exit(1) 50 51 def on_application_exit(self, code): 52 """ 53 アプリケーション終了処理 54 :param code: key_handlから呼び出し時:1 55 :return: 56 """ 57 pygame.quit() 58 sys.exit() 59 60 def update(self): 61 self.all.update() 62 63 def draw(self, screen): 64 screen.fill((0,0,0)) 65 self.all.draw(screen) 66 67 68class Player(pygame.sprite.Sprite): 69 MOVE_SPEED = 5.0 70 71 def __init__(self): 72 pygame.sprite.Sprite.__init__(self, self.containers) 73 self.image = PLAYER_IMG[0][0] 74 self.rect = self.image.get_rect() 75 #小数点 76 self.x = float(self.rect.x) 77 self.y = float(self.rect.y) 78 self.move_x = 0.0 79 self.move_y = 0.0 80 self.walk = 0 81 82 def update(self): 83 key_handl = pygame.key.get_pressed() 84 #print(self.rect) 85 #アクション 86 if key_handl[K_LEFT]: 87 self.image = PLAYER_IMG[1][int(self.walk)] 88 self.move_x = -self.MOVE_SPEED 89 elif key_handl[K_RIGHT]: 90 self.image = PLAYER_IMG[2][int(self.walk)] 91 self.move_x = self.MOVE_SPEED 92 else: 93 self.move_x = 0.0 94 if key_handl[K_UP]: 95 self.image = PLAYER_IMG[3][int(self.walk)] 96 self.move_y = -self.MOVE_SPEED 97 elif key_handl[K_DOWN]: 98 self.image = PLAYER_IMG[0][int(self.walk)] 99 self.move_y = self.MOVE_SPEED 100 101 else: 102 self.move_y = 0.0 103 104 if self.walk < 2: 105 self.walk += 0.2 106 else: 107 self.walk = 0 108 109 if self.rect.x < 0: 110 print("flg") 111 self.move_x = self.MOVE_SPEED / 2 112 elif self.rect.x > SCR_WIDTH: 113 self.rect.x = SCR_WIDTH # if文と代入文は画像サイズを意識して修正する必要があります。 114 if self.rect.y < 0: 115 self.move_y = self.MOVE_SPEED / 2 116 elif self.rect.y > SCR_HEIGHT: 117 self.rect.y = SCR_HEIGHT # この部分も同様です。 118 self.x += self.move_x 119 self.y += self.move_y 120 #intへ整形 121 self.rect.x = int(self.x) 122 self.rect.y = int(self.y) 123 124 125def main(): 126 t = test_play() 127 t.mainloop() 128 129 130if __name__ == "__main__": 131 main() 132

◆こうしたほうがいい点
1,一つのクラスでいろいろな事を行ってるので、複数のクラスに分けたほうが管理しやすいと思います。
例えば、pygame.image.loadはResourcesクラスを新たに作成し、そこで管理するようにするとか。
2,デバックするのが楽になるので、IDE(統合開発環境)を導入していないなら、試しに導入してみてはー。
Download PyCharmのCommunity版。

投稿2017/10/09 13:07

編集2017/10/09 13:14
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問