欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python tkinter Canvas繪制動畫桌面彈球游戲

系統 1875 0

其實前面程序中的高亮顯示已經是動畫效果了。程序會用紅色、黃色交替顯示幾何圖形的邊框,這樣看上去就是動畫效果了。實現其他動畫效果也是這個原理,程序只要增加一個定時器,周期性地改變界面上圖形項的顏色、大小、位置等選項,用戶看上去就是所謂的“動畫”了。

下面以一個簡單的桌面彈球游戲來介紹使用 Canvas 繪制動畫。在游戲界面上會有一個小球,該小球會在界面上滾動,遇到邊界或用戶擋板就會反彈。該程序涉及兩個動畫:

  • 小球轉動:小球轉動是一個“逐幀動畫”,程序會循環顯示多張轉動的小球圖片,這樣用戶就會看到小球轉動的效果。
  • 小球移動:只要改變小球的坐標程序就可以控制小球移動。


為了讓用戶控制擋板移動,程序還為 Canvas 的向左箭頭、向右箭頭綁定了事件處理函數。下面是桌面彈球游戲的程序:

            ?
          
  1. from tkinter import *
  2. from tkinter import messagebox
  3. import threading
  4. import random
  5. GAME_WIDTH = 500
  6. GAME_HEIGHT = 680
  7. BOARD_X = 230
  8. BOARD_Y = 600
  9. BOARD_WIDTH = 80
  10. BALL_RADIUS = 9
  11. class App:
  12. def __init__(self, master):
  13. self.master = master
  14. # 記錄小球動畫的第幾幀
  15. self.ball_index = 0
  16. # 記錄游戲是否失敗的旗標
  17. self.is_lose = False
  18. # 初始化記錄小球位置的變量
  19. self.curx = 260
  20. self.cury = 30
  21. self.boardx = BOARD_X
  22. self.init_widgets()
  23. self.vx = random.randint(3, 6) # x方向的速度
  24. self.vy = random.randint(5, 10) # y方向的速度
  25. # 通過定時器指定0.1秒之后執行moveball函數
  26. self.t = threading.Timer(0.1, self.moveball)
  27. self.t.start()
  28. # 創建界面組件
  29. def init_widgets(self):
  30. self.cv = Canvas(root, background='white',
  31. width=GAME_WIDTH, height=GAME_HEIGHT)
  32. self.cv.pack()
  33. # 讓畫布得到焦點,從而可以響應按鍵事件
  34. self.cv.focus_set()
  35. self.cv.bms = []
  36. # 初始化小球的動畫幀
  37. for i in range(8):
  38. self.cv.bms.append(PhotoImage(file='images/ball_' + str(i+1) + '.gif'))
  39. # 繪制小球
  40. self.ball = self.cv.create_image(self.curx, self.cury,
  41. image=self.cv.bms[self.ball_index])
  42. self.board = self.cv.create_rectangle(BOARD_X, BOARD_Y,
  43. BOARD_X + BOARD_WIDTH, BOARD_Y + 20, width=0, fill='lightblue')
  44. # 為向左箭頭按鍵綁定事件,擋板左移
  45. self.cv.bind(' ', self.move_left)
  46. # 為向右箭頭按鍵綁定事件,擋板右移
  47. self.cv.bind(' ', self.move_right)
  48. def move_left(self, event):
  49. if self.boardx <= 0:
  50. return
  51. self.boardx -= 5
  52. self.cv.coords(self.board, self.boardx, BOARD_Y,
  53. self.boardx + BOARD_WIDTH, BOARD_Y + 20)
  54. def move_right(self, event):
  55. if self.boardx + BOARD_WIDTH >= GAME_WIDTH:
  56. return
  57. self.boardx += 5
  58. self.cv.coords(self.board, self.boardx, BOARD_Y,
  59. self.boardx + BOARD_WIDTH, BOARD_Y + 20)
  60. def moveball(self):
  61. self.curx += self.vx
  62. self.cury += self.vy
  63. # 小球到了右邊墻壁,轉向
  64. if self.curx + BALL_RADIUS >= GAME_WIDTH:
  65. self.vx = -self.vx
  66. # 小球到了左邊墻壁,轉向
  67. if self.curx - BALL_RADIUS <= 0:
  68. self.vx = -self.vx
  69. # 小球到了上邊墻壁,轉向
  70. if self.cury - BALL_RADIUS <= 0:
  71. self.vy = -self.vy
  72. # 小球到了擋板處
  73. if self.cury + BALL_RADIUS >= BOARD_Y:
  74. # 如果在擋板范圍內
  75. if self.boardx <= self.curx <= (self.boardx + BOARD_WIDTH):
  76. self.vy = -self.vy
  77. else:
  78. messagebox.showinfo(title='失敗', message='您已經輸了')
  79. self.is_lose = True
  80. self.cv.coords(self.ball, self.curx, self.cury)
  81. self.ball_index += 1
  82. self.cv.itemconfig(self.ball, image=self.cv.bms[self.ball_index % 8])
  83. # 如果游戲還未失敗,讓定時器繼續執行
  84. if not self.is_lose:
  85. # 通過定時器指定0.1秒之后執行moveball函數
  86. self.t = threading.Timer(0.1, self.moveball)
  87. self.t.start()
  88. root = Tk()
  89. root.title("彈球游戲")
  90. root.iconbitmap('images/fklogo.ico')
  91. root.geometry('%dx%d' % (GAME_WIDTH, GAME_HEIGHT))
  92. # 禁止改變窗口大小
  93. root.resizable(width=False, height=False)
  94. App(root)
  95. root.mainloop()

上面程序中第 26、27 行代碼通過線程啟動了一個定時器,該定時器控制 moveball() 方法每隔 0.1 秒執行一次,而 moveball() 方法中通過改變小球的坐標可以實現小球移動的效果;通過改變小球的圖片,可以實現小球滾動的效果。

運行上面程序,可以看到如圖 1 所示的游戲效果:


Python tkinter Canvas繪制動畫桌面彈球游戲_第1張圖片
圖 1 桌面彈球游戲


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 超级碰碰碰免费视频 | 亚洲午夜电影 | 91久久线看在观草草青青 | 一区二区三区四区免费 | 亚洲精品乱码久久久久久v 国产高清免费视频 | 免费在线国产视频 | 欧美激情在线播放 | 男人的天堂在线视频 | 一区二区三区不卡免费视频97 | 成人毛片100免费观看 | 欧美日韩中字 | 日韩成人免费观看 | 国产精品视频二区不卡 | 日韩在线亚洲 | 亚洲九九夜夜 | 成人小视频在线观看 | 精品啪啪 | 久久中文在线 | 亚洲成av| 亚洲成人福利在线 | 日本精品免费 | av网址在线播放 | 久久久久久网站 | 五月伊人网 | 欧美激情视频二区三区 | 日日碰狠狠添天天爽五月婷 | 人人狠狠综合88综合久久 | 久久国产乱子免费精品 | 国内一级特黄女人精品片 | 成人在线播放网站 | 久草观看 | 色情女教师3波多野结衣 | 亚洲免费在线 | 国产视频99 | 在线国产一区二区 | 欧美影院推理片免费看 | 四虎永久免费网站入口2020 | 国产精品999 | 国产精品美女久久久久aⅴ国产馆 | 小明成人免费视频 | 91美女啪啪 |