2016-04-26 28 views
0

我正在研究一個pygame,你可以用一個(SpaceX)火箭飛行,然後讓它在海上駁船(OfCourseIStillLoveYou)上登陸。Python pygame rect.colliderect只能暫時重置位置

我還有一個國際空間站(ISS)在軌道上飛行,如果火箭擊中你就失去了生命。我用colliderect來做到這一點。

問題在於,碰撞後,火箭意圖返回其着陸點上的原始起始位置,並且ISS站返回其在軌道上的原始起始位置。但在短暫的停頓之後 - 他們回到了他們的碰撞形象。

本場比賽是跑這裏來......

import sys 
import pygame 
from rocket_settings import RocketSettings 
from rocket_game_stats import GameStats 
from rocket import Rocket 
from iss import ISS 
from rocket_barge import Barge 
import rocket_game_functions as rgf 
from rocket_plume import RocketPlume 

def run_game(): 
    # Initialize pygame, settings and screen object. 
    pygame.init() 
    ai_settings = RocketSettings() 
    screen=pygame.display.set_mode((ai_settings.screen_width, 
     ai_settings.screen_height)) 
    pygame.display.set_caption('Rocket Launch!!!') 
    background_image = pygame.image.load('images/moonsky.jpg') 

    # Creat an instance to store game statistics 
    stats=GameStats(ai_settings) 

    # Make a rocket (with plume), ISS and barge 
    barge = Barge(ai_settings, screen) 
    rocket = Rocket(ai_settings, screen) 
    iss = ISS(ai_settings, screen) 
    rocketplume = RocketPlume(ai_settings, screen, rocket) 


    # Start the main loop for the game. 
    while True: 
     # Watch for keyboard and mouse events. 
     rgf.check_events(rocket) 
     if stats.game_active: 
      rocket.updategravity() 
      rocket.update() 
      rgf.update_iss(ai_settings, stats, screen, rocket, iss) 
      rgf.update_barge(ai_settings, barge) 
      rocketplume.update(rocket) 
     rgf.update_screen(ai_settings, screen, rocket, rocketplume, iss, 
      barge) 
     screen.blit(background_image, [0, 0]) 

run_game() 

我不能包括所有的代碼,因爲有太多的,但這是相關的代碼重用:創建國際空間站的一個實例,該怎麼做,如果ISS被擊中,並更新ISS(如果有碰撞)

def create_iss(ai_settings, screen, iss): 
    iss = ISS(ai_settings, screen) 
    iss.rect.centerx = 800 
    iss.rect.top = iss.screen_rect.top 

def iss_hit(ai_settings, stats, screen, rocket, iss): 
    if stats.rockets_left >0: 
     # Decrement rockets_left 
     stats.rockets_left -= 1 

     # Create new iss and place ship 
     rocket.rocket_at_launchpad() 
     create_iss(ai_settings, screen, iss) 

     # Pause 
     sleep(0.5) 
    else: 
     stats.game_active = False 

def update_iss(ai_settings, stats, screen, rocket, iss): 
    """Check if iss is at an edge, and then update ISS position""" 
    check_iss_edges(ai_settings, iss) 
    iss.update() 

    # Look for alien-rocket collisions. 
    if rocket.rect.colliderect(iss.rect): 
     iss_hit(ai_settings, stats, screen, rocket, iss) 

這是rocket_at_launchpad代碼....上面提到的...

def rocket_at_launchpad(self): 
     # Start each new rocket at the launchpad screen 
     self.rect.centerx = 120 
     self.rect.bottom = self.screen_rect.bottom 

這是rocket_game_stats代碼...

class GameStats(): 
    """Track statistics for Spacex landing""" 

    def __init__(self, ai_settings): 
     """Initialize statistics.""" 
     self.ai_settings = ai_settings 
     self.reset_stats() 
     # Start SpaceX game in an active state. 
     self.game_active = True 

    def reset_stats(self): 
     """Initialize statistics that can change during the game.""" 
     self.rockets_left = self.ai_settings.rocket_limit 

最後這些都是在遊戲中會發生什麼一些截圖。 最初來回移動遊戲加載與國際空間站(和駁船)和火箭固定在該啓動 start of game

然後飛火箭在屏幕打國際空間站的火箭然後重置到啓動板暫時的預期。在(暫停之後)返回到與ISS相撞的地方並停留在那裏。 rocket & iss stuck after collision

這是我第一次發佈在stackoverflow上,所以如果我在我發佈的過程中做過一個新手,(友好)反饋是最受歡迎的。我只在python編碼了大約3周,所以你的幫助非常感謝。我已經盯着代碼幾個小時了,我不知道出了什麼問題!

+0

我已經知道問題是什麼,但我仍然不知道如何解決它。我將'stats.rocket_left'打印到命令窗口,我發現不是減少一個然後重新設置遊戲,遊戲會在屏幕上發生碰撞並凍結,stats.rocket_left會很快(可能是一秒)從4(初始生命數)減少到零。完成後遊戲將會凍結(因爲我沒有編碼當玩家的生命耗盡時它應該做什麼) –

回答

0

很難說因爲你沒有包含所有相關的代碼,但我的猜測是你沒有更新碰撞後的火箭圖像矩形。在將圖像傳送到屏幕之前,您需要更新圖像矩形。對不起,如果你已經做到了這一點,這並沒有幫助。祝好運與遊戲。你還需要對精靈圖像進行一點處理,因爲它們與背景對比非常尖銳。

+0

Hello Marien。非常感謝您的反饋。我試過在iss_hit代碼中包含rocket.update()和iss.update(),然後放置了新的iss和ship,但似乎沒有幫助。如果你看到上面的內容,我似乎已經發現了這個問題的一個症狀,對於我不應該發佈的代碼的哪一部分的任何建議或建議都非常感激。 –