python - 如何在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)
解决方案
推荐阅读
- javascript - 如何在子窗口的父窗口中运行脚本?
- javascript - 与nextjs在同一页面上链接页面
- javascript - JSON 不会被数组中的变量解析
- javascript - 错误:
属性 dy:预期长度,“NaN” - Raphael.js - sonata-admin - 奏鸣曲管理员缺少 css 文件
- python - 使用访问令牌请求 Bitbucket API
- bash - Bash 脚本:复制特殊变量 $@
- c - 在C中将int值添加到字符串
- axapta - 为什么AOT中的对象标有红叉?
- selenium - NoSuchElementException:没有这样的元素:尝试通过 Selenium 单击 amazon.co.uk 上的下拉元素时无法找到元素