我正在研究一個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周,所以你的幫助非常感謝。我已經盯着代碼幾個小時了,我不知道出了什麼問題!
我已經知道問題是什麼,但我仍然不知道如何解決它。我將'stats.rocket_left'打印到命令窗口,我發現不是減少一個然後重新設置遊戲,遊戲會在屏幕上發生碰撞並凍結,stats.rocket_left會很快(可能是一秒)從4(初始生命數)減少到零。完成後遊戲將會凍結(因爲我沒有編碼當玩家的生命耗盡時它應該做什麼) –