0

私は、Python の Pygame を Livewires を介して実行する単純な卓球ゲームをプログラミングしています。質問と、ここにいる全員が livewires や pygame に精通しているわけではないため、完全に動作する同様のサンプル ゲーム コードを投稿しました。

バグのあるコードは次のとおりです。何が起こるかというと、ウィンドウが開き、「ボール」オブジェクトが正常に機能して画面から落ち (そうあるべきですが、不完全です)、「スラブ」オブジェクトはマウスが最初にあった場所に固定されます。ここにあります:

from livewires import games, color
games.init (screen_width = 640, screen_height = 480, fps = 50)

class Ball (games.Sprite):
    def iMove (self):
        self.dx = -self.dx
        self.dy = -self.dy

class Slab (games.Sprite):
    def mouse_moves (self):
        self.x = games.mouse.x
        self.y = games.mouse.y
        self.iCollide()

    def iCollide (self):
        for Ball in overlapping_sprites:
            Ball.iMove()

def main():
    #Backgrounds
    pingpongbackground = games.load_image ("pingpongbackground.jpg", transparent = False)
    games.screen.background = pingpongbackground
    #Ball: Initializing object and setting speed.
    ballimage = games.load_image ("pingpongball.jpg")
    theball = Ball (image = ballimage,
                    x = 320,
                    y = 240,
                    dx = 2,
                    dy = 2)
    games.screen.add(theball)
    #Paddle: Initializing ping pong object and setting initial poisition to the initial mouse position
    slabimage = games.load_image ("pingpongpaddle.jpg")
    theslab = Slab (image = slabimage,
                    x = games.mouse.x,
                    y = games.mouse.y)
    games.screen.add(theslab)
    games.mouse.is_visible = False
    games.screen.event_grab = True
    games.screen.mainloop()

main ()

そして、これは同様の機能するコードの一部です:

# Slippery Pizza Program
# Demonstrates testing for sprite collisions

from livewires import games
import random

games.init(screen_width = 640, screen_height = 480, fps = 50)


class Pan(games.Sprite):
    """" A pan controlled by the mouse. """
    def update(self):
        """ Move to mouse position. """
        self.x = games.mouse.x
        self.y = games.mouse.y
        self.check_collide()

    def check_collide(self):
        """ Check for collision with pizza. """
        for pizza in self.overlapping_sprites:
            pizza.handle_collide()


class Pizza(games.Sprite):
    """" A slippery pizza. """
    def handle_collide(self):
        """ Move to a random screen location. """
        self.x = random.randrange(games.screen.width)
        self.y = random.randrange(games.screen.height)


def main():
    wall_image = games.load_image("wall.jpg", transparent = False)
    games.screen.background = wall_image

    pizza_image = games.load_image("pizza.bmp")
    pizza_x = random.randrange(games.screen.width)
    pizza_y = random.randrange(games.screen.height)
    the_pizza = Pizza(image = pizza_image, x = pizza_x, y = pizza_y)
    games.screen.add(the_pizza)

    pan_image = games.load_image("pan.bmp")
    the_pan = Pan(image = pan_image,
                  x = games.mouse.x,
                  y = games.mouse.y)
    games.screen.add(the_pan)

    games.mouse.is_visible = False

    games.screen.event_grab = True

    games.screen.mainloop()

# kick it off!
main()

どんな洞察でも大歓迎です!

4

2 に答える 2

1

あなたのフレームワークはわかりませんが、スラブが「スタック」しないようにするには、マウスを動かしたときにその場所を更新する必要があります。

ここで初期化します:

 theslab = Slab (image = slabimage,
                    x = games.mouse.x,
                    y = games.mouse.y)

次に、それをゲームに追加します。

games.screen.add(theslab)

おそらく、ゲームはマウスが動くたびにこの関数を呼び出すでしょう:

 def mouse_moves (self):
    self.x = games.mouse.x
    self.y = games.mouse.y
    self.iCollide()

しかし、それが起こっていないか、画面が更新されていません。

したがって、これを行うことで、次のことがわかります。

 def mouse_moves (self):
    print "mouse_moves: ", str(games.mouse.x), str(games.mouse.y) 
    self.x = games.mouse.x
    self.y = games.mouse.y
    self.iCollide()

マウスの移動時に print ステートメントの出力が表示される場合は、おそらく画面を更新していないため、フレームワークのドキュメントを確認する必要があります。しかし、そうではないと思います。マウスが動いたときにゲームを更新していないと思います。フレームワークには、マウスの動きが発生したときにゲームの状態を更新する (つまり、mouse_moves() を呼び出す) ことができるようにするために、フックする必要があるある種の onMouseMove タイプのイベントがあると思います。次に画面が更新されたときに、変更をチェックし (オブジェクトを無効にし、それらをダーティとしてマークする)、それらがダーティである場合は、画面のその部分を更新してから、再びクリーンとしてマークする必要があります。

于 2011-06-25T22:12:01.520 に答える