无法移动精灵,无法点击图片

问题描述

在我的计算机科学课程中,我必须编写一个程序,但是遇到了无法找到答案的问题。 首先,在用***突出显示代码部分中,我试图使精灵字符1移动,当我按下箭头键并且不知道为什么时,它什么也没做 其次是我用作按钮的图片在单击时没有任何作用-用###

突出显示

我知道我的代码不是最有效的,但是我正在尝试做对我来说有意义的事情

import pygame
import random
import time

WIDTH = 1080
HEIGHT =720
FPS = 30
x1 = WIDTH/2.25
y1 = HEIGHT/2.5
x2 = WIDTH/20
y2 = HEIGHT/2.5
xbut = 800
ybut = 275
gameTitle = 'Hungry Ghosts'
xChange1 = 0
yChange1 = 0
xChange2 = 0
yChange2 = 0

#define colours

WHITE = (255,255,255)
BLACK = (0,0)
MEGAN = (123,57,202)
MOLLIE = (244,11,12)
KATIE = (164,12,69)


#initialise pygame and window

pygame.init()
pygame.mixer.init()
pygame.font.init()
screen =pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption('Hungry Ghosts')
clock = pygame.time.Clock()


#load immages

background_image = pygame.image.load(('purplesky.jpg'))
player1_image = pygame.image.load(('player 1.png')).convert_alpha()
player2_image = pygame.image.load(('player 2.png')).convert_alpha()
position = (0,0)
screen.blit(background_image,position)
startBut = pygame.image.load('button.jpg').convert()

#define functions

def textObjects(gameTitle,font):
    textSurface = font.render(gameTitle,True,WHITE)
    pygame.display.update()
    return textSurface,textSurface.get_rect()

def titleText(gameTitle):
    textForTitle = pygame.font.Font('VCR_OSD_MONO_1.001.ttf',115) 
    TextSurf,TextRect = textObjects(gameTitle,textForTitle)
    TextRect.center = ((WIDTH/2),(HEIGHT/6))
    screen.blit(TextSurf,TextRect)
    pygame.display.update()

########################################

def titleButton(xbut,ybut):
    screen.blit(startBut,(xbut,ybut))
    pygame.display.update()
########################################

***************************************    
def character1(x1,y1):
    screen.blit(player1_image,(x1,y1))
    pygame.display.update()
***************************************

def character2(x,y):
    screen.blit(player2_image,(x,y))
    pygame.display.update()


def homeScreen():
    running = True
    gameplay = False
    instructions = False
    home = True
    while running:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
################################################################
            if event.type == pygame.MOUSEBUTTONDOWN:
                xbut,ybut = event.pos
                if startBut.get_rect().collidepoint(xbut,ybut):
                    print('clicked on button')
################################################################

def gameLoop():
    running = True
    while running:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        pygame.display.flip()

*************************************************************************
#movement
for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            xChange1 = -5
        elif event.key == pygame.K_RIGHT:
            xChange1 = 5
    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
            xChange1 = 0
x1 += xChange1
*************************************************************************


#calling functions
titleText(gameTitle)
character1(x1,y1)
character2(x2,y2)
titleButton(xbut,ybut)
homeScreen()
pygame.quit()

解决方法

您必须在游戏循环中进行场景的移动和绘制。

应用程序循环必须:

running = True

def homeScreen():
    global running
    start = False
    home = True
    while running and not start:
        clock.tick(FPS)
        
       # handle events
       for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                if startBut.get_rect(topleft = (xbut,ybut)).collidepoint(event.pos):
                    print('clicked on button')
                    start = True

        # draw background
        screen.blit(background_image,(0,0))

        # draw scene
        titleText(gameTitle)
        titleButton(xbut,ybut)
        
        # update display
        pygame.display.flip()

homeScreen()
def gameLoop():
    global running
    global x1,y2,x2,xChange1,yChange1,xChange2,yChange2
    while running:
        clock.tick(FPS)
        
        # handle events
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    xChange1 = -5
                elif event.key == pygame.K_RIGHT:
                    xChange1 = 5
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    xChange1 = 0
        
        # update position of objects 
        x1 += xChange1

        # draw background
        screen.blit(background_image,0))
        
        # draw scene
        character1(x1,y1)
        character2(x2,y2)

        # update display
        pygame.display.flip()

gameLoop()
pygame.quit()