如何让相机跟随玩家(滚动)?

2024-04-29 11:06:40 发布

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

很抱歉再问一次,我知道这个问题以前被问过,但我就是想不出来。。。你知道吗

我正在做一个鸟瞰游戏,我终于有了所有的碰撞去,能够画的水平和任何东西,但我现在有一个问题,我简直不知道如何使相机跟踪球员。你知道吗

任何帮助都将不胜感激,提前谢谢。你知道吗

以下是完整代码:

import pygame
import time

pygame.init()

display_width = 1200
display_height = 800

red = (255,0,0)
green = (0,255,0)

black = (0,0,0)

x = 0
y = 0

block_width = 1
block_height = 1

block_size = 1

clock = pygame.time.Clock()

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("My Game")


def drawBlock(block_width,block_height,x,y):
    pygame.draw.rect(gameDisplay, red, [x,y,block_width,block_height])

def gameLoop(x,y):

    collisionArray = []

    canMoveUp = True
    canMoveDown = True
    canMoveLeft = True
    canMoveRight = True

    appendBlockXY = True

    P_count = 0
    P_countFunction = True

    L_count = 0

    W_count = 0

    y_change = 0
    x_change = 0

    player_movement = 5

    playerSize = 50

    pX = display_width/2 
    pY = display_height/2

    gameExit = False

    calculateBlockX = True
    calculateBlockY = True

    while not gameExit:


        level =  ["W","W","W","W","W","W","W","W","W","W","W","W",
                  "P","P","P","P","P","P","P","P","P","P","P","P","L",
                  "P","N","N","N","N","N","N","N","N","N","N","P","L",
                  "P","N","N","N","N","N","N","N","N","P","N","P","L",                                       
                  "P","N","N","N","N","N","N","N","N","N","N","P","L",                                     
                  "P","N","N","N","N","N","P","N","N","N","N","P","L",
                  "P","N","N","N","N","N","P","N","N","N","N","P","L",
                  "P","N","N","N","N","N","N","N","N","N","N","P","L",
                  "P","N","N","N","N","N","N","N","N","N","N","P","L",
                  "P","N","N","N","P","N","N","N","N","N","N","P","L",
                  "P","P","P","P","P","P","P","P","P","P","P","P","L","S"]    
#EVENT HANDLING

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if canMoveUp:
                    if event.key == pygame.K_UP:
                        y_change = -player_movement

                if canMoveDown:
                    if event.key == pygame.K_DOWN:
                        y_change = player_movement

                if canMoveLeft:
                    if event.key == pygame.K_LEFT:
                        x_change = -player_movement

                if canMoveRight:
                    if event.key == pygame.K_RIGHT:
                        x_change = player_movement

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
                    y_change = 0
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0

        pX += x_change
        pY += y_change

        gameDisplay.fill(black)


#CALCULATING THE SIZE OF THE BLOCKS SO THEY FIT W/ A VARIETY OF RESOLUTIONS


        if calculateBlockX:

            for element in level:
                if element == "W":
                    W_count += 1
                if element == "S":
                    block_width = (display_width/W_count) 
                    calculateBlockX = False

        if calculateBlockY:

            for element in level:
                if element == "L":
                    L_count += 1
                if element == "S":
                    block_height = (display_height/L_count)
                    calculateBlockY = False


#COUNTING HOW MANY BLOCKS THERE ARE IN THE LEVEL ARRAY (P)

        if P_countFunction:
            for element in level:
                if element == "P":
                    P_count += 1
                if element == "S":
                    print(P_count)
                    P_countFunction = False


#ALL THE X AND Ys OF ALL THE BLOCKS IN THE LEVEL, AND ACTUALLY DRAWING THEM

        blockXY = []

        for element in level:
            if element == "N":
                 x += block_width
            if element == "L":                                              
                 y += block_height
                 x = 0
            if element == "P": 
                drawBlock(block_width,block_height,x,y)                
                blockXY.append(x)
                blockXY.append(y)
                if appendBlockXY:
                    if len(collisionArray) > P_count:
                        del(collisionArray[P_count])
                        print(collisionArray)
                        appendBlockXY = False
                    collisionArray.append(blockXY)
                blockXY = []
                x += block_width
            if element == "S":
                y = 0

#COLLISION DETECTION

        canMoveUp = True
        canMoveDown = True
        canMoveLeft = True
        canMoveRight = True

        for XnY in collisionArray:

            if pY > XnY[1] and pY < XnY[1] + block_height or pY +  playerSize > XnY[1] and pY < XnY[1] + block_height:

                if pX - block_width == XnY[0]:
                    canMoveLeft = False
                    x_change = 0

            if pY > XnY[1] and pY < XnY[1] + block_height or pY +  playerSize > XnY[1] and pY < XnY[1] + block_height:

                if pX + playerSize == XnY[0]:
                    canMoveRight = False
                    x_change = 0

            if pX > XnY[0] and pX < XnY[0] + block_width or pX + playerSize > XnY[0] and pX < XnY[0] + block_width:

                if pY - block_height == XnY[1]:
                    canMoveUp = False
                    y_change = 0

            if pX > XnY[0] and pX < XnY[0] + block_width or pX + playerSize > XnY[0] and pX < XnY[0] + block_width:

                if XnY[1] - playerSize == pY:
                    canMoveDown = False
                    y_change = 0

        pygame.draw.rect(gameDisplay, green, [pX,pY,playerSize,playerSize])

        clock.tick(120)

        pygame.display.update()


    pygame.quit()
    quit()

gameLoop(x,y)        
pygame.display.update()

Tags: pyeventtrueifcountdisplayelementchange