2017-11-10 3 views
0

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.

+0

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? –

+0

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

Antwort

0

Ich habe dies nicht eingegeben, um zu überprüfen, aber ich habe ähnliche Probleme/Projekte in Pygame gelöst. Es sieht so aus, als müssten Sie den Code an zwei Stellen ändern:

1) Erfassen Sie die Ereignisse, indem Sie die Abwärtstaste und die Nach-oben-Taste drücken. Dies ist wahrscheinlich so etwas wie:

# from your game_function.py 
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 
    elif event.key == pygame.K_DOWN: 
     ship.moving_down = True 
    elif event.key == pygame.K_UP: 
     ship.moving_up = 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 
    elif event.key == pygame.K_DOWN: 
     ship.moving_down = False 
    elif event.key == pygame.K_UP: 
     ship.moving_up = False 

2) Klasse Ihre ursprüngliche Schiff die tatsächliche Bewegung zu verarbeiten. Dies sollte ungefähr so ​​aussehen:

# Movement flag 
self.moving_right = False 
self.moving_left = False 
self.moving_down = False 
self.moving_up = 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 
    if self.moving_down and self.rect.bottom > self.screen_rect.bottom: 
     self.center -= self.ai_settings.ship_speed_factor 
    if self.moving_up and self.rect.top < self.screen_rect.top: 
     self.center -= self.ai_settings.ship_speed_factor 

    # Update rect object from self.center - might need to be changed now to handle 
    # movement in two directions properly. 
    if self.moving_up or self.moving_down: 
     self.rect.centery = self.center 
    if self.moving_left or self.moving_right: 
     self.rect.centerx = self.center 
+0

Ich habe so etwas versucht, aber wenn ich versuche, das Schiff ständig auf und ab zu bewegen, lässt es mich nicht zu – CholoBoy

+0

Dies ist wahrscheinlich mit Refactoring zu tun, was passiert mit dem Self.center, die derzeit kein X und hat ay und müssen sie getrennt behandeln. Zeig mir, was du probiert hast und ich werde sehen, ob ich alle Änderungen machen kann und dir eine funktionierende Version geben kann. –

0

Ok, ich habe es geknackt - diese Lösung arbeitet jetzt:

settings.py

class Settings: 
    """A Class to store all settings for ALien 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 
    ship_speed_factor = 1.5 

game_functions.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 
    elif event.key == pygame.K_DOWN: 
     ship.moving_down = True 
    elif event.key == pygame.K_UP: 
     ship.moving_up = True 

def check_keyup_events(event, ship): 
    """Responds to key releases""" 
    if event.key == pygame.K_RIGHT: 
     ship.moving_right = False 
    elif event.key == pygame.K_LEFT: 
     ship.moving_left = False 
    elif event.key == pygame.K_DOWN: 
     ship.moving_down = False 
    elif event.key == pygame.K_UP: 
     ship.moving_up = False 

def check_events(ship): 
    """Respond to keypresses and mouse events.""" 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
     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() 

ship.py

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

Eigentlich alles, was ich tat, war, alle Änderungen zu implementieren, die ich beschrieben und ein paar grundlegenden Fehler in Layout/Syntax zu beseitigen. Beachten Sie, dass ich eine bessere Beenden-Funktion hinzugefügt habe, um den Grafikbereich zu schließen, wenn Sie auf den roten Knopf klicken.

Wenn diese Lösung auch für Sie funktioniert, dann markieren Sie sie bitte als Antwort, damit ich im Stapelfluss genügend Reputation bekommen kann.

Verwandte Themen