如何解决如何在pygame中实现相机移动
我需要相机,因为将来我会为这个游戏添加一张地图。我如何在顶视图游戏中进行相机移动(最好是像 this 这样的平滑移动)。
我尝试使用互联网上的大多数代码,但它对我不起作用。如果我的代码有错误,请告诉我。
这是我的代码(没有图像的完整游戏):
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)
GREEN = (0,100,0)
BLUE = (0,255)
WHITE = (155,155,155)
BLACK = (0,0)
broWN = (255,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,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,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,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))
self.posx = player.rect.centerx
self.posy = player.rect.centery
self.direction = direction
self.pos = pygame.Vector2(self.rect.center)
def update(self,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)
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,text3)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。