主程序:
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() 方法在新位置绘制飞船图像。