pygame中self.x与self.rect.x的理解

主程序:

class Game:

    def __init__(self):
        pygame.init()

        self.settings = settings.Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption('Ship game')

        self.ship = ship.Ship(self)
        self.bullets = pygame.sprite.Group()
        self.alien = pygame.sprite.Group()
        self._create_fleet()

    def run_game(self):
        while True:
            self.update_screen()
            self.check_events()
            self.ship.update_ship()

            self.bullets.update()

    def update_screen(self):

        self.screen.fill(self.settings.screen_color)
        self.ship.blitme()

        for bullets in self.bullets.sprites():
            bullets.draw_bullets()
            if bullets.rect.bottom < 0:
                self.bullets.remove(bullets)

        self.alien.draw(self.screen)

        pygame.display.flip()

    def check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

            elif event.type == pygame.KEYDOWN:
                self.check_event_Keydown(event)
            elif event.type == pygame.KEYUP:
                self.check_event_keyup(event)

    def _create_fleet(self):
        alien = Alien(self)
        alien_width = alien.rect.width
        availzable_space_x = self.settings.screen_width - (2 * alien_width)
        number_alien_x = availzable_space_x // (2 * alien_width)

        for alien_number in range(number_alien_x):
            self._create_alien(alien_number)

    def _create_alien(self,alien_number):
        alien = Alien(self)
        alien_width = alien.rect.width
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        self.alien.add(alien)

    def check_event_Keydown(self, event):
        if event.key == pygame.K_UP:
            self.ship.moving_up = True
        if event.key == pygame.K_DOWN:
            self.ship.moving_down = True
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        if event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        if event.key == pygame.K_SPACE:
            self.update_bullets()
            self.bullets.update()
        if event.key == pygame.K_q:
            sys.exit()

    def check_event_keyup(self, event):
        if event.key == pygame.K_UP:
            self.ship.moving_up = False
        if event.key == pygame.K_DOWN:
            self.ship.moving_down = False
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        if event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def update_bullets(self):
        new_bullets = bullet.Bullet(self)
        self.bullets.add(new_bullets)


if __name__ == '__main__':
    game = Game()
    game.run_game()

绘制飞船:


import pygame


class Ship:
    def __init__(self, game):
        self.screen = game.screen
        self.screen_rect = game.screen.get_rect()

        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()

        self.rect.midbottom = self.screen_rect.midbottom
        self.settings = game.settings

        self.moving_left = False
        self.moving_right = False
        self.moving_up = False
        self.moving_down = False

        self.x = float(self.rect.x)
        self.y = float(self.rect.y)

    def update_ship(self):
        if self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed
        if self.moving_up and self.rect.top > 0:
            self.y -= self.settings.ship_speed
        if self.moving_down and self.rect.bottom < self.screen_rect.bottom:
            self.y += self.settings.ship_speed

        self.rect.x = self.x
        self.rect.y = self.y

    def blitme(self):
        self.screen.blit(self.image, self.rect)

在pygame中,self.x 与 self.rect.x有什么区别,self.rect.x指的是矩形的左下顶点,即矩形左上顶点的坐标+矩形的高,那么是如何通过改变self.rect.x来改变飞船图像位置的呢

pygame 中 self.x 和 self.rect.x 的区别是:

self.x 是飞船的水平位置,通常是一个浮点数,用来精确地记录飞船的位置。

而 self.rect.x 是飞船的矩形的水平位置,通常是一个整数,用来绘制飞船的位置。

在这个代码中,self.x 用来记录飞船的水平位置,但是实际上绘制飞船的位置是由 self.rect.x 来确定的。在绘制飞船时,代码会将 self.x 的值赋给 self.rect.x,然后调用 blitme() 方法绘制飞船。这样做是为了方便飞船的移动和碰撞检测,在游戏中飞船的移动和碰撞检测只需要改变 self.x 的值即可,而不需要改变 self.rect.x 的值。

self.x是指角色的x坐标,self.rect.x指的是角色矩形的x坐标。

至于改变飞船位置,可以通过+-x.rect.x参数来实现

首先你得理解self是什么,是谁...一般表示的是这个主类
self.x应该有两个,另外一个是self.y,也是这个类的属性,变量。只允许在这个类使用,外部使用需要 类名.x或.y(x y一般表示坐标)
看你代码rect也是同理(rect 翻译是区域,这里表示同理)

在 Pygame 中,self.x 和 self.rect.x 的区别是 self.x 是一个自定义变量,用来存储对象的x坐标,而 self.rect.x 是 rect 对象的内置属性,用来存储矩形左上角的 x 坐标。

rect 对象是 Pygame 内置的类,用于表示矩形区域,常用来定义屏幕上对象的位置和大小。rect 对象有多个属性,包括 x,y,width 和 height,可以用来定义矩形的位置和大小。

self.rect.x 属性用于存储矩形左上角的 x 坐标,对应于物体在x轴上的位置。当改变 self.rect.x 的值时,就是改变物体在x轴上的位置。例如,如果增加 self.rect.x 的值,物体就会向右移动。

在飞船的情况下,可以使用 self.rect.x 来改变飞船在屏幕上的位置。通过更新 self.rect.x 的值,可以在屏幕上水平移动飞船。

可以使用 blit() 方法将飞船图像绘制到新位置(self.rect.x, self.rect.y)

screen.blit(spaceship_image, (self.rect.x, self.rect.y))

这样就可以在新位置绘制飞船图像了。

总之,self.x 是一个自定义变量,用来存储对象的x坐标,而 self.rect.x 是 rect 对象的内置属性,用
来存储矩形左上角的 x 坐标。可以通过更改 self.rect.x 的值来改变物体在x轴上的位置,并使用 blit() 方法在新位置绘制飞船图像。

就看官方教程

self.x表示的是整个对象的x位置,而self.rect.x 是self对象中rect的x位置,完全不是一个东西

在 Pygame 中,self.x 和 self.rect.x 的区别是 self.x 是一个自定义变量,用来存储对象的x坐标,而 self.rect.x 是 rect 对象的内置属性,用来存储矩形左上角的 x 坐标。

rect 对象是 Pygame 内置的类,用于表示矩形区域,常用来定义屏幕上对象的位置和大小。rect 对象有多个属性,包括 x,y,width 和 height,可以用来定义矩形的位置和大小。

self.rect.x 属性用于存储矩形左上角的 x 坐标,对应于物体在x轴上的位置。当改变 self.rect.x 的值时,就是改变物体在x轴上的位置。例如,如果增加 self.rect.x 的值,物体就会向右移动。

在飞船的情况下,可以使用 self.rect.x 来改变飞船在屏幕上的位置。通过更新 self.rect.x 的值,可以在屏幕上水平移动飞船。

可以使用 blit() 方法将飞船图像绘制到新位置(self.rect.x, self.rect.y)

screen.blit(spaceship_image, (self.rect.x, self.rect.y))

这样就可以在新位置绘制飞船图像了。

总之,self.x 是一个自定义变量,用来存储对象的x坐标,而 self.rect.x 是 rect 对象的内置属性,用
来存储矩形左上角的 x 坐标。可以通过更改 self.rect.x 的值来改变物体在x轴上的位置,并使用 blit() 方法在新位置绘制飞船图像。