Python Pygame滚动

Python Pygame滚动,python,pygame,horizontal-scrolling,Python,Pygame,Horizontal Scrolling,我目前正在修一门A级计算机科学课程,在这门课程中,我必须为一个项目制作一个游戏。我知道这段代码可能效率不高,但我正在努力将其保留在自己的工作中,并希望有人能帮我解决一点我感到困惑的问题 我试图在屏幕上左右滚动,我知道这是通过将屏幕上的每个对象向相关方向移动来实现的。我已经创建了边界,当机器人在其中时,屏幕应该开始移动。但对于我编写的代码,平台在屏幕上移动时不会被更新,机器人的速度在这些边界内时会发生变化 任何想法或帮助都将不胜感激 import pygame as pg import time

我目前正在修一门A级计算机科学课程,在这门课程中,我必须为一个项目制作一个游戏。我知道这段代码可能效率不高,但我正在努力将其保留在自己的工作中,并希望有人能帮我解决一点我感到困惑的问题

我试图在屏幕上左右滚动,我知道这是通过将屏幕上的每个对象向相关方向移动来实现的。我已经创建了边界,当机器人在其中时,屏幕应该开始移动。但对于我编写的代码,平台在屏幕上移动时不会被更新,机器人的速度在这些边界内时会发生变化

任何想法或帮助都将不胜感激

import pygame as pg
import time
import random


pg.init()#initiates pygame

display_height = 690#Creates width and height of screen
display_width = 1024
#Colours
white = (255,255,255) 
black = (0,0,0)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
sky = (73,71,65) # grey

Robot_height = 99#Height of robot
Robot_width = 112#Width of robot
lives = 3 #Robot Lives
Bullet_Fired = False
PowerUp_Active = False
Robot_acc = 0.3 #Robot Acceleration
vec = pg.math.Vector2

gameDisplay = pg.display.set_mode((display_width,display_height)) #Sets display properties of window
pg.display.set_caption ("Game") #Title on window
clock = pg.time.Clock()
robotImg = pg.image.load("robot1.png") #Loads robots image

#Class for platforms
class Platform(pg.sprite.Sprite):
    def __init__(self, x,y,w,h):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((w,h))
        self.image.fill(blue)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

#List of platforms
PLATFORM_LIST = [(0,display_height - 40,display_width,40),
                 (display_width /2 - 50,display_height * 3/4,100,20)]
#Platform group
platforms = pg.sprite.Group()


#class for robot
class RobotClass(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((Robot_width,Robot_height))
        self.rect = self.image.get_rect()
        self.rect.center = (display_width / 2, display_height / 2)
        self.RobotPos = vec(display_width / 2, display_height / 2)
        self.bottom = (0,0)
        self.vel = vec(0, 0)
        self.acc = vec(0, 0.3)

#Creates Robot
Robot = RobotClass()
for plat in PLATFORM_LIST:
    p = Platform(*plat)
    platforms.add(p)
def draw():
    for plat in PLATFORM_LIST:
            p = Platform(*plat)
            pg.draw.rect(gameDisplay, blue, (p))

#Jump function
def jump():
    #Checks pixel below robot to see if there is a collision
    Robot.rect.x = Robot.rect.x +1
    hits = pg.sprite.spritecollide(Robot , platforms, False)
    Robot.rect.x = Robot.rect.x -1
    if hits:
        #Gives robot velocity of 5 upwards
        Robot.vel.y = -10

#game loop
def game_loop():
    pg.draw.rect(gameDisplay, red, Robot.rect, 2)
    Robot_friction = -0.3 #Friction value
    vec = pg.math.Vector2 #Setting vec as vector quantity
    while True:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit
                quit()
            #Starts acceleration when key is pressed
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_LEFT:
                    Robot.acc.x = -Robot_acc
                elif event.key == pg.K_RIGHT:
                    Robot.acc.x = Robot_acc
                elif event.key == pg.K_UP:
                    jump()
            #Adds friction to accleration to slow robot down when key is not being pressed
            if event.type == pg.KEYUP:
                if event.key == pg.K_LEFT or event.key == pg.K_RIGHT:
                    Robot.acc.x = Robot.acc.x * Robot_friction

        #Adjusts velocity of robot by adding the acceleration on each cycle
        Robot.vel = Robot.vel+ Robot.acc
        #Fills background
        gameDisplay.fill(sky)
        #Draws the platforms to the screen and adds them to platform group
        draw()
        #Changes Robot position according to its velocity,acceleration and the friction
        Robot.RobotPos = Robot.RobotPos + Robot.vel + 0.5 * Robot.acc
        #Loads robot onto screen
        gameDisplay.blit(robotImg,(Robot.rect))
        pg.draw.rect(gameDisplay, red, Robot.rect, 2)
        #Updates display
        pg.display.update()
        clock.tick(60)

        #Sets bottom of robot to its position
        Robot.rect.midbottom =  Robot.RobotPos

        #Collision detection
        if Robot.vel.y > 0:
            hits = pg.sprite.spritecollide(Robot , platforms, False)
            if hits:
                #Puts Robot on top of platform
                Robot.RobotPos.y = hits[0].rect.top + 1
                Robot.vel.y = 0

        #Scrolling

        if Robot.rect.left < display_width/4:
            print("left")
            Robot.RobotPos.x = Robot.RobotPos.x - abs(Robot.vel.x)
            print(Robot.vel)
            for plat in platforms:
                plat.rect.x = plat.rect.x + abs(Robot.vel.x)
                pg.draw.rect(gameDisplay, blue, (PLATFORM_LIST[0]))
        if Robot.rect.right > (display_width-display_width/4):
            print("right")
            Robot.RobotPos.x = Robot.RobotPos.x + abs(Robot.vel.x)
            print(Robot.vel)
            for plat in platforms:
                plat.rect.x = plat.rect.x - abs(Robot.vel.x)

        #Sets top velocity of robot    
        if Robot.vel.x > 6:
            Robot.vel.x = 6
        if Robot.vel.x < -6:
            Robot.vel.x = -6
        #Makes robot velocity = 0 when it is close to 0
        if Robot.vel.x < 0.05 and Robot.vel.x > -0.05:
            Robot.acc.x = 0
            Robot.vel.x = 0


game_loop()
pg.quit()
quit()

我们开始吧。如果机器人达到极限,您将在此处更新平台:

for plat in platforms:
    plat.rect.x = plat.rect.x - abs(Robot.vel.x)
但当您从原始平台列表中绘制平台时:

def draw():
    for plat in PLATFORM_LIST:
        p = Platform(*plat)
        pg.draw.rect(gameDisplay, blue, (p))
因此,最终发生的情况是,即使您正确地更新了平台,但您是从原始列表中绘制的,因此您没有绘制更新后的列表。您应该从正在更新的平台列表中提取:

def draw():
    for plat in platforms:
        pg.draw.rect(gameDisplay, blue, plat)
第二,我发现一旦你达到左滚动极限,返回到正确方向的运动会使机器人走错方向。替换此项:

if Robot.rect.left < display_width/4:
    Robot.RobotPos.x = Robot.RobotPos.x - abs(Robot.vel.x)
这会导致显示平台以特殊方式移动时出现舍入问题。您可以将其设置为Int:

for plat in platforms:
    plat.rect.x = plat.rect.x - int(abs(Robot.vel.x))

否则,你将不得不像制作机器人一样制作平台,并在vec中进行交易

我正在玩这个游戏,平台根本不会移动。当我接近边缘时,机器人从地板上掉了下来。肯定有些问题。将仔细查看。正如有人在您的另一个问题中评论的那样,请尝试遵循常见的命名约定。使用小写字母和下划线命名函数、变量、实例和属性,使用CamelCase命名类,使用大写字母和下划线命名常量。这有助于我们更容易地阅读代码并理解变量是什么,因此我们不必例如查找某个对象是否为类。我包含了上面的代码,这些代码使平台左右移动,以及玩家如何在边界内加速,但同时添加另一个平台[display_width+50,display_height*3/4100,20]。我发现当你向右滚动时,这个平台会更靠近另一个。你知道为什么吗?@AshleyKelly我更新了我的答案以解决这个问题。扰流板,这与取整有关。
for plat in platforms:
    plat.rect.x = plat.rect.x - abs(Robot.vel.x)
for plat in platforms:
    plat.rect.x = plat.rect.x - int(abs(Robot.vel.x))