2011-06-25 10 views
0

私はPythonのPygameを使ってシンプルなping-pongゲームをLivewiresを使ってプログラミングしてきました。私はこの質問と、ここで誰もがライブワイヤーやパイゲームに精通しているわけではないので、完璧に動作する同様のサンプルゲームコードを投稿しました。簡単なピンポンゲームのデバッグ?

ここにはバグのあるコードがあります。ウィンドウが開き、「ボール」オブジェクトがうまく動作し、画面が落ちる(不完全なはずです)、「スラブ」オブジェクトはマウスが最初にあった場所に貼り付けられます。ここでは、次のとおりです。

# 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() 

まったく洞察力をいただければ幸いです。

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() 

そしてここでは、類似し、機能コードの一部です!

+1

なぜ異なるメソッド名を使用していますか?正しい名前が必要な場合、関数が呼び出されません。 –

+0

名前を変更して確認して返信します。 – Louis93

+0

ええ、私は他の方法をオフに設定する各クラスに先進的な更新(自己)メソッドが必要でしたが、他にも小さなミスもありましたが、ほとんどがほとんど修正されました。 – Louis93

答えて

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() 

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

ですから、このことによって、見つける必要があります:あなたは、マウスの移動が起こってprint文の出力が表示された場合、あなたはおそらく、画面を更新していない

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() 

を、あなたがする必要がありますフレームワークのドキュメントを確認してください。しかし、私はそれが事実だとは思わない。私はあなたがマウスが動いたときにゲームを更新していないと思います。フレームワークには、マウスの動きが発生したときにゲームの状態(つまり、mouse_moves()を呼び出すこと)を可能にするために、何らかの種類のonMouseMoveタイプのイベントがあると思います。次に、画面が更新されたら、変更をチェックして(オブジェクトを無効にし、汚れていることをマークしてください)、汚れている場合は画面の一部を更新してから再びマークします。

+0

ありがとう、私はもう一度ドキュメンテーションに行きます。 – Louis93

+0

申し訳ありませんが、私が最初に尋ねたときにこれを最もよく選択するのを忘れました。ただした。もう一度ありがとう。 – Louis93

+1

@ Louis93:ありがとう。気軽に何でも聞いてください。 –

0

だけスラブクラスでこの更新方法を置く:

def update(self): 
    self.x=games.mouse.x 
    self.y=games.mouse.y 

それは、自動的に1秒に1回(お使いの更新速度)のすべての五十を実行します。現在のところ、スラブをマウスの位置で開始し、そこに放置するだけです。

関連する問題