如何解决Pygame 创建多个陨石并旋转它们
我尝试在这个游戏中创建多个陨石,但我不知道如何,我也尝试旋转它们。 我设法只创建了一个成功。但是当我试图旋转他时,陨石下落的速度要快得多,而且向一侧移动,我不知道为什么。 有人可以帮我吗?
import pygame as py
import os
import random
py.font.init()
py.mixer.init()
WIN_WIDTH = (600)
WIN_HEIGHT = (690)
SPACESHIP_WIDTH = (55)
SPACECHIP_HEIGHT = (40)
WIN = py.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
py.display.set_caption("Ship Survivor")
SPACESHIP_VEL = (7)
FPS = (30)
SPACE_BACKGROUND = py.image.load(os.path.join("Assets","space.png"))
SPACE_BACKGROUND = py.transform.rotate(SPACE_BACKGROUND,90)
SPACE_BACKGROUND = py.transform.scale(SPACE_BACKGROUND,(WIN_WIDTH,WIN_HEIGHT))
RED_SPACESHIP_IMAGE = py.image.load(os.path.join("Assets","spaceship_red.png"))
RED_SPACESHIP_IMAGE = py.transform.scale(RED_SPACESHIP_IMAGE,(SPACESHIP_WIDTH,SPACECHIP_HEIGHT))
RED_SPACESHIP_IMAGE = py.transform.rotate(RED_SPACESHIP_IMAGE,180)
class SpaceShip:
def __init__(self,x,y,image):
self.x = x
self.y = y
self.image = image
self.mask = py.mask.from_surface(self.image)
def movement(self):
# Check for the keystrokes and store the value
self.keys_pressed = py.key.get_pressed()
if (self.keys_pressed[py.K_LEFT] or self.keys_pressed[py.K_a]) and self.x - SPACESHIP_VEL > 0:
self.x -= SPACESHIP_VEL
if (self.keys_pressed[py.K_RIGHT] or self.keys_pressed[py.K_d]) and self.x + SPACESHIP_WIDTH + SPACESHIP_VEL < WIN_WIDTH:
self.x += SPACESHIP_VEL
if (self.keys_pressed[py.K_UP] or self.keys_pressed[py.K_w]) and self.y - SPACESHIP_VEL > 0:
self.y -= SPACESHIP_VEL
if (self.keys_pressed[py.K_DOWN] or self.keys_pressed[py.K_s]) and self.y + SPACECHIP_HEIGHT + SPACESHIP_VEL < WIN_HEIGHT:
self.y += SPACESHIP_VEL
def draw(self,win):
win.blit(self.image,(self.x,self.y))
# -----------------------------------------------------------------------
class Meteorite:
meteorite_VEL = 4
meteorite_image = py.image.load(os.path.join("Assets","meteor1.png"))
meteorite_image = py.transform.scale(meteorite_image,(random.randrange(50,300),random.randrange(40,300)))
def __init__ (self):
self.image = self.meteorite_image
self.mask = py.mask.from_surface(self.image)
self.y = 0
self.x = 0
self.x = random.randrange(0,WIN_WIDTH - self.image.get_width())
def movement(self):
self.y += self.meteorite_VEL
# self.image = py.transform.rotate(self.image,0.50)
def draw(self,self.y))
# -----------------------------------------------------------------------
def draw_window(win,space_ship,meteorite):
win.blit(SPACE_BACKGROUND,(0,0))
meteorite.draw(win)
space_ship.draw(win)
py.display.update()
# Execution--------------------------
def main():
# Objets-----------------------------
red_spaceship = SpaceShip(WIN_WIDTH//2 - SPACESHIP_WIDTH,600,RED_SPACESHIP_IMAGE)
grinMeteorite = Meteorite()
clock = py.time.Clock()
run = True
while run:
clock.tick(FPS)
for event in py.event.get():
if event.type == py.QUIT:
run = False
red_spaceship.movement()
grinMeteorite.movement()
draw_window(WIN,red_spaceship,grinMeteorite)
offset = (grinMeteorite.x - red_spaceship.x,grinMeteorite.y - red_spaceship.y)
print(red_spaceship.mask.overlap_area(grinMeteorite.mask,offset))
py.quit()
main()
解决方法
见How do I rotate an image around its center using PyGame?。
您必须保留原始图像 (orig_image
)。添加 angle
属性。增加角度并从原始表面创建一个旋转的表面:
self.angle += 0.5
self.image = py.transform.rotate(self.orig_image,self.angle)
使用 pygame.Rect
对象围绕其中心旋转陨石。获取旋转后的Surface 的边界矩形。
用坐标(self.x
,self.y
)设置矩形的中心并使用矩形blit
旋转的陨石图像:
self.rect = self.image.get_rect(center = (self.x,self.y))
win.blit(self.image,self.rect)
陨石类:
class Meteorite:
meteorite_VEL = 4
meteorite_image = py.image.load(os.path.join("Assets","meteor1.png"))
meteorite_image = py.transform.scale(meteorite_image,(random.randrange(50,300),random.randrange(40,300)))
def __init__ (self):
self.orig_image = self.meteorite_image
self.image = self.meteorite_image
self.y = self.image.get_height() // 2
self.x = random.randrange(0,WIN_WIDTH - self.image.get_width())
self.angle = 0
self.rect = self.image.get_rect(center = (self.x,self.y))
self.mask = py.mask.from_surface(self.image)
def movement(self):
self.y += self.meteorite_VEL
self.angle += 0.5
self.image = py.transform.rotate(self.orig_image,self.angle)
self.rect = self.image.get_rect(center = (self.x,self.y))
self.mask = py.mask.from_surface(self.image)
def draw(self,win):
win.blit(self.image,self.rect)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。