rect.right/left获取的是什么参数
时间: 2024-05-09 20:15:14 浏览: 11
在Pygame中,`rect.right`和`rect.left`都是`Rect`对象的属性,用于获取矩形对象的右侧和左侧边缘的x坐标。
具体来说,`rect.right`属性返回矩形的右侧边缘的x坐标,即矩形左上角的x坐标加上矩形的宽度。而`rect.left`属性返回矩形的左侧边缘的x坐标,即矩形左上角的x坐标。
例如,对于以下代码:
```python
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
# 创建一个矩形对象
rect = pygame.Rect(100, 100, 50, 50)
# 输出矩形对象的左右坐标
print(rect.left, rect.right)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
```
输出结果为:
```
100 150
```
这表明矩形对象的左侧坐标为100,右侧坐标为150。
相关问题
class HeroPlane(pygame.sprite.Sprite): def __init__(self,screen): pygame.sprite.Sprite.__init__(self) #初始化精灵类 self.image1 = pygame.image.load("D:/PYTHON/pointgame/hero1.jpg") self.rect = self.image1.get_rect() #获取图片大小 self.rect.topleft = [300,700] #获取飞机左上角坐标 self.speed = 10 # 飞机速度 self.screen = screen self.screen_rect = self.screen.get_rect() self.bullets = pygame.sprite.Group() #group方法 类似列表 def key_control(self): # 键盘输入 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: self.rect.top -= self.speed if key_pressed[K_s] or key_pressed[K_DOWN]: self.rect.bottom += self.speed if key_pressed[K_a] or key_pressed[K_LEFT]: self.rect.left -= self.speed if key_pressed[K_d] or key_pressed[K_RIGHT]: self.rect.right += self.speed if key_pressed[K_SPACE]: bullet = Bullet(self.screen,self.rect.left,self.rect.top) #飞机参数调用 self.bullets.add(bullet) #把子弹放入列表 if self.rect.left < 0:# 控制player不能离开屏幕 self.rect.left = 0 elif self.rect.right > self.screen.rect.right: self.rect.right = self.screen.rect.right 错误是 File "D:/PYTHON/pointgame/pointgame.py", line 124, in <module> main() File "D:/PYTHON/pointgame/pointgame.py", line 117, in main player.key_control() File "D:/PYTHON/pointgame/pointgame.py", line 33, in key_control elif self.rect.right > self.screen.rect.right: AttributeError: 'pygame.surface.Surface' object has no attribute 'rect'怎么修改
问题出在第21行,应该将`self.screen_rect = self.screen.get_rect()`改为`self.screen_rect = self.screen.get_rect()`,即将`screen`改为`screen_rect`。代码如下:
```
class HeroPlane(pygame.sprite.Sprite):
def __init__(self,screen):
pygame.sprite.Sprite.__init__(self) #初始化精灵类
self.image1 = pygame.image.load("D:/PYTHON/pointgame/hero1.jpg")
self.rect = self.image1.get_rect() #获取图片大小
self.rect.topleft = [300,700] #获取飞机左上角坐标
self.speed = 10 # 飞机速度
self.screen = screen
self.screen_rect = self.screen.get_rect()
self.bullets = pygame.sprite.Group() #group方法 类似列表
def key_control(self):
# 键盘输入
key_pressed = pygame.key.get_pressed()
if key_pressed[K_w] or key_pressed[K_UP]:
self.rect.top -= self.speed
if key_pressed[K_s] or key_pressed[K_DOWN]:
self.rect.bottom += self.speed
if key_pressed[K_a] or key_pressed[K_LEFT]:
self.rect.left -= self.speed
if key_pressed[K_d] or key_pressed[K_RIGHT]:
self.rect.right += self.speed
if key_pressed[K_SPACE]:
bullet = Bullet(self.screen,self.rect.left,self.rect.top) #飞机参数调用
self.bullets.add(bullet) #把子弹放入列表
if self.rect.left < 0:# 控制player不能离开屏幕
self.rect.left = 0
elif self.rect.right > self.screen_rect.right: # 修改这行
self.rect.right = self.screen_rect.right
```
这样应该就能解决报错问题了。
解释一下class Bullet { public: Bullet(IMAGE& imga,RECT hero) :img(imga) { rect.left = hero.left + (hero.right - hero.left) / 2 - img.getwidth() / 2; rect.right = rect.left + img.getwidth(); rect.top = hero.top - img.getheight(); rect.bottom = hero.top; } bool Show() { if (rect.bottom <= 0) return false; rect.top -= 12; rect.bottom -= 12; putimg(NULL, rect.left, rect.top, &img); return true; } RECT GetRect() const { return rect; } private: IMAGE& img; RECT rect; }; class EBullet { public: EBullet(IMAGE& imga, RECT enemy) :img(imga) { rect.left = enemy.left + (enemy.right - enemy.left) / 2 - img.getwidth() / 2; rect.right = rect.left + img.getwidth(); rect.top = enemy.bottom; rect.bottom = rect.top + img.getheight(); } bool Show() { if (rect.top >= sheight) return false; rect.top += 12; rect.bottom += 12; putimg(NULL, rect.left, rect.top, &img); return true; } RECT GetRect() const { return rect; } private: IMAGE img; RECT rect; };
这段代码定义了两个类:`Bullet` 和 `EBullet`,分别表示玩家的子弹和敌机的子弹。
1. `Bullet` 类表示玩家的子弹,它包含一个图像和一个表示位置的矩形 `rect`。构造函数接受一个表示主机位置的矩形作为参数,并根据主机的位置确定子弹的初始位置。`Show` 函数用于显示子弹图像,并实现了一个简单的上升效果,通过减小 `rect` 的位置来实现。如果子弹超出了屏幕上方,则返回 `false` 表示子弹已经消失。`GetRect` 函数用于获取子弹的位置信息。
2. `EBullet` 类表示敌机的子弹,它也包含一个图像和一个表示位置的矩形 `rect`。构造函数接受一个表示敌机位置的矩形作为参数,并根据敌机的位置确定子弹的初始位置。`Show` 函数用于显示子弹图像,并实现了一个简单的下降效果,通过增加 `rect` 的位置来实现。如果子弹超出了屏幕下方,则返回 `false` 表示子弹已经消失。`GetRect` 函数用于获取子弹的位置信息。
这两个类的实现与之前提到的背景、主机和敌机类相似,都有一个 `Show` 函数用于显示图像并实现动画效果,并且都有一个 `GetRect` 函数用于获取位置信息。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)