第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

PyQt5 像素級(jí)碰撞檢測(cè)

PyQt5 像素級(jí)碰撞檢測(cè)

慕田峪7331174 2022-10-06 18:44:16
我正在學(xué)習(xí) Python,并想用 PyQ5t 制作一個(gè)簡(jiǎn)單的平臺(tái)游戲。目前,當(dāng)我想在游戲中的形狀之間進(jìn)行像素級(jí)碰撞檢測(cè)時(shí),我遇到了麻煩。我已將 QPixMap 設(shè)置為透明,并嘗試使用 QGraphicsPixmapItem.HeuristicMaskShape 形狀模式,但碰撞檢測(cè)不起作用。如果我將形狀(在這種情況下為鼠標(biāo))背景設(shè)為灰色并刪除形狀模式,則會(huì)發(fā)生矩形碰撞檢測(cè)。我在這里缺少什么?我花了幾個(gè)小時(shí)在互聯(lián)網(wǎng)上挖掘,但還沒(méi)有解決方案......這是我顯示問(wèn)題的代碼,請(qǐng)使用箭頭鍵移動(dòng)紅色的“鼠標(biāo)”:) 我希望在紅色圓圈中的第一個(gè)像素接觸棕色平臺(tái)時(shí)看到碰撞檢測(cè)文本。import sysfrom PyQt5.QtGui import QPen, QBrushfrom PyQt5 import QtCore, QtGuifrom PyQt5.QtCore import Qt, QPointfrom PyQt5.QtWidgets import QApplication, QWidget, QGraphicsView, QGraphicsScene, QLabel, QGraphicsPixmapItem, QFrameclass Mouse(QGraphicsPixmapItem):    def __init__(self, parent):        super().__init__()        self.canvas = QtGui.QPixmap(40,40)        self.canvas.fill(Qt.transparent)        self.setPixmap(self.canvas)        self.x = 100        self.y = 100        self.setPos(self.x, self.y)        self.setFlag(QGraphicsPixmapItem.ItemIsMovable)        self.setFlag(QGraphicsPixmapItem.ItemIsFocusable)        self.setShapeMode(QGraphicsPixmapItem.HeuristicMaskShape)        self.setFocus()        parent.addItem(self)    def paint(self, painter, option, widget=None):        super().paint(painter, option, widget)        pen = QPen(Qt.black, 4, Qt.SolidLine)        brush = QBrush(Qt.red, Qt.SolidPattern)        painter.save()        painter.setPen(pen)        painter.setBrush(brush)        painter.drawEllipse(QPoint(20,20),16,16)        painter.restore()    def keyPressEvent(self, e):        if e.key() == Qt.Key_Right:            self.x += 5        if e.key() == Qt.Key_Left:            self.x -= 5        if e.key() == Qt.Key_Up:            self.y -= 5        if e.key() == Qt.Key_Down:            self.y += 5        self.setPos(self.x, self.y)        collides_with_items = self.collidingItems(mode=Qt.IntersectsItemShape)        if collides_with_items:            print("Collision detected!")            for item in collides_with_items:                print(item)
查看完整描述

1 回答

?
白板的微信

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊

您提供的是一個(gè)空的像素圖 ( self.canvas),因此無(wú)論您選擇哪種形狀模式,它都將始終為形狀,除非您使用BoundingRectShape,它使用像素圖邊界矩形。

您手動(dòng)繪制圓圈的事實(shí)并不重要,因?yàn)椴豢紤]繪制碰撞檢測(cè)(也不應(yīng)該)。

您可以覆蓋該shape()方法以提供您自己的形狀(使用 QPainterPath):

def shape(self):
    path = QtGui.QPainterPath()
    path.addEllipse(12, 12, 16, 16) 
       return path

但是,由于您只繪制一個(gè)橢圓,因此只需使用QGraphicsEllipseItem代替。


一些未經(jīng)請(qǐng)求的建議:

  • 如果您打算使用場(chǎng)景(QGraphicsItem 的父項(xiàng)只能是另一個(gè) QGraphicsItem),我會(huì)避免使用名稱“父項(xiàng)”,并且項(xiàng)通常不應(yīng)該“添加自身”到場(chǎng)景中;

  • 不要覆蓋self.xand self.y,因?yàn)樗鼈兪?QGraphicsItem現(xiàn)有 屬性

  • 如果您在一個(gè)場(chǎng)景中有多個(gè)項(xiàng)目并且只想使用鍵盤控制一個(gè)項(xiàng)目,通常最好覆蓋場(chǎng)景或視圖的鍵事件方法(特別是如果您使用箭頭鍵:即使?jié)L動(dòng)條被隱藏,他們?nèi)匀豢梢詳r截這些動(dòng)作);

  • 如果您仍然想在項(xiàng)目上使用鍵盤事件,請(qǐng)確保項(xiàng)目保持鍵盤焦點(diǎn):使用setFocus是不夠的,因?yàn)橐坏┯脩酎c(diǎn)擊其他地方它就會(huì)失去焦點(diǎn);一種可能的解決方案是使用QGraphicsItem.grabKeyboard()(僅在將項(xiàng)目添加到場(chǎng)景后才有效);

  • 如果您在 QFrame 上設(shè)置樣式表,它很可能至少會(huì)部分忽略任何框架選項(xiàng)集(形狀、陰影等),因?yàn)樗鼈內(nèi)Q于樣式/平臺(tái);通常最好不要將樣式表與與可視化相關(guān)的 Qt 小部件的設(shè)置混合在一起,因此在您的情況下,您可能只需要添加一個(gè)帶有正確樣式表參數(shù)集的簡(jiǎn)單 QFrame ;

  • 雖然從技術(shù)上講這不是問(wèn)題,但通常最好與導(dǎo)入“樣式”保持一致,特別是在使用像 Qt 這樣的復(fù)雜模塊時(shí):你要么導(dǎo)入單個(gè)類 ( from PyQt5.QtWidgets import QApplication, ...) 要么導(dǎo)入子模塊 ( from PyQt5 import QtCore, ...),否則它將使代碼只是令人困惑;


查看完整回答
反對(duì) 回復(fù) 2022-10-06
  • 1 回答
  • 0 關(guān)注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)