2016-09-03 14 views
1

私はパイゲームで卓球をしていますが、問題があります。ボールがパドルに衝突すると、ボールがパドルについたままになります。 Heresコード、私は頭痛の問題を把握できません。パイの卓球:ボールは跳ねません

メインファイル:ボール用

import pygame as py 

import game_functions as gf 
from game_objects import Platform, Platform2, Ball 
from settings import Settings 


def run_game(): 
py.init() 
ai_settings = Settings() 
screen = py.display.set_mode((
    ai_settings.screen_width, ai_settings.screen_height 
)) 
py.display.set_caption('Pong') 
platform = Platform(ai_settings, screen) 
platform2 = Platform2(ai_settings, screen) 
ball = Ball(ai_settings, screen) 

while True: 
    gf.check_events(platform, platform2, ball) 
    platform.update(), platform2.update(), ball.update() 
    gf.collide_check(ball, platform, platform2, ai_settings) 
    gf.update_screen(ai_settings, screen, platform, platform2, ball) 

run_game() 

クラス:

class Ball: 

def __init__(self, ai_settings, screen): 
    self.ai_settings = ai_settings 
    self.screen = screen 
    self.screen_rect = screen.get_rect() 

    self.image = py.image.load('pics/ball.png') 
    self.rect = self.image.get_rect() 

    self.rect.centerx = self.screen_rect.centerx 
    self.rect.centery = self.screen_rect.centery 

    self.moving = False 

def update(self): 

    if self.moving: 
     self.rect.centerx -= self.ai_settings.ball_speed 

def draw_ball(self): 

    self.screen.blit(self.image, self.rect) 

、ここでは、関数が方向を変えるためのものです:助けを

def collide_check(ball, platform, platform2, ai_settings): 

    if ball.rect.colliderect(platform.rect): 
     ball.rect.centerx += ai_settings.ball_speed 
    elif ball.rect.colliderect(platform2.rect): 
     ball.rect.centerx -= ai_settings.ball_speed 

どうもありがとう:/

PS移動フラグself.movingは、パドル移動のキーが押された場合にTrueに変わります。

def update(self): 

self.collide_check(ball, platform, platform2, ai_settings) 

if self.moving: 
    self.rect.centerx -= self.ai_settings.ball_speed 

をあなたのコードはボールの方向を更新しているので:あなたが追加する必要があるとして

+0

コードは完全ではないと推測されますが、 'update'は常にボールの速度を減算するように見えるため、一方向にしか移動しません。 'platform'が衝突するものであれば、ball_speedが追加されますが、次の' update'は再び減算されます。デバッガを備えた多くのPython IDEがありますので、コードをステップバイステップで実行してロジックを確認することができます。あなたのXとY座標が変化するのを見てください。 –

+0

問題を再作成するためにできるだけ多くのコードを削除してください。デバッグが簡単になります。また、問題の一部であるコード(この場合は 'ai_settings.ball_speed')を含める必要があります。コードはテスト可能でなければならないので、字下げが正しいことと、問題を再現するために必要なコードが提供されていることを確認してください。また、pygameをpyとしてインポートする理由は何ですか?コードをはるかにあいまいにし、多くの型を節約しません。しかし、長い名前であなたのモジュールには理解できます。 –

答えて

0

あなたの更新機能は完全には完全ではありません。更新セクションにあるので、更新サイクルが発生するたびに衝突をチェックします。 この結果として、あなたはおそらくボールのクラスに

collide_check() 

機能を追加する必要があります。 私もそれを追加する必要があります

if ball.rect.colliderect(platform.rect): 
    ball.rect.centerx += ai_settings.ball_speed 

が代わりになる必要があります:* -1 = nと、

if ball.rect.colliderect(platform.rect): 
    ai_settings.ball_speed * -1 

それが逆方向に行くai_settings.ball_speedになりそうすれば-1と-n * -1 = 1

+0

それでは、私はすでにそれを試みていますが、まだ動作していません。とにかく助けてくれてありがとう。 – Freestajlo