RinAkO83800771
@RinAkO83800771 (sakura mochi)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【pyxel】時間経過によりy座標を変化させたい。

解決したいこと

Python(pyxel)でインベーダーゲーム(シューティングゲーム)を作っています。
スペースキーを押すことでレーザーがPlayerの頭上に発生し、画面上方にまっすぐ飛んでいく機能を実装中なのですが、発生したレーザーがその場ですぐに消えてしまいます。ちなみにエラーメッセージは出ていません。
laserに関する記述を色々試行錯誤している中で、コードの最後の部分(下記)のself.player_y-2の部分(レーザーの始点のy座標)を時間経過により3ずつ小さくなるように記述すれば良いのではと考えました。
ですが、試行錯誤してもどうすれば良いか分からず困っています。
Python初心者の拙い質問で大変申し訳ないですが、皆様のアドバイスを頂きたいです。よろしくお願い致します。

スクリーンショット 2021-06-04 22.22.54.png
スクリーンショット 2021-06-04 22.23.08.png

 # ======= 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

1Answer

draw関数は、pyxel.clsで画面クリアした後、描画するだけ(消して書いて消して書いてを繰り返す)なので、呼ばれるたびに座標を変えてあげれば動くように見えます。今回の場合、Y座標を変化させれば良いです。

0Like

Your answer might help someone💌