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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1343閲覧

pygame でobjectが描画されない

siber

総合スコア4

Pygame

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/11/09 05:19

編集2021/11/09 11:41

前提・実現したいこと

pythonで簡単なゲームを作っています。
pygame zeroを使用しコードを書いています。
playerから物(ほね)を投げるコードを書きたいと思っています。(シューティングのようなもの)

発生している問題・エラーメッセージ

骨をplayerから投げることを実現したいのですが座標が更新されず描画されません。
一度playerの座標に表示され、消えてしまいます。

該当のソースコード

以下が該当コード部分です。

python

1class Obj(Actor): 2 def __init__(self, x, y, angle, num): 3 Actor.__init__(self, dogs[num].imagename, (x, y)) 4 self.hp = dogs[num].hp 5 self.num = num 6 self.count = 0 7 self.angle = angle 8 9class Bone(Obj): 10 def update(self): 11 self.x, self.y = shootBone(self.pos, self.angle, 8) 12 hitbox = Rect((self.x-15, self.y-15), (30, 30)) 13 for sp in objects: 14 if sp.hp == 99: 15 continue 16 if sp.colliderect(hitbox): 17 self.x = OUTSIDE 18 sp.hp -= 1 19 break 20 21def shootBone(pos, angle, speed): 22 # 角度と速さから次の座標を返す 23 x, y = pos 24 rad = math.radians(angle) 25 x += speed * (math.cos(rad)) 26 y += speed * (math.sin(rad)) 27 28 return int(x), int(y) 29 30def draw(): 31 # 描画部分 32 33 screen.clear() 34 if titlemode == True: 35 screen.draw.text("game start", 36 left=150, top=240, fontsize=64, color="YELLOW") 37 else: 38 for sp in objects: 39 sp.draw() 40 if gameover: 41 screen.draw.text("game over", 42 left=150, top=240, fontsize=64, color="YELLOW") 43

コード全体

python

1import pgzrun 2import random 3import time 4import math 5 6WIDTH = 500 7HEIGHT = 500 8score = 0 9OUTSIDE = 1000 10gameover = False 11titlemode = True 12start = 0 13 14 15class Charclass: 16 def __init__(self, filename, hp): 17 self.imagename = filename 18 self.hp = hp 19 20 21char = [] 22# キャラの追加 23char.append(Charclass("human.png", 999)) 24char.append(Charclass("dog.png", 1)) 25char.append(Charclass("bone.png", 1)) 26 27 28class Obj(Actor): 29 # objectの基本クラス 30 def __init__(self, x, y, angle, num): 31 Actor.__init__(self, char[num].imagename, (x, y)) 32 self.hp = char[num].hp 33 self.num = num 34 self.count = 0 35 self.angle = angle 36 37 38class Dog(Obj): 39 #犬クラス 40 def update(self): 41 # 円形に動く 42 rad = math.radians(self.count - 100) 43 self.y = (HEIGHT / 2) + (math.sin(rad) * 200) 44 self.x = (HEIGHT / 2) + (math.cos(rad) * 200) 45 46 47class Bone(Obj): 48 # 骨クラス 49 def update(self): 50 self.x, self.y = shootBone(self.pos, self.angle, 8) 51 hitbox = Rect((self.x-15, self.y-15), (30, 30)) 52 for sp in objects: 53 if sp.hp == 999: # playerなら無視 54 continue 55 if sp.colliderect(hitbox):# player以外で当たっていれば 56 self.x = OUTSIDE 57 sp.hp -= 1 58 break 59 60 61class Player(Obj): 62 def update(self): 63 # キーボード操作 64 if keyboard.up: 65 self.y -= 4 66 if keyboard.down: 67 self.y += 4 68 if keyboard.left: 69 self.x -= 4 70 if keyboard.right: 71 self.x += 4 72 if self.x < 35: 73 self.x = 35 74 if self.y < 35: 75 self.y = 35 76 if self.x > (WIDTH-35): 77 self.x = WIDTH-35 78 if self.y > (HEIGHT-35): 79 self.y = HEIGHT-35 80 if keyboard.space and (self.count % 16) == 0: 81 # 骨を投げる 82 objects.append(Bone(self.x, self.y, 180, 2)) 83 objects.append(Bone(self.x, self.y, 0, 2)) 84 objects.append(Bone(self.x, self.y, -90, 2)) 85 86 87def shootBone(pos, angle, speed): 88 x, y = pos 89 rad = math.radians(angle) 90 x += speed * (math.cos(rad)) 91 y += speed * (math.sin(rad)) 92 93 return int(x), int(y) 94 95 96objects = [Player(400, 400, 0, 0), 97 Dog(20, 20, 0, 1)] 98 99 100def draw(): 101 102 screen.clear() 103 # screen.draw.text("Time:" + str(start), (10, 10), color="white") 104 if titlemode == True: 105 screen.draw.text("dog game", 106 left=150, top=240, fontsize=64, color="YELLOW") 107 else: 108 for sp in objects: 109 sp.draw() 110 if gameover: 111 screen.draw.text("game over", 112 left=150, top=240, fontsize=64, color="YELLOW") 113 114 115def update(): 116 global titlemode, start, objects, gameover 117 start += 1 118 119 if titlemode: 120 if keyboard.space: 121 titlemode = False 122 123 if gameover: 124 return 125 126 for sp in objects: 127 if start == 1000: 128 gameover = True 129 sp.update() 130 sp.count += 1 131 if sp.hp <= 0: 132 sp.x = OUTSIDE 133 if sp.x < -35 or sp.x > (HEIGHT+35) or sp.y < -35 or sp.y > (WIDTH+35): 134 objects.remove(sp) 135 136 137pgzrun.go() 138

試したこと

骨を投げた後の座標をprintしてみたのですが1回しか表示されませんでした。骨はobjectを入れるリストには入っていました。

pygame zero については触って2日ほどでわからないことが多いので助けていただくと幸いです。

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

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

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

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

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

guest

回答2

0

犬か人間かを判定する審議地を追加で入れることで消えなくなりました。(なぜだかはわかりません)

投稿2021/11/09 12:12

siber

総合スコア4

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

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

0

自己解決

犬か人間かを判定する審議地を追加で入れることで消えなくなりました。(なぜだかはわかりません)

投稿2021/11/09 11:50

siber

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問