使用箭头键移动pygame目标图像(范围)时出现问题

2024-09-30 16:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

当我们运行pygame的代码时,我们的目标范围图像不会移动,但是我们的机器人会生成。我们正在尝试使用我们的箭头键来移动它们,我包括了我们所有的代码。你知道吗

在我们最新的移动测试代码下注释掉的是我们尝试过的另外两件事。你知道吗

import pygame, sys  
from graphics import *  
import time  
import random  

pygame.init()  

level=1  
bg = pygame.image.load('bg.png')  
bg_width = 800  
pygame.display.set_caption('Robot Apocalypse')  
surfacew = 1054  
surfacel = 562  
surface = pygame.display.set_mode((surfacew,surfacel))  
black = (0, 0, 0)  
score = 0  
#player_health = 99  
alive=True  

targetImg = pygame.image.load('target.png')  
targetImg = pygame.transform.scale(targetImg, (40, 40))  
targetxy = targetImg.get_rect()  
targetx = targetxy[0]  
targety = targetxy[1]  

def move_target(targetImg):  
    pygame.event.clear()  
    while alive == True:  
        keys_pressed = pygame.key.get_pressed()  
        if keys_pressed[pygame.K_LEFT]:  
            targetx -= 5  
        if keys_pressed[pygame.K_RIGHT]:  
            targetx += 5  
        if keys_pressed[pygame.K_UP]:  
            targety -= 5  
        if keys_pressed[pygame.K_DOWN]:  
            targety += 5  
        pygame.display.update()  
    # pygame.event.clear()  
    # for event in pygame.event.get():  
    #     if event.type ==KEYDOWN:  
    #         if event.key == K_LEFT:  
    #             direction = MOVE_LEFT  
    #         elif event.key == K_RIGHT:  
    #             direction = MOVE_RIGHT  
    #     elif event.type == KEYUP:  
    #         if event.key == K_LEFT:  
    #             direction = 0  
    #         elif event.key == K_RIGHT:  
    #             direction = 0  
    # if(direction == MOVE_LEFT):  
    #     targetx-=10  
    # elif(direction == MOVE_RIGHT):  
    #     targetx+=10  

    # for event in pygame.event.get():  
    #     print(event)  
    #     if event.type==QUIT:  
    #          pygame.quit()  
    #          sys.exit()  
    #     if event.type == KEYDOWN:  
    #         if event.key == K_LEFT:  
    #             targetx-=5  
    #         elif event.key == K_RIGHT:  
    #             targetx+=5  
    #         elif event.key == K_UP:  
    #             targety-=5  
    #         elif event.key == K_DOWN:  
    #             targety+=5  
    #     pygame.display.update()  

def shoot():  
    #while True:  
    shot = False  

    pos = (targetx, targety)  
    t = screen.blit(robot, (64,64))  
    if t.collidepoint(pos):  
        shot = True  
    return shot  

def generate_robot(x,y):  
    #while displayrobot == True  
    robot=pygame.draw.rect(surface, (255,0,0), (x,y,64,64), 0)  
    for event in pygame.event.get():  
        if event.type == pygame.KEYDOWN:  
            if event.key == pygame.K_SPACE:  
                shoot()  
                if shot == True:  
                    displayrobot = False  
                    cover = surface.blit(bg, (x,y))  
                    pygame.display.update()  
    return x, y  

    #if shot == True:  

def die():  
    message("YOU DIED")  
    pygame.display.update()  

def win(level):  
    level+=1  

def text_objects(text, font):  
    textSurface = font.render(text, True, black)  
    return textSurface, textSurface.get_rect()  

def message(text):  
    largeText = pygame.font.Font('freesansbold.ttf',60)  
    TextSurf, TextRect = text_objects(text, largeText)  
    TextRect.center = ((surfacew/6),(surfacel/2))  
    surface.blit(TextSurf, TextRect)  
    pygame.display.update()  
    time.sleep(2)  

def main(alive):  
    #displayrobot = True:  
    robot=0  
    score=0  
    surface.fill(black)  
    surface.blit(bg, (0,0))  
    message("Level "+ str(level))  
    mouse = pygame.mouse.get_pos()  
    target = surface.blit(targetImg, (mouse))  
    while alive==True:  
        # robot = enemy(64, 64)  
        x=random.randint(40,760)  
        y=random.randint(40,560)  
        generate_robot(x,y)  
        pygame.display.update()  
        robot+=1  
        time.sleep(8/level)  
    if robot>50 and robot>score:  
        alive=False  
    # if pygame.mouse.get_pressed()==True:  
    #     shoot() #maybe??  
        if shot==True:  
            score+=1  
            robot-=1  
        if robot==10/(level/2): #if 10- robots on screen then...  
            die()  
        if score>25*(level/2):  
            win()  
move_target(targetImg)
main(alive)  
pygame.quit()  
quit()  

是的。 没有错误消息,但它不会移动。我们已经尝试了很多不同的东西(不包括在内),并查阅了很多网站,所以请帮助我们。谢谢


Tags: keyeventtruegetifdefdisplayrobot
2条回答

要移动对象,您不仅要更改x,y和更新屏幕(将缓冲区发送到将显示它的显卡),还要清理缓冲区,在缓冲区(blit())的新位置绘制图像。你知道吗

此代码仅显示正在工作的move_target。我跳过了其余的代码。你知道吗

我保持在target_rect的位置,也就是pygame.Rect。您可以使用它来blit(img,rect),但稍后您也可以使用它来检查冲突rect.colliderect(other_rect)

import pygame

#  - constants  - (UPPER_CASE_NAMES)

BLACK = (0, 0, 0)  

SURFACE_WIDTH = 1054  
SURFACE_HEIGHT = 562  

#  - functions  - (lower_case_names)

def move_target(target_img, target_rect):
    alive = True  
    clock = pygame.time.Clock()
    while alive:

        #  - events  -

        for event in pygame.event.get():  
            if event.type == pygame.QUIT:  
                alive = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    alive = False

        #  - updates/changes  -

        keys_pressed = pygame.key.get_pressed()  

        if keys_pressed[pygame.K_LEFT]:  
            target_rect.x -= 5  
        if keys_pressed[pygame.K_RIGHT]:  
            target_rect.x += 5  
        if keys_pressed[pygame.K_UP]:  
            target_rect.y -= 5  
        if keys_pressed[pygame.K_DOWN]:  
            target_rect.y += 5

        #  - draws  -

        surface.fill(BLACK)
        surface.blit(target_img, target_rect)
        pygame.display.update()

        # the same game's speed on all computers = 60 FPS
        clock.tick(60)

#  - main  - (lower_case_names)

pygame.init()  

pygame.display.set_caption('Robot Apocalypse')  
surface = pygame.display.set_mode((SURFACE_WIDTH, SURFACE_HEIGHT))  

target_img = pygame.image.load('target.png')  
target_img = pygame.transform.scale(target_img, (40, 40))  
target_rect = target_img.get_rect()  

move_target(target_img, target_rect)

pygame.quit()  

看起来我最初的函数注释仍然“有效”:你的代码不会移动任何游戏对象。你知道吗

targetxy = targetImg.get_rect()  
targetx = targetxy[0]
targety = targetxy[1]

此时,targetxy是对游戏对象的边框的引用。 targetxtargetyrect位置值的副本。你知道吗

def move_target(targetImg):  
    pygame.event.clear()  
    while alive == True:  
        keys_pressed = pygame.key.get_pressed()  
        if keys_pressed[pygame.K_LEFT]:  
            targetx -= 5
        ...

您已经更改了x坐标的本地副本。这不会影响targetImg的位置。您需要更改对象的属性,例如

            targetxy.x -= 5

之后,您需要update游戏屏幕。你知道吗

相关问题 更多 >