2017-06-19 2 views
-1

私は過去2日間宇宙戦闘ゲームを作ろうとしていました。私はバックグラウンドをスクロールダウンさせたいのですが、どうやってどうやっているのか分かりません。 HERESに私のコード: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

が重複する可能性をpygameのplatformerに夢中になる](https://stackoverflow.com/questions/14354171/add-scrolling-to-a-platformer-in-pygame) –

答えて

1

最初のいくつかの点:

  • はあなたのインデント
  • あなたの船の機能は、あなたの本当の問題は、のためにあなたのコードはpygame.display.update()に到達したことがないということです
  • を移動処理するためのRectを使用
  • 事実上無用である修正あなたの2番目のwhileループ

したがって、無限のスクロールバックグラウンドを作成するには、二回、一度位置yで、そして一度y + image_widthで(あなたたいのxyを置き換える)

ブリットあなたの背景画像:簡単な方法は、次の操作を実行することです。その後、メインループの繰り返しごとに、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として保存):[追加SCROの

enter image description here

+0

私はプログラムに新しいと私はあなたのsolutuonを理解することはできませんコード例? –

+0

@ErenBiçer – sloth

+0

これは私にとっては複雑すぎるのですが、スクロールバックグラウンドのコードを追加するだけでいいですか?(下向き) –