2017-06-19 814 views
-1

我一直在嘗試製作過去2天的太空射擊遊戲,我想讓背景滾動下來,但我不知道如何。 繼承人我的代碼:如何使用pygame在python中製作滾動背景?

import pygame 
import time 
pygame.init() 

width = 800 
height = 600 

black = (0,0,0) 
white = (255,255,255) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 

ship_width = 35 
ship_height = 64 

disp = pygame.display.set_mode((width,height)) 

pygame.display.set_caption("Space Jump") 

clock = pygame.time.Clock() 

background = pygame.image.load("Space.png").convert() 

shipImg = pygame.image.load("Ship.png") 

def ship(x,y): 
    disp.blit(shipImg, (x,y)) 

def gameLoop(): 
    x = (width * 0.45) 
    y = (height * 0.8) 

x_ch = 0 
y_ch = 0 

gameExit = False 

while not gameExit: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      gameExit = True 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       x_ch = -5 
      elif event.key == pygame.K_RIGHT: 
       x_ch = 5 
      elif event.key == pygame.K_UP: 
       y_ch = -5 
      elif event.key == pygame.K_DOWN: 
       y_ch = 5 


     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
       x_ch = 0 
      if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
       y_ch = 0 

    x += x_ch 
    y += y_ch 

    if x > width - ship_width or x < 0: 
     x_ch = 0 

    if y > height - ship_height or y < 0: 
     y_ch = 0 
    x_bg = 0 
    while True: 
     disp.blit(background, (0,x_bg)) # i tried this but when i launch 
             #a black screen just appears without 
     x_bg -= 1      #any image 
    ship(x,y) 

    pygame.display.update() 
    clock.tick(60) 

gameLoop() 
pygame.quit() 
quit() 

我有一個背景,我希望把它向下滾動連續你能幫助我嗎?

+1

[添加SCRO的可能的複製在pygame中的平臺遊戲](https://stackoverflow.com/questions/14354171/add-scrolling-to-a-platformer-in-pygame) –

回答

1

有些事情第一:

  • 解決您的壓痕
  • 你的船的功能幾乎是無用
  • 使用矩形來處理移動
  • 你真正的問題是,你的代碼永遠不會達到pygame.display.update()因爲你的第二個while循環

所以,爲了做出無盡的滾動背景,而簡單的方法是做到以下幾點:

BLIT背景圖像兩次,一旦在y位置,而一旦在y + image_width(與x取代y你想要的)。然後,您的主循環的每一次迭代都可以從y中減去以創建運動。一旦圖像移動它的整個高度上,復位y起始值


這裏的一個完整的例子,示出了一個滾動背景(以及如何使用精靈,組,載體和rects):

import pygame 
pygame.init() 
SCREEN = pygame.display.set_mode((300, 300)) 

move_map = {pygame.K_w: pygame.math.Vector2(0, -1), 
      pygame.K_s: pygame.math.Vector2(0, 1), 
      pygame.K_a: pygame.math.Vector2(-1, 0), 
      pygame.K_d: pygame.math.Vector2(1, 0)} 

class Actor(pygame.sprite.Sprite): 
    def __init__(self, group, color, pos, size=(30, 30)): 
     self.image = pygame.Surface(size) 
     self.image.fill(color) 
     self.rect = self.image.get_rect(center=pos) 
     pygame.sprite.Sprite.__init__(self, group) 

class Bullet(Actor): 
    def __init__(self, *args): 
     Actor.__init__(self, *args) 
     self.speed = 10 

    def update(self): 
     self.rect.move_ip(self.speed, 0) 
     if not SCREEN.get_rect().colliderect(self.rect): 
      self.kill() 

class Player(Actor): 
    def __init__(self, *args): 
     self._layer = 4 
     Actor.__init__(self, *args) 
     self.speed = 4 
     self.timeout = 0 

    def update(self): 
     p = pygame.key.get_pressed() 
     move_vector = pygame.math.Vector2(0, 0) 
     for v in [move_map[key] for key in move_map if p[key]]: 
      move_vector += v 
     if move_vector: 
      self.rect.move_ip(*move_vector.normalize() * self.speed) 
      self.rect.clamp_ip(SCREEN.get_rect()) 

     if self.timeout : 
      self.timeout -= 1 
     if p[pygame.K_SPACE] and not self.timeout: 
      Bullet(self.groups()[0], (130, 200, 77), self.rect.center, (10, 3)) 
      self.timeout = 5 


class Background(pygame.sprite.Sprite): 
    def __init__(self, number, *args): 
     self.image = pygame.image.load('back.jpg').convert() 
     self.rect = self.image.get_rect() 
     self._layer = -10 
     pygame.sprite.Sprite.__init__(self, *args) 
     self.moved = 0 
     self.number = number 
     self.rect.x = self.rect.width * self.number 

    def update(self): 
     self.rect.move_ip(-1, 0) 
     self.moved += 1 

     if self.moved >= self.rect.width: 
      self.rect.x = self.rect.width * self.number 
      self.moved = 0 

group = pygame.sprite.LayeredUpdates() 
Player(group, (255, 255, 255), (100, 100)) 
Background(0, group) 
Background(1, group) 

clock = pygame.time.Clock() 
run = True 
while run: 
    for e in pygame.event.get(): 
     if e.type ==pygame.QUIT: 
      run = False 
    SCREEN.fill((0,0,0)) 
    group.update() 
    group.draw(SCREEN) 
    pygame.display.flip() 
    clock.tick(60) 

爲了測試這一點,你可以使用此圖片(保存爲back.jpg):

enter image description here

+0

即時通訊新的proggraming,我不能完全理解你的solutuon你可以做一個示例代碼? –

+0

@ErenBiçer我添加了一個完整的例子 – sloth

+0

這對我來說太複雜了,你可以添加滾動背景的代碼嗎?(向下) –