抓到pygame的bug

更新於 發佈於 閱讀時間約 5 分鐘

寫完《The Nature of Code閱讀心得筆記——使用Python實作》 《The Nature of Code閱讀心得與Python實作》第一章之後,就照原書的建議,開始用程式來打造一個生態系統。

因為進度才到第一章,能用的東西不多,當然不可能寫出什麼太複雜的效果出來,所以就決定用第一章最後一個範例當基礎,先試著做出些簡單的效果來。雖然這些效果都很簡單,但可以變成以後製作比較複雜效果時的「零件」來使用,零件越多,打造出來的生態系統應該會越豐富。

第一章最後一個範例所呈現的效果,是一堆會跟著滑鼠游標跑的球。看著這些追逐著滑鼠游標的球,決定讓它們不再像貓想抓老鼠一樣,追著不是真的老鼠的滑鼠跑,而讓它們回歸身為球的初心,變成在畫面中跑來跑去,碰到邊邊會反彈的球。

程式很快就寫好了,一堆球也在畫面上跑來跑去。不過,有個地方卻怪怪的,有時候當球碰到左邊邊界反彈時,會有條橫跨畫面的黑色長條快速地閃了一下。除了這個奇怪的現象之外,其他一切都正常。這究竟是怎麼回事?

難道是程式哪裡有問題?看到奇怪的現象,第一個冒出來的念頭,當然就是懷疑自己寫的程式。

為了要找出可能的程式錯誤,先把球的數量減少到只剩一個,然後看看當球碰到左邊邊界時,各個數字如球的座標、速度、加速度等,有沒有不對勁的地方。結果發現,當球碰到左邊邊界而閃現黑色長條時,球的中心點x座標是負值。

看來這應該是pygame的bug,而不是自己寫的程式有問題。為了進一步證實這個猜測,重寫了一個單純只畫出圓球的程式,除了畫出不同位置的圓球之外,沒有任何其他作用,結果如下:

raw-image

圖中由上而下,圓球中心的座標分別為

(0, 50)
(-0.99999, 100)
(-1.0, 150)
(-16, 200)
(-50, 250)
(-1, 300)

從這裡就可以看出來,當球心的x座標小於等於-1時,就會出現問題。另外,這些橫線的確是跟圓球有關,因為在畫球時,最後一個球的半徑,刻意設定成其他圓球的一半,而最下面的那條橫線,寬度也剛好是其他橫線的一半。

這個抓bug的過程,還真是挺像偵探辦案的過程,大膽假設,小心求證,推理、模擬驗證樣樣不可少。

確定這是pygame的bug之後,到pygame的github專案上查了一下。果然!已經有好幾個人提出同樣的問題了,看來新的版本出來時,應該就不會有這個問題了。

測試程式:

import pygame
import sys

pygame.init()

screen = pygame.display.set_mode((640, 360))
frame_rate = pygame.time.Clock()

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()

  screen.fill(WHITE)

  pygame.draw.circle(screen, BLACK, (0, 50), 16)
  pygame.draw.circle(screen, BLACK, (-0.99999, 100), 16)
  pygame.draw.circle(screen, BLACK, (-1.0, 150), 16)
  pygame.draw.circle(screen, BLACK, (-16, 200), 16)
  pygame.draw.circle(screen, BLACK, (-50, 250), 16)
  pygame.draw.circle(screen, BLACK, (-1, 300), 8)

  pygame.display.update()
  frame_rate.tick(60)
留言
avatar-img
留言分享你的想法!
avatar-img
ysf的沙龍
15會員
142內容數
寫點東西自娛娛人
ysf的沙龍的其他內容
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2025/04/14
花了些時間,靜下心來,仔仔細細地研究了一番,總算把Python呼叫函數時引數的傳遞方式給徹底搞清楚了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2024/05/08
呼!折騰了好久,終於徹底搞清楚pygame的各個blend mode所用的計算式,到底是長啥樣子了。
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
2023/12/20
在寫《The Nature of Code閱讀心得筆記——使用Python實作》的[第四章]4.3節時,原書提到,在使用Java的ArrayList時,如果用迴圈一面走訪一面又移除其中的元素,那會有難以察覺的問題存在。寫個小程式測試的結果發現,Python的list也會有一樣的問題。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
在完成一些简单的任务之后,我觉得ChatGPT可以帮我完成一些更为复杂,甚至于可能我并不是特别擅长的任务,而我想到了,也许,可以帮我写一个简单的游戏。 贪多嚼不烂的道理我还是明白的,于是,我给自己提前就设定了一个目标: 游戏可以运行实现简单的规则减少BUG的存在可以开始和结束 带着这四个最朴素
Thumbnail
在完成一些简单的任务之后,我觉得ChatGPT可以帮我完成一些更为复杂,甚至于可能我并不是特别擅长的任务,而我想到了,也许,可以帮我写一个简单的游戏。 贪多嚼不烂的道理我还是明白的,于是,我给自己提前就设定了一个目标: 游戏可以运行实现简单的规则减少BUG的存在可以开始和结束 带着这四个最朴素
Thumbnail
看來這應該是pygame的bug,而不是自己寫的程式有問題。為了進一步證實這個猜測,重寫了一個單純只畫出圓球的程式,除了畫出不同位置的圓球之外,沒有任何其他作用
Thumbnail
看來這應該是pygame的bug,而不是自己寫的程式有問題。為了進一步證實這個猜測,重寫了一個單純只畫出圓球的程式,除了畫出不同位置的圓球之外,沒有任何其他作用
Thumbnail
這篇文章將會介紹作品製作過程中的一些心得體悟。
Thumbnail
這篇文章將會介紹作品製作過程中的一些心得體悟。
Thumbnail
快速反應事件(Quick Time Events,簡稱 QTE)是電子遊戲中的一種遊戲機制,玩家必須在特定的時間框架內按下控制器或鍵盤上的按鈕,以便繼續遊戲或避免失敗。它們通常用於動作或冒險遊戲中,以增加場景的緊張感或興奮感。 本次開發,思考著2D橫向遊戲,解謎動作類,要如何更有趣,因此想到了QTE
Thumbnail
快速反應事件(Quick Time Events,簡稱 QTE)是電子遊戲中的一種遊戲機制,玩家必須在特定的時間框架內按下控制器或鍵盤上的按鈕,以便繼續遊戲或避免失敗。它們通常用於動作或冒險遊戲中,以增加場景的緊張感或興奮感。 本次開發,思考著2D橫向遊戲,解謎動作類,要如何更有趣,因此想到了QTE
Thumbnail
在那Nokia手機風靡全球的年代,因該有不少人玩過手機內建的貪吃蛇遊戲,記得當時年紀小在還是學生的那個年代就經常利用上電腦課的時候偷偷用我那隻好不容易打工購買的Nokia手機玩這款遊戲,玩到最後還利用電腦課的時間用BASIC寫出了一款簡易版的貪吃蛇遊戲。。。
Thumbnail
在那Nokia手機風靡全球的年代,因該有不少人玩過手機內建的貪吃蛇遊戲,記得當時年紀小在還是學生的那個年代就經常利用上電腦課的時候偷偷用我那隻好不容易打工購買的Nokia手機玩這款遊戲,玩到最後還利用電腦課的時間用BASIC寫出了一款簡易版的貪吃蛇遊戲。。。
Thumbnail
有些風景需要親自經歷後才能了解箇中滋味,這初衷,也可能讓您在20幾年後的今天,被現實打擊到身心疲憊時為了鼓舞自己大聲吶喊莫忘初衷後可以立即回憶起的經歷。 以上故事純屬虛構,如有雷同實屬巧合,以下開始本次教學。 依照慣例我們一樣先來看看完成後的的遊玩影片: A、提案企劃 一句話形容這個遊戲 遊戲類型
Thumbnail
有些風景需要親自經歷後才能了解箇中滋味,這初衷,也可能讓您在20幾年後的今天,被現實打擊到身心疲憊時為了鼓舞自己大聲吶喊莫忘初衷後可以立即回憶起的經歷。 以上故事純屬虛構,如有雷同實屬巧合,以下開始本次教學。 依照慣例我們一樣先來看看完成後的的遊玩影片: A、提案企劃 一句話形容這個遊戲 遊戲類型
Thumbnail
三張scratch積木程式圖示 大朋友小朋友都能參於 輕鬆完成經典貪食蛇遊戲!! 以學習為主要目標 完成了永不失敗的貪食蛇!! 內文提供SCRATCH連結可以回味一下貪食蛇遊戲
Thumbnail
三張scratch積木程式圖示 大朋友小朋友都能參於 輕鬆完成經典貪食蛇遊戲!! 以學習為主要目標 完成了永不失敗的貪食蛇!! 內文提供SCRATCH連結可以回味一下貪食蛇遊戲
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News