我想創建一個「雷電2」的靜脈自上而下的拍攝,我無法添加滾動的地圖。當我添加一個矩形地圖幷包含相機類時,相機不會將該船放置在地圖的底部,允許該船飛向地圖的下半部分,或者將該船保持在屏幕的中間。添加滾動到上/下射手
我想把船放在地圖的底部和相機上緩慢向上滾動,保持船在同一個地方。
下面是遊戲的簡化版本與船舶,你可以在屏幕上控制:
import sys, pygame, os, math
# Force static position of screen
os.environ['SDL_VIDEO_CENTERED'] = '1'
# Constants
LEFT = 'left'
RIGHT = 'right'
BLACK = (0, 0, 0)
GRAY = (70, 70, 70)
WHITE = (255, 255, 255)
WIN_W = 500
WIN_H = 800
SHIP_WIDTH = WIN_W/15
SHIP_HEIGHT = WIN_H/15
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Ship(Entity):
def __init__(self, container):
Entity.__init__(self)
self.speed = 5
self.image = pygame.Surface((SHIP_WIDTH, SHIP_HEIGHT)).convert()
self.rect = self.image.get_rect()
self.rect.centerx = container.centerx
self.rect.y = container.centery
def update(self):
key = pygame.key.get_pressed()
if key[pygame.K_w]:
self.rect.centery -= self.speed
if key[pygame.K_s]:
self.rect.centery += self.speed
if key[pygame.K_d]:
self.rect.centerx += self.speed
if key[pygame.K_a]:
self.rect.centerx -= self.speed
# Ship Movement Boundaries
if self.rect.y < 0:
self.rect.y = 0
if self.rect.y > WIN_H - SHIP_HEIGHT:
self.rect.y = WIN_H - SHIP_HEIGHT
if self.rect.x < 0:
self.rect.x = 0
if self.rect.x > WIN_W - SHIP_WIDTH:
self.rect.x = WIN_W - SHIP_WIDTH
def main():
# Initialize Everything
pygame.init()
fps = 60
clock = pygame.time.Clock()
play = True
pygame.display.set_caption('Raiden')
screen = pygame.display.set_mode((WIN_W, WIN_H), pygame.SRCALPHA)
# Create Groups
shipGroup = pygame.sprite.Group()
# Create Game Objects
ship = Ship(pygame.rect.Rect(0, 0, WIN_W, WIN_H))
# Add Game Objects to Groups
shipGroup.add(ship)
# Gameplay
while play:
# Checks if window exit button pressed
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
# Update
ship.update()
# Print Background/Sprites
screen.fill(WHITE)
shipGroup.draw(screen)
# Limits frames per iteration of while loop
clock.tick(fps)
# Writes to main surface
pygame.display.flip()
if __name__ == "__main__":
這是當我添加一個矩形圖用相機類個究竟,發現地圖上有5'平臺'在右側,但是遊戲不允許你前往地圖的下半部分。
import sys, pygame, os, math
# Force static position of screen
os.environ['SDL_VIDEO_CENTERED'] = '1'
# Constants
LEFT = 'left'
RIGHT = 'right'
BLACK = (0, 0, 0)
GRAY = (70, 70, 70)
WHITE = (255, 255, 255)
WIN_W = 500
WIN_H = 800
SHIP_WIDTH = WIN_W/15
SHIP_HEIGHT = WIN_H/15
class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
class Ship(Entity):
def __init__(self, container):
Entity.__init__(self)
self.speed = 5
self.image = pygame.Surface((SHIP_WIDTH, SHIP_HEIGHT)).convert()
self.rect = self.image.get_rect()
self.rect.centerx = container.centerx
self.rect.y = container.centery
def update(self):
key = pygame.key.get_pressed()
if key[pygame.K_w]:
self.rect.centery -= self.speed
if key[pygame.K_s]:
self.rect.centery += self.speed
if key[pygame.K_d]:
self.rect.centerx += self.speed
if key[pygame.K_a]:
self.rect.centerx -= self.speed
# Ship Movement Boundaries
if self.rect.y < 0:
self.rect.y = 0
if self.rect.y > WIN_H - SHIP_HEIGHT:
self.rect.y = WIN_H - SHIP_HEIGHT
if self.rect.x < 0:
self.rect.x = 0
if self.rect.x > WIN_W - SHIP_WIDTH:
self.rect.x = WIN_W - SHIP_WIDTH
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 simple_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
return pygame.Rect(-l+WIN_W/2, -t+WIN_H/2, w, h)
def complex_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
l, t, _, _ = -l+WIN_W/2, -t+WIN_H/2, w, h
l = min(0, l) # stop scrolling at the left edge
l = max(-(camera.width-WIN_W), l) # stop scrolling at the right edge
t = max(-(camera.height-WIN_H), t) # stop scrolling at the bottom
t = min(0, t) # stop scrolling at the top
return pygame.Rect(l, t, w, h)
class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = pygame.Surface((32, 32))
self.image.convert()
self.image.fill(GRAY)
self.rect = pygame.Rect(x, y, 32, 32)
def update(self):
pass
def main():
# Initialize Everything
pygame.init()
fps = 60
clock = pygame.time.Clock()
play = True
pygame.display.set_caption('Raiden')
screen = pygame.display.set_mode((WIN_W, WIN_H), pygame.SRCALPHA)
# Create Groups
shipGroup = pygame.sprite.Group()
backgroundGroup = pygame.sprite.Group()
# Load Level
platforms = []
x = y = 0
level = [
"PPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P P",
"P P",
"PPPP P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"PPPP P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P PPPP",
"P P",
"PPPP P",
"P P",
"PPPP P",
"P P",
"P PPPP",
"P P",
"P P",
"PPPP P",
"P P",
"P P",
"P PPPP",
"P P",
"PPPP P",
"P P",
"P PPPP",
"P P",
"PPPP P",
"P P",
"P P",
"P P",
"P P",
"PPPP P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P PPPP",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"PPPP P",
"P P",
"P P",
"P P",
"P P",
"P P",
"P P",
"PPPPPPPPPPPPPPPP",]
# build the level
for row in level:
for col in row:
if col == "P":
p = Platform(x, y)
platforms.append(p)
backgroundGroup.add(p)
x += 32
y += 32
x = 0
total_level_width = len(level[0])*32
total_level_height = len(level)*32
camera = Camera(complex_camera, total_level_width, total_level_height)
# Create Game Objects
ship = Ship(pygame.rect.Rect(0, 0, WIN_W, WIN_H))
# Add Game Objects to Groups
shipGroup.add(ship)
# Gameplay
while play:
# Checks if window exit button pressed
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
camera.update(ship)
# Update
ship.update()
# Print Background/Sprites
screen.fill(WHITE)
for e in backgroundGroup:
screen.blit(e.image, camera.apply(e))
shipGroup.draw(screen)
# Limits frames per iteration of while loop
clock.tick(fps)
# Writes to main surface
pygame.display.flip()
if __name__ == "__main__":
main()