Python 为什么可以';我不能让我的相机工作吗?

Python 为什么可以';我不能让我的相机工作吗?,python,pygame,sprite,Python,Pygame,Sprite,我试图用教程为我的平板电脑创建一个摄像头,但我无法让它工作。这可能(希望)是很容易修复的,因为我是编程新手 这是它应该做的 取而代之的是,它只是表现得好像根本没有摄像头。玩家精灵在可见的屏幕上移动 这是我的代码,如果您需要完整的代码以便运行,我很乐意提供: class Camera(object): def __init__(self, camera_func, width, height): self.camera_func = camera_func

我试图用教程为我的平板电脑创建一个摄像头,但我无法让它工作。这可能(希望)是很容易修复的,因为我是编程新手

这是它应该做的

取而代之的是,它只是表现得好像根本没有摄像头。玩家精灵在可见的屏幕上移动

这是我的代码,如果您需要完整的代码以便运行,我很乐意提供:

class Camera(object):
    def __init__(self, camera_func, width, height):
        self.camera_func = camera_func
        self.state = pygame.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 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-SCREEN_WIDTH), l) # stop scrolling at the right edge
    t = max(-(camera.height-SCREEN_HEIGHT), t) # stop scrolling at the bottom
    t = min(0, t)                           # stop scrolling at the top
    return Rect(l, t, w, h)

    return Rect(l, t, w, h)

class Sprite(pygame.sprite.Sprite):
    def __init__(self,img):
        pygame.sprite.Sprite.__init__(self)

class Player(Sprite):
    def __init__(self,x,y,width,height):
        self.dx = 0
        self.dy = 0
        self.onGround = False
        self.image = pygame.image.load('robotStanding_sprite.png')
        self.rect = pygame.Rect(x,y,width,height)

    def update(self):
        self.rect.x += self.dx
        self.collide(self.dx,0,terrain_list)
        self.rect.y += self.dy
        self.collide(0,self.dy,terrain_list)

        if moving_right: self.dx = SPEED
        if moving_left: self.dx = -SPEED
        if not(moving_left or moving_right): self.dx = 0

        if moving_up:
            self.dy = -SPEED
            self.onGround = False
        elif not moving_up: self.dy = SPEED

        if self.rect.y >= LOWER_BOUNDARY-GROUND_LEVEL_HEIGHT-ROBOT_HEIGHT:
            self.rect.y = LOWER_BOUNDARY-GROUND_LEVEL_HEIGHT-ROBOT_HEIGHT
            self.onGround = True

    def collide(self,xvel,yvel,blocks):
        for block in blocks:
            if pygame.sprite.collide_rect(player,block):
                if xvel > 0: self.rect.right = block.rect.left
                if xvel < 0: self.rect.left = block.rect.right

                if yvel > 0:
                    self.rect.bottom = block.rect.top
                    self.onGround = True

class Terrain(Sprite):
    def __init__(self,img,x,y,width,height):
        self.image = pygame.image.load(img)
        self.rect = pygame.Rect(x,y,width,height)

    def addBlock(img,x,y,width,height):
        block = Terrain(img,x,y,width,height)
        terrain_list.append(block)

pygame.init()

size = [700,500]
screen = pygame.display.set_mode(size)


LEFT_BOUNDARY = 0
RIGHT_BOUNDARY = size[0]
UPPER_BOUNDARY = 0
LOWER_BOUNDARY = size[1]
HALF_WIDTH = size[0] / 2
HALF_HEIGHT = size[1] / 2
TILE_SIZE = 20
ROBOT_HEIGHT = 2*TILE_SIZE
ROBOT_WIDTH = 25
GROUND_HEIGHT = 100
GROUND_LEVEL_HEIGHT = 4*TILE_SIZE
GROUND_WIDTH = 3000
BLOCK_HEIGHT = 500
BLOCK_WIDTH = 160
SCREEN_WIDTH = 24*TILE_SIZE
SCREEN_HEIGHT = 35*TILE_SIZE

terrain_list = []

player = Player(17*TILE_SIZE,19*TILE_SIZE,ROBOT_WIDTH,ROBOT_HEIGHT)
Terrain.addBlock('ground.fw.png',
    0*TILE_SIZE,21*TILE_SIZE,GROUND_WIDTH,GROUND_HEIGHT)
Terrain.addBlock('block1.fw.png',
    -5*TILE_SIZE,0*TILE_SIZE,BLOCK_WIDTH,BLOCK_HEIGHT) # LEFT WALL
Terrain.addBlock('block1.fw.png',
    24*TILE_SIZE,16*TILE_SIZE,BLOCK_WIDTH,BLOCK_HEIGHT)
Terrain.addBlock('block1.fw.png',
    32*TILE_SIZE,20*TILE_SIZE,BLOCK_WIDTH,BLOCK_HEIGHT)
Terrain.addBlock('block1.fw.png',
    40*TILE_SIZE,12*TILE_SIZE,BLOCK_WIDTH,BLOCK_HEIGHT)

# CREATE CAMERA -----------------------------------------------------------
camera = Camera(complex_camera, 24*TILE_SIZE, 3000)


done = False
while not done:
    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            done = True

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_d: moving_right = True
            if event.key == pygame.K_a: moving_left = True
            if event.key == pygame.K_w:
                if player.onGround:
                    moving_up = True
            if event.key == pygame.K_DOWN: moving_down = True

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_d: moving_right = False
            if event.key == pygame.K_a: moving_left = False
            if event.key == pygame.K_w: moving_up = False

    screen.fill(SKY_BLUE)
    camera.update(player)
    player.update()
    screen.blit(player.image,player.rect)
    for block in terrain_list:
        screen.blit(block.image,camera.apply(block))


     # DRAW TILE LINES -----------------------------------------------------
    if draw_tiles:
        x = 0
        y = 0
        for i in range(RIGHT_BOUNDARY // 2):
            pygame.draw.line(screen,BLACK,
                [x,UPPER_BOUNDARY],[x,LOWER_BOUNDARY])
            pygame.draw.line(screen,BLACK,
                [LEFT_BOUNDARY,y],[RIGHT_BOUNDARY,y])
            x += TILE_SIZE
            y += TILE_SIZE
        # tile test
        pygame.draw.rect(screen,BLACK,
            (34*TILE_SIZE,24*TILE_SIZE,TILE_SIZE,TILE_SIZE))

    pygame.display.flip()
    clock.tick(60)
pygame.quit()
类摄像机(对象):
定义初始值(自身、相机功能、宽度、高度):
self.camera\u func=camera\u func
self.state=pygame.Rect(0,0,宽度,高度)
def应用(自身、目标):
返回target.rect.move(self.state.topleft)
def更新(自我、目标):
self.state=self.camera_func(self.state,target.rect)
def复合摄像头(摄像头、目标摄像头):
l、 t,u,u=目标
_,uw,h=摄像机
l、 t,uu,u=-l+半宽,-t+半高,w,h
l=min(0,l)#停止在左边缘滚动
l=最大值(-(摄像头宽度-屏幕宽度),l)#在右边缘停止滚动
t=max(-(摄像头高度-屏幕高度),t)#在底部停止滚动
t=min(0,t)#停止在顶部滚动
返回矩形(l、t、w、h)
返回矩形(l、t、w、h)
类精灵(pygame.Sprite.Sprite):
定义初始(自我,img):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
职业玩家(精灵):
定义初始值(自、x、y、宽度、高度):
self.dx=0
self.dy=0
self.onGround=False
self.image=pygame.image.load('robotStanding\u sprite.png')
self.rect=pygame.rect(x,y,宽度,高度)
def更新(自我):
self.rect.x+=self.dx
self.collide(self.dx,0,地形列表)
self.rect.y+=self.dy
self.collide(0,self.dy,地形列表)
如果向右移动:self.dx=速度
如果向左移动:self.dx=-速度
如果不是(向左移动或向右移动):self.dx=0
如果向上移动_:
self.dy=-SPEED
self.onGround=False
elif不向上移动:self.dy=速度
如果self.rect.y>=下边界地面高度机器人高度:
self.rect.y=下边界-地面-水平高度-机器人高度
self.onGround=True
def碰撞(自身、xvel、yvel、块):
对于块中的块:
如果pygame.sprite.collide_rect(玩家、区块):
如果xvel>0:self.rect.right=block.rect.left
如果xvel<0:self.rect.left=block.rect.right
如果yvel>0:
self.rect.bottom=block.rect.top
self.onGround=True
类地形(精灵):
定义初始值(自身、img、x、y、宽度、高度):
self.image=pygame.image.load(img)
self.rect=pygame.rect(x,y,宽度,高度)
def添加块(img、x、y、宽度、高度):
块=地形(img、x、y、宽度、高度)
地形列表。附加(块)
pygame.init()
大小=[700500]
screen=pygame.display.set_模式(大小)
左边界=0
右边界=大小[0]
上边界=0
下边界=尺寸[1]
半宽=尺寸[0]/2
半高=尺寸[1]/2
瓷砖尺寸=20
机器人高度=2*瓷砖尺寸
机器人_宽度=25
地面高度=100
地面标高高度=4*瓷砖尺寸
地面宽度=3000
砌块高度=500
块宽度=160
屏幕宽度=24*瓷砖大小
屏幕高度=35*瓷砖大小
地形列表=[]
玩家=玩家(17*瓷砖大小,19*瓷砖大小,机器人宽度,机器人高度)
Terrain.addBlock('ground.fw.png',
0*瓷砖尺寸,21*瓷砖尺寸,地面宽度,地面高度)
Terrain.addBlock('block1.fw.png',
-5*瓷砖尺寸,0*瓷砖尺寸,砌块宽度,砌块高度)#左墙
Terrain.addBlock('block1.fw.png',
24*瓷砖尺寸、16*瓷砖尺寸、砌块宽度、砌块高度)
Terrain.addBlock('block1.fw.png',
32*瓷砖尺寸、20*瓷砖尺寸、砌块宽度、砌块高度)
Terrain.addBlock('block1.fw.png',
40*瓷砖尺寸、12*瓷砖尺寸、砌块宽度、砌块高度)
#创建摄影机-----------------------------------------------------------
摄像机=摄像机(复合摄像机,24*TILE\u尺寸,3000)
完成=错误
虽然没有这样做:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
完成=正确
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K\u d:moving\u right=True
如果event.key==pygame.K\u a:moving\u left=True
如果event.key==pygame.K_w:
如果player.onGround:
向上移动=真
如果event.key==pygame.K\u DOWN:moving\u DOWN=True
如果event.type==pygame.KEYUP:
如果event.key==pygame.K\u d:moving\u right=False
如果event.key==pygame.K\u a:moving\u left=False
如果event.key==pygame.K\u w:moving\u up=False
屏幕填充(天蓝色)
摄像机更新(播放器)
player.update()
blit(player.image,player.rect)
对于地形列表中的块:
屏幕。blit(块。图像,相机。应用(块))
#画瓷砖线-----------------------------------------------------
如果绘制瓷砖:
x=0
y=0
对于范围内的i(右边界//2):
pygame.draw.line(屏幕,黑色,
[x,上_边界],[x,下_边界])
pygame.draw.line(屏幕,黑色,
[左边界,y],[右边界,y])
x+=瓷砖尺寸
y+=瓷砖大小
#瓷砖试验
pygame.draw.rect(屏幕,黑色,
(34*瓷砖尺寸,24*瓷砖尺寸,瓷砖尺寸,瓷砖尺寸)
pygame.display.flip()
时钟滴答(60)
pygame.quit()

相机。应用(目标)
可能应该做一些涉及到
自我状态的事情,而不是
目标.rect.move(1,1)

怎么办它不工作了?我不能让它工作-可能不行。如果你解释一下代码在做什么和应该做什么,那会有帮助。@japreis只是相机部分不工作。屏幕应随着播放器在屏幕中央移动