簡體   English   中英

當我的 Sprite 左右移動時,如何讓我的背景滾動? Pygame

[英]How do I make my background scroll as my Sprite moves left and right? Pygame

現在我的游戲是這樣工作的:我的精靈可以左右移動,跳躍和射擊火球(子彈)。 但是,一旦我的精靈越過背景表面的限制,它就會離開屏幕。 所以我想讓背景隨着我的精靈一起移動。 當我的玩家精靈向屏幕邊緣移動大約 50 像素時,背景也會移動。 如何使用 Pygame 創建這個? 我找到了相當多的資源,它們向您展示了如何做到這一點,但使用的是純色背景。 但是我的背景是我加載到游戲中的圖像,所以我想學習如何使用圖像作為背景。 一旦精靈接近兩邊的極限,如何讓它重復。 我將代碼分成 3 個不同的文件:Main.py、settings.py 和 Sprite1.py。 這是 Main.py:

import pygame
import os
import sys
import time
from pygame import mixer
from Sprite1 import *
from settings import *

'''
Setup
'''
pygame.init()

clock = pygame.time.Clock()

pygame.mixer.music.load('.\\sounds\\Fairy.mp3')
pygame.mixer.music.play(-1, 0.0)

all_sprites = pygame.sprite.Group()
player = Player(all_sprites)

player.rect.x = 50
player.rect.y = 500




showStartScreen(surface)

'''
Main loop
'''

main = True

while main == True:

    background = pygame.image.load(os.path.join('images', 'Bg.png'))
    surface.blit(background, (0,0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
            main = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                player.control(-steps,0)

            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                player.control(steps,0)

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                player.control(steps,0)

            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                player.control(-steps,0)

    keys = pygame.key.get_pressed()
    if not(isJump):
        if keys[pygame.K_UP]:
            isJump = True
    else:
        if jumpCount >= -10:
            player.rect.y -= (jumpCount * abs(jumpCount)) * 1
            jumpCount -= 2
        else:
            jumpCount = 10
            isJump = False

    # dt = time since last tick in milliseconds.
    dt = clock.tick(60) / 1000
    all_sprites.update(dt)
    player.update(dt)
    all_sprites.draw(surface) #refresh player position
    pygame.display.flip()

這是settings.py:

import pygame
isJump = False
jumpCount = 10
width = 960
height = 720
fps = 40        # frame rate
#ani = 4        # animation cycles
pygame.display.set_caption('B.S.G.')
surface = pygame.display.set_mode((width, height))
PLAYER_ACC = 0.5
PLAYER_FRICTION = -0.12
PLAYER_GRAV = 0.8
PLAYER_JUMP = 20
PLAYER_LAYER = 2
PLATFORM_LAYER = 1

steps = 10      # how fast to move

這是 Sprite1.py:

import pygame
import sys
import os
import time
from pygame import mixer
from pygame.locals import *
from settings import *
vec = pygame.math.Vector2

def showStartScreen(surface):
    show = True
    while (show == True):
        background = pygame.image.load(os.path.join('images', 'Starting_scr.png'))
        # rect = surface.get_rect()
        surface.blit(background, (0,0))
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                show = False

class Player(pygame.sprite.Sprite):
    def __init__(self, all_sprites):
        pygame.sprite.Sprite.__init__(self)
        self.movex = 0
        self.movey = 0
        self.frame = 0
        self.health = 10
        self.jumping = False
        self.images = []
        self.imagesleft = []
        self.imagesright = []
        self.direction = "right"
        self.alpha = (0,0,0)
        self.ani = 4 # animation cycles
        self.all_sprites = all_sprites
        self.add(self.all_sprites)
        self.bullet_timer = .1

        for i in range(1,5):
            img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
            img.convert_alpha()
            img.set_colorkey(self.alpha)
            self.imagesright.append(img)
            self.image = self.imagesright[0]
            self.rect  = self.image.get_rect()

        for i in range(1,5):
            img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
            img = pygame.transform.flip(img, True, False)
            img.convert_alpha()
            img.set_colorkey(self.alpha)
            self.imagesleft.append(img)
            self.image = self.imagesleft[0]
            self.rect  = self.image.get_rect()

    def control(self,x,y):
        '''
        control player movement
        '''
        self.movex += x
        self.movey -= y

    def update(self, dt):
        '''
        Update sprite position
        '''
        self.rect.x = self.rect.x + self.movex
        self.rect.y = self.rect.y + self.movey

        # moving left
        if self.movex < 0:
            self.frame += 1
            if self.frame > 3*self.ani:
                self.frame = 0
            self.image = self.imagesleft[self.frame//self.ani]
            self.direction = "left"

        # moving right
        if self.movex > 0:
            self.frame += 1
            if self.frame > 3*self.ani:
                self.frame = 0
            self.image = self.imagesright[self.frame//self.ani]
            self.direction = "right"

        #enemy_hit_list = pygame.sprite.spritecollide(self,enemy_list, False)
        #for enemy in enemy_hit_list:
            #self.health -= 1
            #print(self.health)

        keys = pygame.key.get_pressed()
        if keys[pygame.K_SPACE]:
            self.bullet_timer -= dt  # Subtract the time since the last tick.

        if self.bullet_timer <= 0:
            self.bullet_timer = 100  # Bullet ready.
            if keys:  # Left mouse button.
                # Create a new bullet instance and add it to the groups.
                if self.direction == "right":
                    Bullet([self.rect.x + self.image.get_width(), self.rect.y + self.image.get_height()/2], self.direction, self.all_sprites)
                else:
                    Bullet([self.rect.x, self.rect.y + self.image.get_height()/2], self.direction, self.all_sprites)
                self.bullet_timer = .1  # Reset the timer.


class Bullet(pygame.sprite.Sprite):

    IMAGE = None
    FLIPPED_IMAGE = None

    def __init__(self, pos, direction, *sprite_groups):
        super().__init__(*sprite_groups)

        # cache images
        if not Bullet.IMAGE:
            Bullet.IMAGE = pygame.image.load(os.path.join('images','fireball.png'))
            Bullet.FLIPPED_IMAGE = pygame.transform.flip(Bullet.IMAGE, True, False)

        if direction == "right":
            self.vel = pygame.math.Vector2(750, 0)
            self.image = Bullet.IMAGE
        else:
            self.vel = pygame.math.Vector2(-750, 0)
            self.image = Bullet.FLIPPED_IMAGE

        self.pos = pygame.math.Vector2(pos)
        self.rect  = self.image.get_rect(center=pos)

    def update(self, dt):
        # Add the velocity to the position vector to move the sprite
        self.pos += self.vel * dt
        self.rect.center = self.pos  # Update the rect pos.
        if not pygame.display.get_surface().get_rect().colliderect(self.rect):
            self.kill()

我願意接受任何建議。 預先感謝!

這是我將如何處理這個...

  1. 按照教程設置滾動背景,並確保您可以通過前后移動背景而不是播放器來使其正常工作(只需將播放器的 x 坐標凍結在中心並用左/右鍵移動背景。

  2. 在邊緣緩沖區的設置中添加一些常量(您希望玩家避免邊界的 x 增量數

  3. 獲得鍵輸入(左或右)后,設置條件語句。 為此,您必須訪問玩家的 x 坐標並將其與緩沖區進行比較。 好吧,實際上是 0+buffer 或 width-buffer,然后根據這些情況移動播放器或背景。 看看你能不能讓它工作。

  4. 然后,您會意識到,當您移動背景時,您正在移動其他一切的參考系,這意味着像火球這樣的東西,所以如果您向左或向右移動背景,您需要將這些更新應用到另一個對象也是如此,所以它看起來是正確的。

如果你卡住了,請對上面的代碼進行更新並在評論中回復我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM