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.xself.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)