【pyxel】時間経過によりy座標を変化させたい。
解決したいこと
Python(pyxel)でインベーダーゲーム(シューティングゲーム)を作っています。
スペースキーを押すことでレーザーがPlayerの頭上に発生し、画面上方にまっすぐ飛んでいく機能を実装中なのですが、発生したレーザーがその場ですぐに消えてしまいます。ちなみにエラーメッセージは出ていません。
laserに関する記述を色々試行錯誤している中で、コードの最後の部分(下記)のself.player_y-2の部分(レーザーの始点のy座標)を時間経過により3ずつ小さくなるように記述すれば良いのではと考えました。
ですが、試行錯誤してもどうすれば良いか分からず困っています。
Python初心者の拙い質問で大変申し訳ないですが、皆様のアドバイスを頂きたいです。よろしくお願い致します。
# ======= draw Lasers ========
for laser in self.Lasers:
pyxel.rect(self.player_x+9, self.player_y-2, 2, 2,10)
発生している問題・エラー
出ているエラーメッセージを入力(無し)
該当するソースコード
import pyxel
WINDOW_H = 120
WINDOW_W = 160
PLAYER_H = 20
PLAYER_W = 19
laser_list = []
class Vec2:
def __init__(self, x, y):
self.x = x
self.y = y
class player:
def __init__(self, img_id):
self.pos = Vec2(0, 0)
self.vec = 0
self.img_player = img_id
def update(self, x, y, dy):
self.pos.x = x
self.pos.y = y
self.vec = dy
class kadai:
def __init__(self,img_id):
self.pos = Vec2(0, 0)
self.img_player = img_id
def update(self, x, y):
self.pos.x = x
self.pos.y = y
class test:
def __init__(self,img_id):
self.pos = Vec2(0, 0)
self.img_player = img_id
def update(self, x, y):
self.pos.x = x
self.pos.y = y
class Laser:
def __init__(self):
self.pos = Vec2(0, 0)
self.vec = 0
self.size = 2
self.speed = 3
self.color = 10 # 0~15
def update(self, x, y, dy, size, color):
self.pos.x = x
self.pos.y = y
self.vec = dy
self.size = size
self.color = color
class App:
def __init__(self):
self.IMG_ID0 = 0
self.IMG_ID1 = 1
# self.IMG_ID2 = 2
pyxel.init(160, 120, caption="Students Wars")
pyxel.image(0).load(0,0,"./player_a-2.png")
#Starting Point
self.player_x = 70
self.player_y = 101
# make instance
self.mplayer = player(self.IMG_ID1)
self.Lasers = []
pyxel.run(self.update, self.draw)
def update(self):
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
self.update_player()
# ====== ctrl Laser ======
if pyxel.btnp(pyxel.KEY_SPACE):
new_laser = Laser()
new_laser.update(self.mplayer.pos.x + PLAYER_W/2 , self.mplayer.pos.y + PLAYER_H/2 ,self.mplayer.vec, new_laser.size, new_laser.color)
self.Lasers.append(new_laser)
laser_count = len(self.Lasers)
for i in range(laser_count): #Repeat copying
if 0 < self.Lasers[i].pos.y < WINDOW_H:
# Laser update
self.Lasers[i].update(self.Lasers[i].pos.x, self.Lasers[i].pos.y - self.Lasers[i].speed, self.Lasers[i].vec, self.Lasers[i].size, self.Lasers[i].color)
else:
del self.Lasers[i]
break
def update_player(self):
if pyxel.btn(pyxel.KEY_LEFT) or pyxel.btn(pyxel.GAMEPAD_1_LEFT):
self.player_x = max(self.player_x - 2, 0)
if pyxel.btn(pyxel.KEY_RIGHT) or pyxel.btn(pyxel.GAMEPAD_1_RIGHT):
self.player_x = min(self.player_x + 2, pyxel.width - 20)
if pyxel.btn(pyxel.KEY_UP) or pyxel.btn(pyxel.GAMEPAD_1_UP):
self.player_y = max(self.player_y - 2, 0)
if pyxel.btn(pyxel.KEY_DOWN) or pyxel.btn(pyxel.GAMEPAD_1_DOWN):
self.player_y = min(self.player_y + 2, pyxel.height - 19 )
def update_laser(self):
self.laser_y -= self.laser_speed
def draw(self):
pyxel.cls(0)
pyxel.blt(self.player_x, self.player_y, 0, 0, 0,128,128,0)
# ======= draw Lasers ========
for laser in self.Lasers:
pyxel.rect(self.player_x+9, self.player_y-2, 2, 2,10)
App()
0