Ich versuche ein Schiff für außerirdische Eindringlinge auf und ab bewegen zu lassen, aber es scheint nicht zu funktionieren, ohne etwas kaputt zu machen.Wie man sich rauf und runter bewegt
Mit meinem Code unter was müsste ich hinzufügen?
alien_invasion.py:
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
#Initialize pygame, settings, and screen object
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#Draw the ship
ship = Ship(ai_settings, screen)
#Start the main loop for the game.
while True:
#Watch for keyboard and mouse events
gf.check_events(ship)
ship.update()
gf.update_screen(ai_settings, screen, ship)
run_game()
ship.py:
import pygame
class Ship():
def __init__(self, ai_settings, screen):
"""Initialize teh ship and set its starting position"""
self.screen = screen
self.ai_settings = ai_settings
#Load teh ship image and get its rect
self.image = pygame.image.load('ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#Start each new ship at the bottom center of the screen
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# Store a decimal value for the ship's center.
self.center = float(self.rect.centerx)
# Movement flag
self.moving_right = False
self.moving_left = False
def update(self):
"""Update the ship's postion based on the movement flag"""
# Update the ship's center value, not the rect.
if self.moving_right and self.rect.right < self.screen_rect.right:
self.center += self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left > 0:
self.center -= self.ai_settings.ship_speed_factor
# Update rect object from self.center
self.rect.centerx = self.center
def blitme(self):
"""Draw the ship at its current location"""
self.screen.blit(self.image, self.rect)
game_fuction.py:
import sys
import pygame
def check_keydown_events(event, ship):
"""Responds to keypresses"""
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
def check_keyup_events(event, ship):
"""Respoinds to key releases"""
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
"""Respond to keypresses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
check_keydown_events(event, ship)
elif event.type == pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship):
"""Update images on the screen and flip to the new screen"""
#Redraw the screen during each pass through the loop
screen.fill(ai_settings.bg_color)
ship.blitme()
#Make the most recently drawn screen visible.
pygame.display.flip()
settings.py:
class Settings():
"""A Class to store all settings for ALein INvasion"""
def __init__(self):
"""Initialize the game's settings"""
#screen settings
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (255,255,255)
# Ship Settings
self.ship_speed_factor = 1.5
Dies ist ein Projekt von Python Crash Course. Dieses bestimmte Projekt sagt
Machen Sie ein Spiel, das mit einer Rakete in der Mitte des Bildschirms beginnt. Erlauben Sie dem Spieler, die Rakete mit den vier Pfeiltasten nach oben, unten, links oder rechts zu bewegen. Verwenden Sie dazu die Pfeiltasten . Stellen Sie sicher, dass die Rakete niemals über eine Kante oder den Bildschirm bewegt.
Sie sagen: "Es kann scheinbar nicht funktionieren, ohne etwas kaputt zu machen" - bitte beschreiben Sie, wie es versagt und was Sie stattdessen erwarten, denn das ist eine Menge Code zum Durchschauen. Oh, und in 'game_fuction.py' sind deine' elif's in der falschen Einrückung - ist das ein Tippfehler? –
Sie handeln mit dem Keydown, was bedeutet, dass wenn die Taste bereits * nicht gedrückt ist, kein Ereignis aufgerufen wird - dies verhindert die * kontinuierliche * Bewegung. Was Sie zum Beispiel tun können, ist eine Bewegung auf Keydown (dh wie eine While-Schleife, die ständig aktualisiert wird) zu initialisieren und sie bei der Tastenkombination zu brechen. – CermakM