【问题标题】:Moving a sprite to the other side when a sprite moves off screen Pygame当精灵离开屏幕时将精灵移动到另一侧 Pygame
【发布时间】:2016-03-01 16:29:01
【问题描述】:

如果我有一个可以四处移动的精灵(见下文),屏幕上的箭头键。 (Up and Down 前后移动,左转和右转。) 我想知道当它熄灭时是否可以移动到屏幕的另一侧?但是无论角度如何,它都可以工作,因此如果将其一半驱动到边缘,则一半会出现在一侧。 (有点像蛇)有没有办法做到这一点?

到目前为止,这是我的代码:

import sys, pygame, math
from pygame.locals import *
pygame.init()

SCREEN = pygame.display.set_mode((800, 600))
car = pygame.transform.scale(pygame.image.load('Car.png').convert_alpha(), (64, 64))
pygame.display.set_caption('Car Game')
pygame.display.set_icon(car)
FPS = pygame.time.Clock()

carX  = 400
carY  = 100
angle = 90
speed = 0

while True:

    if angle == 360: angle = 0
    if  angle == -1: angle = 359

    SCREEN.fill((0,0,0))

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

    keys = pygame.key.get_pressed()
    if keys[K_a] or keys[K_LEFT]:
        angle += speed
    elif keys[K_d] or keys[K_RIGHT]:
        angle -= speed
    if keys[K_w] or keys[K_UP]:
        speed += 1
    elif keys[K_s] or keys[K_DOWN]:
        speed -= 0.5

    carX += speed*math.cos(math.radians(angle))
    carY -= speed*math.sin(math.radians(angle))
    speed *= 0.95

    rotcar = pygame.transform.rotate(car, angle)
    position = rotcar.get_rect(center = (carX,carY))
    SCREEN.blit(rotcar, position)

    pygame.display.update()
    FPS.tick(24)

【问题讨论】:

  • 我对pygame不熟悉,所以这里是你的起点。您正在寻找描述您想要实现的目标的 termwrappingwraparound 因为随着您的对象 off 屏幕,它会从另一侧返回,而不是 侧滚动。要实现这一点,首先要在汽车离开屏幕时改变它的位置;在这里可以看到一个简单的 pygame 示例screen wrap boundaries。看看def checkBounds(self) 函数。
  • @JonathonOgden 有没有让一半的车出现在两边?
  • 我会为你调查。如果您将其放置在屏幕上/屏幕外,我假设 pygame 不会处理两侧汽车每个部分的绘图?

标签: python python-3.x pygame


【解决方案1】:

我对 pygame 不太熟悉,但我认为 this game (md5: 92f9f508cbe2d015b18376fb083e0064 文件:spacegame.zip) 具有您正在寻找的功能。感谢作者 DR0ID_ 将其公开在his/her website

为了在您的汽车游戏中实现“环绕”功能,我使用了“game.py”中的这个功能:

def draw(self, surface):
    wrap = 0
    for s in self.sprites():
        r = s.rect
        if r.left<0:
            r.move_ip(800, 0)
            wrap = 1
        elif r.right > 800:
            r.move_ip(-800, 0)
            wrap = 1
        if r.top < 0:
            r.move_ip(0, 600)
            wrap = 1
        elif r.bottom > 600:
            r.move_ip(0, -600)
            wrap = 1
        if wrap:
            surface_blit(s.image, r)
            wrap = 0

经过一些调整,我最终得到了这个工作示例:

import sys, pygame, math
from pygame.locals import *
pygame.init()

# Added HEIGHT and WIDTH as fixed variables 

WIDTH = 800
HEIGHT = 600

SCREEN = pygame.display.set_mode((WIDTH, HEIGHT))

car = pygame.transform.scale(pygame.image.load('Car.png').convert_alpha(), (64, 64))
pygame.display.set_caption('Car Game')
pygame.display.set_icon(car)
FPS = pygame.time.Clock()

carX  = 400
carY  = 100
angle = 90
speed = 0

while True:

    if angle == 360: angle = 0
    if  angle == -1: angle = 359

    SCREEN.fill((0,0,0))

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

    keys = pygame.key.get_pressed()
    if keys[K_a] or keys[K_LEFT]:
        angle += speed
    elif keys[K_d] or keys[K_RIGHT]:
        angle -= speed
    if keys[K_w] or keys[K_UP]:
        speed += 1
    elif keys[K_s] or keys[K_DOWN]:
        speed -= 0.5

    carX += speed*math.cos(math.radians(angle))
    carY -= speed*math.sin(math.radians(angle))
    speed *= 0.95

    rotcar = pygame.transform.rotate(car, angle)
    position = rotcar.get_rect(center = (carX,carY))

    # Basically a copy/paste of the "draw"-function from the spacegame.zip

    wrap_around = False

    if position[0] <  0 :
        # off screen left
        position.move_ip(WIDTH, 0)
        wrap_around = True

    if position[0]  + rotcar.get_width() > WIDTH:
        # off screen right
        position.move_ip(-WIDTH, 0)
        wrap_around = True

    if position[1]  < 0:
        # off screen top
        position.move_ip(0, HEIGHT) 
        wrap_around = True

    if position[1] + rotcar.get_height() > HEIGHT:
        # off screen bottom
        position.move_ip(0, -HEIGHT) 
        wrap_around = True

    if wrap_around:

        SCREEN.blit(rotcar, position)


    position[0] %= WIDTH
    position[1] %= HEIGHT  
    carX %= WIDTH
    carY %= HEIGHT


    SCREEN.blit(rotcar, position)

    pygame.display.update()
    FPS.tick(24)

【讨论】:

  • 干得好。几个小时前,我自己只是在浏览 spacegame 的源代码。
  • @JonathonOgden 谢谢!我猜谷歌在 DR0ID_ 的太空游戏上大放异彩:)
  • 很高兴看到我的代码帮助了某人,即使它是旧代码。 :)
【解决方案2】:

您可以不使用“elif”语句,而只为 x 和 y 坐标分别设置坐标“模”(%) 屏幕宽度/屏幕高度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多