Background pygame,停止背景滚动
我想阻止屏幕背景图像与播放器一起移动,但我不知道该怎么做。下面是一个例子,当玩家移动背景图像时,背景图像也随之移动。我只想让相机随着播放器移动,背景保持静止。有人能帮忙吗 示例:Background pygame,停止背景滚动,background,python-2.7,scroll,pygame,Background,Python 2.7,Scroll,Pygame,我想阻止屏幕背景图像与播放器一起移动,但我不知道该怎么做。下面是一个例子,当玩家移动背景图像时,背景图像也随之移动。我只想让相机随着播放器移动,背景保持静止。有人能帮忙吗 示例: import pygame from pygame import * WIN_WIDTH = 800 WIN_HEIGHT = 640 HALF_WIDTH = int(WIN_WIDTH / 2) HALF_HEIGHT = int(WIN_HEIGHT / 2) DISPLAY = (WIN_WIDTH, WI
import pygame
from pygame import *
WIN_WIDTH = 800
WIN_HEIGHT = 640
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)
DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 0
FLAGS = 0
CAMERA_SLACK = 30
def main():
pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
pygame.display.set_caption("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
timer = pygame.time.Clock()
up = left = right = False
entities = pygame.sprite.Group()
player = Player(32, 32)
platforms = []
x = 0
y = 0
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPPP PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPPPPPPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"PPPPP PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPPP PPPP PPPPPPP",
"P PPPP",
"P PPPP",
"P PPPP",
"P PPPPPPPPPPPPPPPPPP",
"P PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
total_level_width = len(level[0]) * 32
total_level_height = len(level) * 32
#print(total_level_width, total_level_height)
background = pygame.image.load("Untitled.png")
# build the level
for row in level:
for col in row:
if col == "P":
p = Platform(x, y)
platforms.append(p)
entities.add(p)
if col == "E":
e = ExitBlock(x, y)
platforms.append(e)
entities.add(e)
x += 32
y += 32
x = 0
camera = Camera(complex_camera, total_level_width, total_level_height)
entities.add(player)
while 1:
timer.tick(60)
for e in pygame.event.get():
if e.type == QUIT: raise SystemExit, "QUIT"
if e.type == KEYDOWN and e.key == K_ESCAPE:
raise SystemExit, "ESCAPE"
if e.type == KEYDOWN and e.key == K_UP:
up = True
if e.type == KEYDOWN and e.key == K_LEFT:
left = True
if e.type == KEYDOWN and e.key == K_RIGHT:
right = True
if e.type == KEYUP and e.key == K_UP:
up = False
if e.type == KEYUP and e.key == K_LEFT:
left = False
if e.type == KEYUP and e.key == K_RIGHT:
right = False
# draw background
screen.blit(background, (0,0))
#draw entities
for e in entities:
screen.blit(e.image, camera.apply(e))
# update player, update camera, and refresh
player.update(up, left, right, platforms)
camera.update(player)
pygame.display.flip()
class Camera(object):
def __init__(self, camera_func, width, height):
self.camera_func = camera_func
self.state = 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 left
l = max(-(camera.width - WIN_WIDTH), l) # stop scrolling right
t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling bottom
return Rect(l, t, w, h)
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Player(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = Surface((32,32))
self.image.fill(Color("#0000FF"))
self.image.convert()
self.rect = Rect(200, 1200, 32, 32)
def update(self, up, left, right, platforms):
print(self.yvel)
if up:
if self.onGround:
self.yvel = 0
self.yvel -= 10 # only jump if on the ground
if left:
self.xvel = -8
if right:
self.xvel = 8
if not self.onGround:
self.yvel += 0.3 # only accelerate with gravity if in the air
if self.yvel > 80: self.yvel = 80 # max falling speed
if not(left or right):
self.xvel = 0
self.rect.left += self.xvel # increment in x direction
self.collide(self.xvel, 0, platforms) # do x-axis collisions
self.rect.top += self.yvel # increment in y direction
self.onGround = False; # assuming we're in the air
self.collide(0, self.yvel, platforms) # do y-axis collisions
def collide(self, xvel, yvel, platforms):
for p in platforms:
if pygame.sprite.collide_rect(self, p):
if isinstance(p, ExitBlock):
pygame.event.post(pygame.event.Event(QUIT))
if xvel > 0: self.rect.right = p.rect.left
if xvel < 0: self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
if yvel < 0:
self.rect.top = p.rect.bottom
class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#FFFFFF"))
self.rect = Rect(x, y, 32, 32)
def update(self):
pass
class ExitBlock(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image = pygame.image.load("bush.png")
if __name__ == "__main__":
main()
代码:
import pygame
from pygame import *
WIN_WIDTH = 800
WIN_HEIGHT = 640
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)
DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 0
FLAGS = 0
CAMERA_SLACK = 30
def main():
pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
pygame.display.set_caption("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
timer = pygame.time.Clock()
up = left = right = False
entities = pygame.sprite.Group()
player = Player(32, 32)
platforms = []
x = 0
y = 0
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPPP PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPPPPPPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"PPPPP PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPP PPPPPPP",
"P PPPPP PPPP PPPPPPP",
"P PPPP",
"P PPPP",
"P PPPP",
"P PPPPPPPPPPPPPPPPPP",
"P PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
total_level_width = len(level[0]) * 32
total_level_height = len(level) * 32
#print(total_level_width, total_level_height)
background = pygame.image.load("Untitled.png")
# build the level
for row in level:
for col in row:
if col == "P":
p = Platform(x, y)
platforms.append(p)
entities.add(p)
if col == "E":
e = ExitBlock(x, y)
platforms.append(e)
entities.add(e)
x += 32
y += 32
x = 0
camera = Camera(complex_camera, total_level_width, total_level_height)
entities.add(player)
while 1:
timer.tick(60)
for e in pygame.event.get():
if e.type == QUIT: raise SystemExit, "QUIT"
if e.type == KEYDOWN and e.key == K_ESCAPE:
raise SystemExit, "ESCAPE"
if e.type == KEYDOWN and e.key == K_UP:
up = True
if e.type == KEYDOWN and e.key == K_LEFT:
left = True
if e.type == KEYDOWN and e.key == K_RIGHT:
right = True
if e.type == KEYUP and e.key == K_UP:
up = False
if e.type == KEYUP and e.key == K_LEFT:
left = False
if e.type == KEYUP and e.key == K_RIGHT:
right = False
# draw background
screen.blit(background, (0,0))
#draw entities
for e in entities:
screen.blit(e.image, camera.apply(e))
# update player, update camera, and refresh
player.update(up, left, right, platforms)
camera.update(player)
pygame.display.flip()
class Camera(object):
def __init__(self, camera_func, width, height):
self.camera_func = camera_func
self.state = 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 left
l = max(-(camera.width - WIN_WIDTH), l) # stop scrolling right
t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling bottom
return Rect(l, t, w, h)
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Player(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = Surface((32,32))
self.image.fill(Color("#0000FF"))
self.image.convert()
self.rect = Rect(200, 1200, 32, 32)
def update(self, up, left, right, platforms):
print(self.yvel)
if up:
if self.onGround:
self.yvel = 0
self.yvel -= 10 # only jump if on the ground
if left:
self.xvel = -8
if right:
self.xvel = 8
if not self.onGround:
self.yvel += 0.3 # only accelerate with gravity if in the air
if self.yvel > 80: self.yvel = 80 # max falling speed
if not(left or right):
self.xvel = 0
self.rect.left += self.xvel # increment in x direction
self.collide(self.xvel, 0, platforms) # do x-axis collisions
self.rect.top += self.yvel # increment in y direction
self.onGround = False; # assuming we're in the air
self.collide(0, self.yvel, platforms) # do y-axis collisions
def collide(self, xvel, yvel, platforms):
for p in platforms:
if pygame.sprite.collide_rect(self, p):
if isinstance(p, ExitBlock):
pygame.event.post(pygame.event.Event(QUIT))
if xvel > 0: self.rect.right = p.rect.left
if xvel < 0: self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
if yvel < 0:
self.rect.top = p.rect.bottom
class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#FFFFFF"))
self.rect = Rect(x, y, 32, 32)
def update(self):
pass
class ExitBlock(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image = pygame.image.load("bush.png")
if __name__ == "__main__":
main()
导入pygame
从pygame导入*
宽度=800
WIN_高度=640
半宽度=整数(半宽度/2)
半高=整数(赢高/2)
显示=(窗口宽度、窗口高度)
深度=0
标志=0
摄像机的松弛度=30
def main():
pygame.init()
screen=pygame.display.set_模式(显示、标志、深度)
pygame.display.set_标题(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”)
timer=pygame.time.Clock()
向上=左=右=假
entities=pygame.sprite.Group()
玩家=玩家(32,32)
平台=[]
x=0
y=0
级别=[
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“P”,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“ppppppppppppppppppp”,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“ppppppppppppppppppp”,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“P PPPP”,
“P PPPP”,
“P PPPP”,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp,
“pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
总水平宽度=长度(水平[0])*32
总高度=长度(高度)*32
#打印(总水平宽度、总水平高度)
background=pygame.image.load(“Untitled.png”)
#建立水平
对于级别中的行:
对于行中的列:
如果col==“P”:
p=平台(x,y)
平台。附加(p)
实体.添加(p)
如果列==“E”:
e=退出锁定(x,y)
平台。附加(e)
实体.添加(e)
x+=32
y+=32
x=0
照相机=照相机(复杂照相机、总水平宽度、总水平高度)
实体。添加(玩家)
而1:
计时器。滴答(60)
对于pygame.event.get()中的e:
如果e.type==QUIT:raisesystemexit,“QUIT”
如果e.type==KEYDOWN和e.key==K_ESCAPE:
升起系统出口,“逃生”
如果e.type==KEYDOWN和e.key==K_UP:
向上=正确
如果e.type==KEYDOWN和e.key==K_LEFT:
左=真
如果e.type==KEYDOWN和e.key==K_RIGHT:
右=真
如果e.type==KEYUP和e.key==K\u-UP:
向上=错误
如果e.type==KEYUP和e.key==K_LEFT:
左=假
如果e.type==KEYUP和e.key==K_RIGHT:
右=假
#画背景
屏幕光点(背景,(0,0))
#绘制实体
对于电子商务实体:
屏幕。blit(如图像、照相机、应用(e))
#更新播放器、更新相机和刷新
player.update(上、左、右、平台)
摄像机更新(播放器)
pygame.display.flip()
类摄影机(对象):
定义初始值(自身、相机功能、宽度、高度):
self.camera\u func=camera\u func
self.state=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, t = target_rect.topleft
w, h = camera.size
screen.blit(background, (0,0))
screen.blit(background, camera.apply((0,0)))
class Camera(object):
def __init__(self, camera_func, width, height):
self.camera_func = camera_func
self.state = Rect(0, 0, width, height)
def apply(self, target):
try:
return target.rect.move(self.state.topleft)
except AttributeError:
return map(sum, zip(target, self.state.topleft))
def update(self, target):
self.state = self.camera_func(self.state, target.rect)