Pygame(九)按鍵事件(2)
前情提要
前情提要
作業解析
完整代碼
# /usr/bin/python3
# Author: 愛編程的章老師
# @Time: 2021/1/7 0007
# E-mail: Bluesand2010@163.com
import pygame, sys, time
from random import randint
def homework():
'''作業'''
'''
擋板接球
一個寬100 ,高10的棕色擋板,一個直徑20的小球
小球從檔板上方縱向距離200以上,左右位置隨機的位置處以每次2單位,0.01秒一次的速度從上往下掉
用左右方向鍵(a 和 d也可以)來控制擋板左右移動來接住小球.
接住小不球,游戲勝利,
未接住,游戲失敗.
未接住定義:當注球的最下方位于與擋板的最上方.3 個以上單位的時候
接住定義:當小球的圓心橫坐標在擋板左右之間,小球與擋板相交,且小球的下方-擋板上方<=3
'''
pygame.init()
s = pygame.display.set_mode((800, 600))
# 擋板矩形
board = pygame.Rect(350, 550, 100, 10)
board_color = 139, 90, 43
pygame.draw.rect(s, board_color, board)
# 小球矩形
bx = randint(0, 780)
ball = pygame.Rect(bx, 100, 20,20)
ball_color = 255, 255, 255
pygame.draw.ellipse(s, ball_color, ball)
pygame.display.update()
pygame.key.set_repeat(pygame.KEYDOWN)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
ball.move_ip(0, 2)
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
board.move_ip(-5, 0)
elif keys[pygame.K_RIGHT]:
board.move_ip(5, 0)
if ball.bottom - board.top > 5:
print("你失敗了,游戲結束")
break
if ball.colliderect(board):
print("你勝利了")
break
s.fill((0, 0, 0))
pygame.draw.rect(s, board_color, board)
pygame.draw.ellipse(s, ball_color, ball)
pygame.display.update()
time.sleep(0.01)
if __name__ == '__main__':
homework()
幾點說明:
畫小球,用了ellipse().是因為這樣操作起來比較方便.不然,還要計算小球的球心,雖然只需要用一個rect.center()就可以解決.
按鍵檢測用了key.get_presssed(). 更簡潔一點.用事件的話,還要先檢測有沒有按下按鍵,再檢測按鍵是不是我們想要的.
這0.01秒更新一次.相當于一秒100幀
本節提要
本節提要
內容詳解
組合按鍵
上節課,我們學會了對單個按鍵的響應.今天我們來學習一下組合鍵(多鍵)響應
示例: 按ALT + F4 來關閉程序
代碼:
def combo_keydown():
pygame.init()
s = pygame.display.set_mode((800, 600))
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
keys = pygame.key.get_pressed()
if keys[pygame.K_LALT] or keys[pygame.K_RALT] and keys[pygame.K_F4]:
sys.exit()
備注:
功能鍵alt 與 ctrl 是分左右的.不要直接用K_ALT 與 K_CTRL 來判斷
這里用key.get_pressed()方法比直接用事件更簡潔.因為key.get_pressed()是專業的_
在我們開發游戲的時候,組合鍵的功能還是比較常用的.比如我們需要讓人物同時按下U + I 時發一個大招.
示例代碼
def combination_key2():
pygame.init()
s = pygame.display.set_mode((800, 600))
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
keys = pygame.key.get_pressed()
if keys[pygame.K_u] and keys[pygame.K_i]:
print("我發動了大招,就問你怕不怕")
效果圖:
image.png
鼠標響應
鼠標點擊事件
event == pygame.MOUSEBUTTONDOWN
屬性:button
值 | 意義 |
---|---|
1 | 左鍵單擊 |
2 | 滾輪單擊 |
3 | 右鍵單擊 |
4 | 滾輪朝上滾 |
5 | 滾輪朝下滾 |
示例:
# 鼠標單擊事件
def mouse_click():
pygame.init()
s = pygame.display.set_mode((800, 600))
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
print("左鍵單擊")
elif event.button == 2:
print("按下滾輪鍵")
elif event.button == 3:
print("按下右鍵")
elif event.button == 4:
print("滾輪朝上")
elif event.button == 5:
print("按下朝下")
屬性:pos
獲取鼠標點擊時的坐標
示例:
print("鼠標點擊的位置:", event.pos)
鼠標移動
event.type == pygame.MOUSEMOTION
屬性:pos 實時獲取鼠標當前位置的坐標
屬性:rel 鼠標的移動邏輯(dx,dy)從上一個記錄點到這一個記錄點的坐標變化情況
屬性:buttons:三個按鍵的按下情況的三元組.分別表示左中右三個按鍵.當按下時,值為1,松開時值為0
舉例:按下左鍵時移動,buttons的值(1,0,0),按下右鍵的時候移動,buttons的值為(0,0,1)
示例:
# 鼠標移動
def mouse_motion():
pygame.init()
s = pygame.display.set_mode((800, 600))
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEMOTION:
print(event.pos)
print(event.rel)
print(event.buttons)
松開鼠標
event.type == pygame.MOUSEBUTTONUP:
用法同鼠標點擊
# 鼠標松開事件
def mouse_up():
pygame.init()
s = pygame.display.set_mode((800, 600))
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEBUTTONUP:
print(event.button)
print(event.pos)
鼠標拖拽
舉例:
鼠標左鍵按下后拖拽效果
代碼:
def mouse_drag():
'''鼠標左鍵拖拽效果'''
pygame.init()
s = pygame.display.set_mode((800, 600))
start_pos = 0, 0
end_pos = 0, 0
drag_flag = False
width, height = 0, 0
rect_color = GREEN = 0, 255, 0
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
drag_flag = False
s.fill((0,0,0))
pygame.display.update()
if not drag_flag and event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
drag_flag = True
start_pos = event.pos
if drag_flag and event.type == pygame.MOUSEMOTION:
end_pos = event.pos
if start_pos[0] > end_pos[0]:
left = end_pos[0]
else:
left = start_pos[0]
if start_pos[1] > end_pos[1]:
top = end_pos[1]
else:
top = start_pos[1]
width = abs(start_pos[0] - end_pos[0])
height = abs(start_pos[1] - end_pos[1])
s.fill((0,0,0))
pygame.draw.rect(s, rect_color, (left, top, width, height), 1)
pygame.display.update()
效果圖:
鼠標拖拽效果圖
代碼解析:
鼠標拖拽的起點:drag_flag為假且鼠標左鍵點擊
鼠標拖拽的終點:drag_flag為真,且鼠標移動
放棄拖拽:drag_flag為假
當處于拖拽終點時,要畫矩形.
當處于放棄拖拽時,要清空屏幕
作業
隨心圓:以鼠標左鍵點擊為圓心,畫一個半徑50 ,顏色隨機的圓
點不中的矩形:在屏幕中初始化一個矩形,當鼠標點擊這個矩形時,矩形移動到鼠標沒有點到的地方.
備注:判斷一下點有沒有在矩形內,可以用矩形的collidepoint(x,y) 當點(x,y)在矩形內時返回True,否則返回False組合鍵:以上兩個的游戲關閉方法都是用組合鍵:alt + F4實現
復制與粘貼:屏幕上初始一個矩形, 當鼠標框選中矩形時,按CTRL + C 復制 這個矩形,然后在鼠標下一次點擊時以鼠標點擊處為矩形的中心粘貼這個矩形
后記
終于把按鍵的響應講完了.今天的內容比較多,也比較有用.是我們以后常用的內容.請多多練習鞏固