为什么不能移动播放器精灵和相机?

2024-09-29 02:22:51 发布

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

您必须单击“退出”按钮才能看到正在添加注释的图形,即使您命令播放器移动,它也不会移动。我不明白这里有什么问题。是功能问题还是缺少更新?你知道吗

代码如下:

import pygame
import random
import os
from pygame import *

WIDTH = 1024
HEIGHT = 700
HALF_WIDTH = (WIDTH / 2)
HALF_HEIGHT = (HEIGHT / 2)

FPS = 30
game_folder = os.path.dirname(__file__)
car = os.path.join(game_folder,"img")

DEPTH = 32
DISPLAY = (WIDTH, HEIGHT)
FLAGS = 0
CAMERA_SLACK = 30


#Colors
RED =(255,0,0)
BLUE =(0,255,0)
GREEN =(0,0,255)
WHITE =(255,255,255)
BLACK= (0,0,0)

def main():
    global cameraX, cameraY
    #INITIALIZE
    pygame.init()
    screen = pygame.display.set_mode(DISPLAY,FLAGS,DEPTH)
    pygame.display.set_caption("Plato's Life")
    clock = pygame.time.Clock()

    up = down = left = right = False
    bg = Surface((32,32))
    bg.convert()
    bg.fill(WHITE)
    group= pygame.sprite.Group()
    player = Player(32, 32)    
    platforms = []
    #making Level
    x = y = 0
Level= ["TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T                                                                                                      T",
    "T  TT        TT  TTTTTTT TTTTTTT    TTTTTTT      TTTTTTT    TT  TTTTTT TT    TTTTT TTTTTT TT  TT TTTTT T",
    "T  TT        TT  TT      TT         TT   TT      TT    TT   TT  TT  TT TT    TT TT TT     TT  TT TT    T",
    "T  TT        TT  TTTTTTT TTTTT      TT   TT      TT     TT  TT  TT  TT TT    TT TT TT     TT  TT TTTT  T",
    "T  TT        TT  TT      TT         TTTTTTTTT    TT     TT  TT  TTTTTT TT    TT TT TT TTT TT  TT TT    T",
    "T  TT        TT  TT      TT         TT   TT TT   TT    TT   TT  TT  TT TT    TT TT TT   T TT  TT TT    T",
    "T  TTTTTTTTT TT  TT      TTTTTTT    TTTTTTT  TT  TTTTTTT    TT  TT  TT TTTTT TTTTT TTTTTT TTTTTT TTTTT T",
    "T      TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "T          TT  TT          TT  TT           TT  TT  TTT       TTT       TTT       TTT        TT      TTT",
    "T  TTTTTT  TTTTTT  TTTTTT  TTTTTT  TTTTTT   TTTTTT  TTT  TTT  TTT  TTT  TTT  TTT  TTT  TTT   TT     TTTT",
    "T  TT  TT          TT  TT          TT  TT                TTT       TTT       TTT       TTT         TTTTT",
    "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT    TTTTTT",
    "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT   TTTTTT",
    "T                                                                                              T       T",
    "T  TTTTTTTTTT    TTTTTTTTTT   TTT         TTTTTTTTT  TTTTTTTTT  TTTTTTTTT    TTTTTTTTTT       TTT      T",
    "T  TTTTTTTTTT    TTT     TT   TTT         TTT   TTT     TTT     TTT   TTT    TTTTTTTTTT      TTTTT     T",
    "T  TTTTTTTTTT    TTT     TT   TTT         TTT   TTT     TTT     TTT   TTT    TTTTTTTTTT     TTTTTTT    T",
    "T  TTTTTTTTTT    TTTTTTTTTT   TTT         TTTTTTTTT     TTT     TTT   TTT    TTTTTTTTTT       TTT      T",
    "T  TTTTTTTTTT    TTT          TTT         TTT   TTT     TTT     TTT   TTT    TTTTTTTTTT       TTT      T",
    "T  TTTTTTTTTT    TTT          TTTTTTTTTT  TTT   TTT     TTT     TTTTTTTTT    TTTTTTTTTT       TTT      T",
    "T                                                                                                      T",
    "T  TTTTT  T  TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "T  TTTTT  T  TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
    "T  TTTTT  T  TTTTT                                                                    TTTT             T",
    "T  TTTTT  T  TTTTT      TT               TTTT                   TTTT                  TTTT   TTTT      T",
    "T  TTTTT  T  TTTTT     TTTTTTT  TTT              TTT     T              TTT    TTTTTTTTT   T",
    "T  TTTTT  T  TTTTT    TTTTTT         TTT      TTT          TTT       TTT          TTT    TTT  TT  TTT  T",
    "T  TTTTT    TTTTTT   TTTTTTTT       TTT         TTT      TTT           TTT      TTT    TTT    TT   TTT T",
    "T  TTTTT    TTTTTT  TTTTTTTTTT    TTT    TTT      TTT  TTT              TTT   TTT    TTT      TT    TTTT",
    "T  TTTTT  T        TTTTTTTTTTTTTTTTTT    TTT        TTTT                   TTTT    TTTT       TT     TTT",
    "T  TTTTT  T TTTTT             TT  TTT    TTT                                                  TT       T",
    "T  TTTTT  T                   T          TTT      TTT  TTT   TTT   TTT               TTTTT    TT  TTT  T",
    "T  TTTTT  TT          TTTTTT  T  TTTTTTTTTTT      TTT  TTT   TTT   TTT              TT  TT    TT  TTT  T",
    "T  TTTTT  TTT         TTTTTT     TTT              TTT  TTT   TTT   TTT             TTT  TTT   TT  TTT  T",
    "T  TTTTTTTTTTT        TTTTTT     TTT       TTTTTTTTTTTTTTTTTTTTTTTTTTT     TTTTTTTTTTT  TTTTTTTTTTTTT  T",
    "T  TTTTTTTTTTTT       TTTTTT     TTT           T                                                       T",
    "T  TTTTTTTTTTTTTTTTTTTTTTTTT   TTTTTTT   TTTTTTT       TTT   TTT     TTTTTTT   TTTTTTT   TTTTTTT       T",
    "T  TT  TTT           TT   TTTTTTT   TTTTTTT   TTTTTTT  TTT   TTT     TT   TTTTTTT   TTTTTTT   TTTTTTT  T",
    "TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT",
        ]

    #build level
    for rows in Level:
        for col in rows:
            if col == "T":
                p = Platform(x,y)
                platforms.append(p)
                group.add(p)
            if col == "E":
                e= Exitblock(x,y)
                platforms.append(e)
                group.add(e)
            x += 32
       y += 32
       x = 0

    #camera
    total_level_width = len(Level[0])* 32
    total_level_height = len(Level) * 32
    camera = Camera(complex_camera,total_level_width, total_level_height)


    #events
    running= True
    while running:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running= False
            if event.type == KEYDOWN and event.key == K_ESCAPE:
                raise SystemExit
            if event.type == KEYDOWN and event.type == K_LEFT:
                left = True
            if event.type == KEYDOWN and event.type == K_RIGHT:
                right = True
            if event.type == KEYDOWN and event.type == K_UP:
                up = True
            if event.type == KEYDOWN and event.type == K_DOWN:
                down = True

            if event.type == KEYUP and event.type == K_UP:
                up = False
            if event.type == KEYUP and event.type == K_DOWN:
                down = False
            if event.type == KEYUP and event.type == K_RIGHT:
                right = False
            if event.type == KEYUP and event.type == K_LEFT:
                up = False



    #Background
    for y in range(32):
       for x in range(32):
           screen.blit(bg,(x * 32, y * 32))

    camera.update(player)

    player.update(up, down, left, right, platforms)
    for e in group:
        screen.blit(e.image, camera.apply(e))
        group.add(player)

    #screen fill
    group.draw(screen)



    #flip
    pygame.display.update()
    pygame.display.flip()

class Player (pygame.sprite.Sprite):
   def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image= pygame.image.load(os.path.join(car, "plato.png")).convert()
        self.image.set_colorkey(WHITE)
        self.rect= Rect(x, y, 32, 32)
        self.speedx= 0
        self.speedy= 0

   def update(self, up, down, left, right, platforms):
        self.speedx,self.speedy = 0,0
        if left:
            self.speedx = -10
        elif right:
            self.speedx = 10
        elif up:
            self.speedy -= 10
        elif down:
            self.speedy += 10
        self.rect.x += self.speedx
        self.collide(self.speedx, 0, platforms)
        self.rect.y += self.speedy
        self.collide(0,self.speedy ,platforms)

    def collide(self, speedx, speedy, platforms):
        for t in platforms:
            if pygame.sprite.collide_rect(self, t):
                if isinstance (p, Exitblock):
                    pygame.event.post(pygame.event.Event(QUIT))
                if speedx > 0:
                    self.rect.right = t.rect.left
                if speedx < 0:
                    self.rect.left = t.rect.right
                if speedy > 0:
                    self.rect.bottom = t.rect.top
                if speedy < 0:
                    self.rect.top = t.rect.bottom
#Camera
class Camera(object):
    def __init__(self, camera_func, width, height):
        self.camera_func = camera_func
        self.state = Rect(0, 0, width, height)

    def apply(self, target):
        return target.rect.move(self.state.topleft)

    def update(self, target):
        self.state = self.camera_func(self.state, target.rect)

def simple_camera(camera, target_rect):
    l, t, _, _ = target_rect
    _, _, w, h = camera
    return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h)

def complex_camera(camera, target_rect):
    l, t, _, _ = target_rect
    _, _, w, h = camera
    l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h

    l = min(0, l)                           # stop scrolling at the left edge
    l = max(-(camera.width- WIDTH), l)   # stop scrolling at the right edge
    t = max(-(camera.height- HEIGHT), t) # stop scrolling at the bottom
    t = min(0, t)                           # stop scrolling at the top
    return Rect(l, t, w, h)

#Platform
class Platform(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = Surface((32, 32))
        self.image.convert()
        self.image.fill(Color("#DDDDDD"))
        self.rect = Rect(x, y, 32, 32)

   def update(self):
       pass

class ExitBlock(Platform):
    def __init__(self, x, y):
        Platform.__init__(self, x, y)
        self.image.fill(Color("#0033FF"))

if __name__ == "__main__":
    main()

Tags: rectselfeventifdeftypepygamecamera
1条回答
网友
1楼 · 发布于 2024-09-29 02:22:51

问题在于事件循环。您正在检查是否event.type == K_LEFT,等等,而您应该检查是否event.key == K_LEFT。下面是固定循环:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == KEYDOWN:
        if event.key == K_ESCAPE:
            running = False
        elif event.key == K_LEFT:
            left = True
        elif event.key == K_RIGHT:
            right = True
        elif event.key == K_UP:
            up = True
        elif event.key == K_DOWN:
            down = True
    elif event.type == KEYUP:
        if event.key == K_UP:
            up = False
        elif event.key == K_DOWN:
            down = False
        elif event.key == K_RIGHT:
            right = False
        elif event.key == K_LEFT:
            left = False

相机坏了,因为绘图代码有点复杂。下面是事件循环下面的代码(将player添加到while循环上面的group):

# Update the camera and the player.
player.update(up, down, left, right, platforms)
camera.update(player)

# Draw everything.
screen.fill((30, 30, 30))
for e in group:
    screen.blit(e.image, camera.apply(e))
pygame.display.flip()

另外,在collide方法中,必须更改isinstance行:

def collide(self, speedx, speedy, platforms):
    for t in platforms:
        if pygame.sprite.collide_rect(self, t):
            if isinstance(t, ExitBlock):

相关问题 更多 >