python pygame水平移动图片



我正在尝试修改《Python速成课》中的游戏控制。我想控制宇宙飞船的画面(让它水平移动)。以下是我在stackoverflow上发现的内容:

import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
IMG = pg.Surface((120, 90))
IMG.fill((0, 120, 200))
x = 200
y = 300
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
elif event.type == pg.MOUSEMOTION:
if event.buttons[0]:  # Left mouse button pressed.
x += event.rel[0]
y += event.rel[1]
screen.fill(BG_COLOR)
screen.blit(IMG, (x, y))
pg.display.flip()
clock.tick(60)
pg.quit()

下面是我在编程中实现它的尝试:我做错了什么?Alien_Invasion.py

import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
# Initialisiert das Spiel + erstellt ein screen-Objekt
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# Erstellt das Schiff
ship = Ship(ai_settings,screen)
# Startet die Hauptschleife des Spiels.
while gf.check_events(ship):
ship.update()
gf.update_screen(ai_settings, screen, ship)
run_game()

game_functions.py

import pygame,time 
import pygame.locals as pyl
clock = pygame.time.Clock()
x=0
def check_events(ship):
# Lauscht auf Tastaturereignisse.
for event in pygame.event.get():
if event.type == pygame.QUIT:
return False
elif event.type == pyl.MOUSEMOTION:
x = event.rel[0]
if x>0:
ship.moving_right=True
if x<0:
ship.moving_left=True
clock.tick(60)
return True     
def update_screen(ai_settings, screen, ship):
#Zeichnet den Bildschirm bei jedem Schleifendurchlauf neu
screen.fill(ai_settings.bg_color)
ship.blitme()
# Macht den als letztes gezeichneten Bi1dschirm sichtbar
pygame.display.flip()

ship.py

import pygame
class Ship():
def __init__(self,ai_settings,screen):
self.screen = screen
self.ai_settings = ai_settings
# lädt das Bi1d des Schiffes und ruft dessen umgebendes Rechteck ab
self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()  
self.screen_rect= screen.get_rect()
# Platziert jedes neue Schiff mittig am unteren Bildschirmrand
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
# speichert einen Kommawert für den Schiffsmittelpunkt
self.center=float(self.rect.centerx)
self.moving_right=False
self.moving_left=False

def update(self):
#Aktualisiert den Wert für den Mittelpunkt des Schiffs, nicht des Rechtecks
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
#Aktualisiert das rect-Objekt auf der Grundlage von self.center
self.rect.centerx=self.center
def blitme(self):
self.screen.blit(self.image, self.rect)

settings.py

class Settings():
def __init__(self):
# Bildschirmeinstellungen
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (80,80,255)
self.ship_speed_factor = 1.5

请帮助我得到鼠标移动识别工作…谢谢…

当您左右移动鼠标时,ship.moving_leftship.moving_right将被设置为True。因此,船左右移动。最后,船回到了原来的位置。
你必须重置属性:

x = event.rel[0]
if x > 0:
ship.moving_right = True
ship.moving_left = False
if x < 0:
ship.moving_right = False
ship.moving_left = True

最新更新