前提・実現したいこと
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日ほどでわからないことが多いので助けていただくと幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。