首页 > 解决方案 > 如何在pygame中实现相机移动

问题描述

我需要相机,因为将来我会在这个游戏中添加地图。我如何在顶视图游戏中进行相机移动(最好像这样平滑移动)。

我尝试使用互联网上的大多数代码,但它对我不起作用。如果我的代码有错误,请告诉我。

这是我的代码(没有图像的完整游戏):

import pygame
import time
from random import randint
from random import uniform

run = True
pygame.init()
pygame.display.set_caption("practise")
fps = 30
clock = pygame.time.Clock()
RED = (255, 0, 0)
GREEN = (0, 100, 0)
BLUE = (0, 0, 255)
WHITE = (155, 155, 155)
BLACK = (0, 0, 0)
BROWN = (255, 100, 0)
YELLOW = (255, 255, 0)
BACKGROUND = (30, 40, 50)

class Main(pygame.sprite.Sprite):
    def __init__(self,player):
        pygame.sprite.Sprite.__init__(self)
        self.done = False
        self.screen_width = 800
        self.screen_height = 600
        self.speed = 3
        self.image = pygame.Surface((800, 600))
        self.image.fill((30, 40, 50))
        self.screen = pygame.display.set_mode(
            (self.screen_width, self.screen_height))
        self.angle = 90
        self.screen.fill(BACKGROUND)
        self.direction = pygame.Vector2(1, 0)
        # Данный код создает игрока, благодаря этому коду можно сделать мультиплеер
        self.all_sprites = pygame.sprite.Group()
        self.players=pygame.sprite.Group()
        self.players.add(player)
        self.all_sprites.add(player)
        self.bullets_group = pygame.sprite.Group()
        self.mob_group = pygame.sprite.Group()
        self.gamestatus = 1
        self.ammo='31'
        self.msgtimer=0
        self.startreload=0
    def handlekeys(self):
        keys = pygame.key.get_pressed()
        self.bullet = Bullets(player.rect.center, self.direction.normalize())
        if keys[pygame.K_w]:
            player.rect.centery -= self.speed
            self.angle = 90
        if keys[pygame.K_s]:
            player.rect.centery += self.speed
            self.angle = 270
        if keys[pygame.K_a]:
            player.rect.centerx -= self.speed
            self.angle = 180
        if keys[pygame.K_d]:
            player.rect.centerx += self.speed
            self.angle = 0
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    if not self.ammo=='0':
                        bullet = Bullets(player.rect.center, self.direction)
                        self.bullets_group.add(bullet)
                        self.all_sprites.add(bullet)
                        self.ammo = int(self.ammo)
                        self.ammo-=1
                        self.ammo=str(self.ammo)
                    else:
                        self.last = time.time()
                        self.msgtimer=1
                    # Данный код нужен чтобы зомби не спавнились по многу раз при выстреле
                    if self.gamestatus == 1:
                        self.gamestatus = 0
                        self.image.fill(pygame.Color(BACKGROUND))
                        for i in range(5):
                            player.rect.center=(400,300)
                            zombie=Zombie()
                            self.all_sprites.add(zombie)
                            self.mob_group.add(zombie)
                if event.key == pygame.K_r:
                    if self.ammo=='30' and self.startreload!=1:
                        self.last = time.time()
                        self.msgtimer=2
                    else:
                        self.last=time.time()
                        self.startreload=1
                if event.key == pygame.K_ESCAPE:
                    exit()
        self.direction = pygame.Vector2(1, 0).rotate(-self.angle)
    def update(self):
        events = pygame.event.get()
        self.all_sprites.update(events,main.angle)
    def draw(self):
        self.screen.blit(self.image, (0, 0))
        self.all_sprites.draw(self.screen)  # Draw the contained sprites.
        pygame.display.update()
    def msg(self,text,x,y,color,text2,text3):
        textsize = pygame.font.Font('freesansbold.ttf', 30)
        textsurface = textsize.render(text, True, color)
        textrect = textsurface.get_rect()
        textrect.center = ((x), y)
        main.image.blit(textsurface, textrect)
        textsize2 = pygame.font.Font('freesansbold.ttf', 30)
        textsurface2 = textsize.render(text2, True, YELLOW)
        textrect2 = textsurface.get_rect()
        textrect2.center = ((x), y+30)
        main.image.blit(textsurface2, textrect2)
        textsize3 = pygame.font.Font('freesansbold.ttf', 30)
        textsurface3 = textsize3.render(text3, True, WHITE)
        textrect3 = textsurface3.get_rect()
        textrect3.center = ((400), 560)
        main.image.blit(textsurface3, textrect3)
class Player(pygame.sprite.Sprite):
    def __init__(self,pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10, 20))
        self.image.fill(BLUE)
        self.direction = pygame.Vector2(1, 0)
        pos=(-500,-500)
        self.rect=self.image.get_rect(center=(pos))
        self.pos = pygame.Vector2(pos)
class Zombie(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((10, 20))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect(center=(randint(0,800),randint(0,600)))
        self.speed=uniform(1,1.9)

    def update(self,events,angle):
        self.coords=[]
        if player.rect.centerx < self.rect.centerx:
            self.rect.centerx -= self.speed
            self.coords.append(self.rect.center)
        if player.rect.centerx > self.rect.centerx:
            self.rect.centerx += self.speed
            self.coords.append(self.rect.center)
        if player.rect.centery < self.rect.centery:
            self.rect.centery -= self.speed
            self.coords.append(self.rect.center)
        if player.rect.centery > self.rect.centery:
            self.rect.centery += self.speed
            self.coords.append(self.rect.center)
class Bullets(pygame.sprite.Sprite):
    def __init__(self, pos,direction):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((5, 5))
        self.image.fill(YELLOW)
        self.rect = self.image.get_rect(center=pos)
        self.bullet=pygame.draw.rect(self.image, pygame.Color('orange'), (4,4,4,4))
        self.posx = player.rect.centerx
        self.posy = player.rect.centery
        self.direction = direction
        self.pos = pygame.Vector2(self.rect.center)
    def update(self,events,angle):
        self.pos += self.direction * randint(3,9)
        self.rect.center = self.pos
        if not pygame.display.get_surface().get_rect().contains(self.rect):
            self.kill()
while run:
    scores = '0'
    ammo = '30'
    text = 'Kills:'
    text2 = 'Ammo:'
    text3=''
    main = Main(Player((400,500)))
    player = Player((400,500))
    zombie = Zombie()
    main.all_sprites.add(player)
    player_group=pygame.sprite.Group()
    player_group.add(player)
    events = pygame.event.get()
    bullet=Bullets(player.rect.center,main.direction)
    world=pygame.Surface((1000,1000))
    while not main.done:
        if main.gamestatus==1:
            main.msg('Press space for play game',400,300,BLUE,'',text3)
        else:
            main.msg(text + scores, 700, 25, RED, text2 + main.ammo,text3)
            b = str(main.mob_group)
            b = b[7:]
            b = b[:1]
            b = int(b)
            if b < 5:
                zombie=Zombie()
                main.mob_group.add(zombie)
                main.all_sprites.add(zombie)
        pygame.display.flip()
        main.handlekeys()
        main.update()
        main.draw()
        zombie.update(events,main.angle)
        all_sprites=pygame.sprite.Group()
        all_sprites.add(player)
        bullet.update(events,main.angle)
        clock.tick(fps)
        hit=pygame.sprite.groupcollide(main.mob_group,main.bullets_group,True,True)
        hit1=pygame.sprite.groupcollide(player_group,main.mob_group,False,True)
        if main.msgtimer>0:
            now=time.time()
            if int(now-main.last)<1:
                if main.msgtimer==1:
                    text3='Press R to reload'
                if main.msgtimer==2 and main.ammo=='30':
                    text3='Already full ammo'
            else:
                main.starttimer=0
                text3=''
        if main.startreload==1:
            now=time.time()
            text3='Reloading...'
            if int(now-main.last)>1.5:
                main.ammo='30'
                text3=''
                main.startreload=0
        main.image.fill(pygame.Color(BACKGROUND))
        if hit or hit1:
            scores=int(scores)
            scores+=1
            scores=str(scores)
            main.image.fill(pygame.Color(BACKGROUND))
            main.msg(text + scores, 700, 25, RED, text2 + main.ammo,text3)

标签: pythonpygamecamera

解决方案


推荐阅读