前提・実現したいこと
Python(pyxel)でインベーダーゲーム(シューティングゲーム)を作っています。
スペースキーを押すことでレーザーが発生し、画面上方にまっすぐ飛んでいく機能を実装中なのですが、発生したレーザーがその場ですぐに消えてしまいます。ちなみにエラーメッセージは出ていません。
laserに関する記述を色々試行錯誤しているのですが、どうしても「上方に飛ばす」という動作になりません。アドバイスを頂きたいです。
発生している問題・エラーメッセージ
エラーメッセージ(無し)
該当のソースコード
Python
1import pyxel 2 3WINDOW_H = 120 4WINDOW_W = 160 5PLAYER_H = 20 6PLAYER_W = 19 7 8class Vec2: 9 def __init__(self, x, y): 10 self.x = x 11 self.y = y 12 13class player: 14 def __init__(self, img_id): 15 self.pos = Vec2(0, 0) 16 self.vec = 0 17 self.img_player = img_id 18 19 def update(self, x, y, dy): 20 self.pos.x = x 21 self.pos.y = y 22 self.vec = dy 23 24class kadai: 25 def __init__(self,img_id): 26 self.pos = Vec2(0, 0) 27 self.img_player = img_id 28 29 def update(self, x, y): 30 self.pos.x = x 31 self.pos.y = y 32 33class test: 34 def __init__(self,img_id): 35 self.pos = Vec2(0, 0) 36 self.img_player = img_id 37 38 def update(self, x, y): 39 self.pos.x = x 40 self.pos.y = y 41 42class Laser: 43 def __init__(self): 44 self.pos = Vec2(0, 0) 45 self.vec = 0 46 self.size = 2 47 self.speed = 3 48 self.color = 10 # 0~15 49 50 def update(self, x, y, dy, size, color): 51 self.pos.x = x 52 self.pos.y = y 53 self.vec = dy 54 self.size = size 55 self.color = color 56 57class App: 58 def __init__(self): 59 self.IMG_ID0 = 0 60 self.IMG_ID1 = 1 61 # self.IMG_ID2 = 2 62 63 pyxel.init(160, 120, caption="Students Wars") 64 pyxel.image(0).load(0,0,"./player_a-2.png") 65 66 #Starting Point 67 self.player_x = 70 68 self.player_y = 101 69 70 # make instance 71 self.mplayer = player(self.IMG_ID1) 72 self.Lasers = [] 73 74 pyxel.run(self.update, self.draw) 75 76 def update(self): 77 if pyxel.btnp(pyxel.KEY_Q): 78 pyxel.quit() 79 self.update_player() 80 81 # ====== ctrl Laser ====== 82 if pyxel.btnp(pyxel.KEY_SPACE): 83 new_laser = Laser() 84 new_laser.update(self.mplayer.pos.x + PLAYER_W/2 , 85 self.mplayer.pos.y + PLAYER_H/2 , 86 self.mplayer.vec, new_laser.size, new_laser.color) 87 self.Lasers.append(new_laser) 88 89 laser_count = len(self.Lasers) 90 for i in range(laser_count): 91 if 0 < self.Lasers[i].pos.x and self.Lasers[i].pos.x < WINDOW_W: 92 # Laser update 93 self.Lasers[i].update(self.Lasers[i].pos.x, 94 self.Lasers[i].pos.y - self.Lasers[i].speed, self.Lasers[i].vec, self.Lasers[i].size, self.Lasers[i].color) 95 else: 96 del self.Lasers[i] 97 break 98 99 def update_player(self): 100 if pyxel.btn(pyxel.KEY_LEFT) or pyxel.btn(pyxel.GAMEPAD_1_LEFT): 101 self.player_x = max(self.player_x - 2, 0) 102 103 if pyxel.btn(pyxel.KEY_RIGHT) or pyxel.btn(pyxel.GAMEPAD_1_RIGHT): 104 self.player_x = min(self.player_x + 2, pyxel.width - 20) 105 106 if pyxel.btn(pyxel.KEY_UP) or pyxel.btn(pyxel.GAMEPAD_1_UP): 107 self.player_y = max(self.player_y - 2, 0) 108 109 if pyxel.btn(pyxel.KEY_DOWN) or pyxel.btn(pyxel.GAMEPAD_1_DOWN): 110 self.player_y = min(self.player_y + 2, pyxel.height - 19 ) 111 112 def draw(self): 113 pyxel.cls(0) 114 pyxel.blt(self.player_x, self.player_y, 0, 0, 0,128,128,0) 115 116 117 # ======= draw player ======== 118 if self.mplayer.vec > 0: 119 pyxel.blt(self.mplayer.pos.x, self.mplayer.pos.y, self.IMG_ID1, 0, 0, -PLAYER_W, PLAYER_H, 5) 120 else: 121 pyxel.blt(self.mplayer.pos.x, self.mplayer.pos.y, self.IMG_ID1, 0, 0, PLAYER_W, PLAYER_H, 5) 122 123 # ====== draw Lasers ====== 124 for laser in self.Lasers: 125 pyxel.rect(self.player_x+9, self.player_y-2, laser.pos.x-7, laser.pos.y-5,10) 126 127App()
試したこと
class Laserのdef update()の中身のself.pos.yを、self.pos.y - self.Lasers[i].speedと置いてみましたが、[i]が使えないとエラーが出ました。(下記)
Python
1class Laser: 2 def __init__(self): 3 self.pos = Vec2(0, 0) 4 self.vec = 0 5 self.size = 2 6 self.speed = 3 7 self.color = 10 # 0~15 8 9 def update(self, x, y, dy, size, color): 10 self.pos.x = x 11 self.pos.y = y 12 self.vec = dy 13 self.size = size 14 self.color = color
自分の中では、おそらく訂正すべき箇所はdef updateの中身だろうと予想しておりますが、能力不足がゆえ成功できませんでしたので、皆様のご意見を頂きたいです。
補足情報(FW/ツールのバージョンなど)
ちなみにまだkadaiやtestに関する記述は未完成ですので、ご了承ください。
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/04 12:30
2021/06/04 16:02
2021/06/04 16:31
2021/06/04 21:48 編集
2021/06/04 19:24
2021/06/05 06:06
2021/06/05 06:25
2021/06/05 06:46
2021/06/05 13:12
2021/06/05 13:21
2021/06/05 23:49