Python Pygame 如何将矩形放在屏幕中央

2024-04-19

我真的是新来学习Python和做练习 我想创建一个矩形或任何其他图形,例如我使用的pygame.Rect(x,y,w,h)并设置 screen_center

self.screen_rect=setting.screen.get_rect()
self.screent_center=self.screen_rect.center

但矩形的中心不在屏幕的中心 我也想用self.b=self.bullet.get_rect()但它显示错误 我该如何修复它? 这是代码:

#! /usr/bin/python
import pygame as p
import sys

class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.flag=p.RESIZABLE
        self.color=(255,255,255)
        self.speed=1
        self.screen=p.display.set_mode((self.w,self.h),self.flag)
        p.display.set_caption("Bullet")
        self.bullet_s=1
        self.bullet_w=100
        self.bullet_h=300
        self.bullet_c=(0,0,0)

class Bullet(p.sprite.Sprite):
    def __init__(self,setting):
        super().__init__()
        self.screen_rect=setting.screen.get_rect()
        self.screent_center=self.screen_rect.center

        self.bullet=p.Rect((self.screen_center),(setting.bullet_w,setting.bullet_h))   **<-- not in the center**


    self.b=self.bullet.get_rect() **<-- AttributeError: 'pygame.Rect' object has no attribute 'get_rect'**
        self.color=setting.bullet_c
        self.speed=setting.bullet_s
#        self.centery=float(self.bullet.centery)
    def bullet_move(self):
        self.y -= self.speed
        self.bullet.y=self.y
    def draw_bullet(self,setting):
        self.rect=p.draw.rect(setting.screen,self.color,self.bullet)


def game():
    p.init()
    setting=Setting(1200,800)
    bullet=Bullet(setting)


    while True:
        for event in p.event.get():
             if event.type == p.QUIT:
                 sys.exit()
        setting.screen.fill((255,0,0))
        bullet.draw_bullet(setting)
        p.display.flip()
game()

此代码使用屏幕上的中心矩形

 self.screen_rect = setting.screen.get_rect()

 self.rect.center = self.screen_rect.center

当您按下时它也会移动矩形UP or DOWN.

It uses KEYDOWN, KEYUP改变speed它运行move()在每个循环中,该函数使用speed改变位置(不检查按键)。

也比较rect.top with screen.top and rect.bottom with screen.bottom当矩形触及屏幕边框时停止矩形。


顺便说一句:我还在代码中添加空格和空行以使其更具可读性。

See: PEP 8——Python 代码风格指南 https://www.python.org/dev/peps/pep-0008/


import pygame as p

class Setting():

    def __init__(self, width, height):
        self.w = width
        self.h = height
        self.flag = p.RESIZABLE
        self.color = (255, 255, 255)
        self.speed = 1

        self.screen = p.display.set_mode((self.w, self.h), self.flag)

        p.display.set_caption("Bullet")

        self.bullet_s = 1
        self.bullet_w = 100
        self.bullet_h = 300
        self.bullet_c = (0, 0, 0)


class Bullet(p.sprite.Sprite):

    def __init__(self, setting):
        super().__init__()

        self.setting = setting

        self.screen_rect = setting.screen.get_rect()

        self.rect = p.Rect(0, 0, setting.bullet_w, setting.bullet_h)
        self.rect.center = self.screen_rect.center

        self.color = setting.bullet_c
        self.speed = 0 #setting.bullet_s

    def move(self):
        self.rect.y -= self.speed

        if self.rect.top < 0:
            self.rect.top = 0
        elif self.rect.bottom > self.screen_rect.bottom:
            self.rect.bottom = self.screen_rect.bottom

    def draw(self):
        p.draw.rect(self.setting.screen, self.color, self.rect)

    def handle_event(self, event):
        if event.type == p.KEYDOWN:

            if event.key == p.K_UP:
                self.speed = self.setting.bullet_s
            elif event.key == p.K_DOWN:
                self.speed = -self.setting.bullet_s

        elif event.type == p.KEYUP:

            if event.key == p.K_UP:
                self.speed = 0
            elif event.key == p.K_DOWN:
                self.speed = 0

def game():
    p.init()
    setting = Setting(1200,800)
    bullet = Bullet(setting)

    running = True
    while running:
        for event in p.event.get():
             if event.type == p.QUIT:
                 running = False
             bullet.handle_event(event)

        bullet.move()

        setting.screen.fill((255, 0, 0))
        bullet.draw()
        p.display.flip()

    p.quit()


game()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Pygame 如何将矩形放在屏幕中央 的相关文章

随机推荐

  • React-router-redux 在链接上单击两次即可更新位置状态

    我的应用程序出现问题 无法在任何地方找到解决方案 我用react router redux and syncHistoryWithStore 当我单击导航以使用链接更改路线时 新路线会加载 浏览器中的 URL 会更新 但是location除
  • 有没有更好的方法将多值数据显示为列?

    我的笔记数据库中有 4 个审核字段 它们是多值的 当表单上的某些内容发生更改时 它们都会获得一个新条目 我有一个审核表单 以柱状方式显示这些字段 几乎就像一个视图 这是列的代码
  • 返回响应后如何记录 POST 方法的返回值?

    我正在开发我的第一个 REST API 所以如果我错过了一些基本的东西 请提前道歉 我有一个函数 它从另一台服务器获取 JSON 请求 对其进行处理 根据数据进行预测 然后返回另一个带有结果的 JSON 我想在服务器的本地磁盘上保留对此端点
  • 同时使用 2 个 GPU 调用 cudaMalloc 时性能较差

    我有一个应用程序 可以在用户系统上的 GPU 之间分配处理负载 基本上 每个 GPU 都有一个 CPU 线程来启动一个GPU处理间隔当由主应用程序线程定期触发时 考虑以下图像 使用 NVIDIA 的 CUDA 分析器工具生成 作为示例GPU
  • NSKeyValueObservation:无法从对象中删除关键路径的观察者,因为它未注册为观察者

    我的应用程序中出现随机崩溃 我无法在我拥有的设备上重现 但有例外 无法从 AVPlayerLayer 0xaddress 中删除关键路径 readyForDisplay 的观察者 Foundation NSKeyValueObservati
  • 导入Matplotlib而不显示

    我正在尝试在我的 Linux 服务器上运行 python 脚本并制作并保存一些绘图 我已经安装了ipython and pylab and matplotlib但当我运行我的脚本时 我收到此错误 Traceback most recent
  • 引用 wmp.dll (\windows\system32\wmp.dll)

    我可以在商业应用程序中使用对 wmpLib ddl wmp dll windows system32 wmp dll 的引用吗 我在用Visual Studio 2008 Express http en wikipedia org wiki
  • 具有可选命令行模式的 Cocoa 应用程序

    我即将从头开始一个新的 Cocoa 项目 我已经给出的要求之一是能够从同一个可执行文件中选择 Cocoa GUI 或命令行模式 未来可能会增加脚本能力 但这不是现在的问题 在 Cocoa 中解决这个问题的最佳策略是什么 特别是如果我想维护某
  • Struts2 jQuery 插件 java.lang.ClassNotFoundException: org.apache.struts2.views.TagLibrary

    该问题涉及到Struts v2 3 16 and Struts2 jQuery 插件 v3 6 1 Struts 项目似乎不支持第三方插件 例如 Struts2 jQuery 插件 如何解决以上版本不兼容的问题 这是启动时抛出的异常 13
  • 如何在移动设备上使用Unity3d实现多点触控?

    I use OnMouseDown 可以处理按压 但不可能实现多点触控 该程序包括当您点击时增加然后减少的对象 如果轻轻一按 一切都会正常 但是 当您尝试同时单击多个对象时 它不起作用 我正在尝试解决该问题 但它不起作用 对象无法缩放并且多
  • std::bind 和 boost::bind 多态性之间的区别

    我有一个派生类 从中绑定了一个我没有在此类中重写的虚函数 因此我希望调用父类中的一个 它与 boost 1 55 配合得很好 但如果我从 C 11 切换到 std bind 它会拒绝编译 错误 C2100 非法间接寻址 1 gt 功能 11
  • Ant 使用 -source 7 或更高版本来启用钻石运算符

    我确信这是一个非常简单的问题 但我一直坚持使用 Ant 从命令行构建 Android 应用程序 我收到这样的消息 use source 7 or higher to enable diamond operator 我需要在构建文件中添加什么
  • 在 Wpf 中创建垂直菜单

    如何使用 xaml 在 Visual Studio 在 wpf 中 窗口的左侧创建一个垂直菜单 就像http www wpftutorial net http www wpftutorial net 我尝试代码 menu 但这不是任务 因为
  • 如何在 Ada 中直接访问内存地址?

    所以我是 Ada 的新手 我正在尝试在其中编写内核 但我似乎找不到任何关于如何正确执行此操作的好信息 在 C 语言中 我会这样写 unsigned char videoram char 0xB8000 videoram 0 65 直接访问视
  • 如何解释方案表达式 '(a 'b)

    a b 给出答案 a b 当 a 没有绑定 未加引号 时 这是如何工作的 这就是我们计算表达式时发生的情况 a b gt a b The quote 是简写quote http docs racket lang org guide quot
  • D有“新类型”吗?

    D 是否有 newtype 如 Haskell 中 这是一个天真的问题 因为我只是浏览 D 但谷歌没有找到任何有用的东西 在 Haskell 中 这是一种在编译时使同一事物的不同类型变得不同的方法 但不会导致任何运行时性能损失 例如你可以为
  • 致命错误:无法声明类

    我不明白为什么 php 给我一个错误 致命错误 无法声明类 rex builder RexBuilder 因为 名称已在 var www site2 dev App rex RexBuilder php 中使用 12 号线 RexBuild
  • 在 JavaFX 中使用 MouseEvent 和 MouseClicked 选择并移动 Canvas 图像

    我有一个应用程序的示例 用于绘制图片GraphicsContext并如下图所示工作 问题是select and move只有blue circle水平地与Canvas MouseEvent and MouseClicked public c
  • GraphQL 突变操作顺序

    我正在创建一个有效的突变 但我不确定它是否按照我认为的方式工作 不过我想知道执行顺序是什么 Async 从上到下同步 同步随机顺序 其他的东西 我想确保在执行插入 更新插入之前从表中删除某些项目 使用以下突变查询字符串 这是否总是会执行我想
  • Python Pygame 如何将矩形放在屏幕中央

    我真的是新来学习Python和做练习 我想创建一个矩形或任何其他图形 例如我使用的pygame Rect x y w h 并设置 screen center self screen rect setting screen get rect