2016-09-03 4 views
1

파이 게임에서 퐁을 만들고 있는데 문제가 있습니다. 공이 패들과 충돌하면 공이 계속 붙어 있습니다. Heres 코드, 나는 wheres 문제를 파악할 수 없습니다.파이 게임의 퐁 : 볼이 바운스하지 않습니다.

기본 파일 : 공

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

클래스 :

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 

덕분에 도움을 많이 :/

여기

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) 

및 변화 방향에 대한 기능입니다

PS 이동 플래그 self.moving은 패들 이동 키가 눌러져 있으면 True로 변경됩니다.

+0

코드가 완전하지 않으므로 'update'는 항상 볼의 속도를 뺀 것처럼 보이므로 한 방향으로 만 이동합니다. 'platform'이 충돌하는 경우 ball_speed가 추가됩니다. 그러나 다음 update는 다시 빼기 만하면됩니다. 디버거가있는 많은 무료 Python IDE가 있으므로 코드를 단계별로 실행하고 논리를 살펴볼 수 있습니다. X 좌표와 Y 좌표가 바뀌는 지 확인하십시오. –

+0

문제를 재현하려면 최대한 많은 코드를 제거하십시오. 디버깅이 쉬워집니다. 또한 문제의 일부인 코드를 포함해야합니다 (이 경우'ai_settings.ball_speed'). 코드는 테스트 할 수 있어야하며 들여 쓰기가 정확하고 문제를 재현하는 데 필요한 코드가 제공되어야합니다. 또한 pygame을 py로 가져 오는 이유는 무엇입니까? 코드가 훨씬 모호 해지고 많은 타이핑을 저장하지 않습니다. 그것은 긴 이름을 가진 당신의 자신의 모듈을 위해 이해할 수 있습니다. –

답변

0

귀하의 업데이트 기능이 추가 필요에 따라 완전히 완료되지 않은 :

def update(self): 

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

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

코드가 공의 방향을 업데이트합니다 그래서. 업데이트 섹션에 있으므로 업데이트주기가 발생할 때마다 충돌을 확인합니다. 이의 결과로 당신은 아마 볼 클래스로

collide_check() 

기능을 추가해야합니다. 나는 또한을 추가해야합니다 :

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

대신해야합니다

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

는 반대 방향으로 이동 ai_settings.ball_speed하게 그 길을, N * -1 = -1 -n으로 * -1 = 1

+0

좋아, 그래서 이미 시도했지만 여전히 작동하지 않습니다. 어쨌든 도움을 주셔서 감사합니다. – Freestajlo

관련 문제