日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

判断按键值_Pygame(九)按键事件(2)

發(fā)布時(shí)間:2025/3/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断按键值_Pygame(九)按键事件(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Pygame(九)按鍵事件(2)

前情提要

前情提要

作業(yè)解析

完整代碼

# /usr/bin/python3

# Author: 愛(ài)編程的章老師
# @Time: 2021/1/7 0007
# E-mail: Bluesand2010@163.com
import pygame, sys, time
from random import randint

def homework():
'''作業(yè)'''
'''
擋板接球
一個(gè)寬100 ,高10的棕色擋板,一個(gè)直徑20的小球
小球從檔板上方縱向距離200以上,左右位置隨機(jī)的位置處以每次2單位,0.01秒一次的速度從上往下掉
用左右方向鍵(a 和 d也可以)來(lái)控制擋板左右移動(dòng)來(lái)接住小球.
接住小不球,游戲勝利,
未接住,游戲失敗.
未接住定義:當(dāng)注球的最下方位于與擋板的最上方.3 個(gè)以上單位的時(shí)候
接住定義:當(dāng)小球的圓心橫坐標(biāo)在擋板左右之間,小球與擋板相交,且小球的下方-擋板上方<=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("你失敗了,游戲結(jié)束")
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()

幾點(diǎn)說(shuō)明:

  • 畫(huà)小球,用了ellipse().是因?yàn)檫@樣操作起來(lái)比較方便.不然,還要計(jì)算小球的球心,雖然只需要用一個(gè)rect.center()就可以解決.

  • 按鍵檢測(cè)用了key.get_presssed(). 更簡(jiǎn)潔一點(diǎn).用事件的話,還要先檢測(cè)有沒(méi)有按下按鍵,再檢測(cè)按鍵是不是我們想要的.

  • 這0.01秒更新一次.相當(dāng)于一秒100幀

本節(jié)提要

本節(jié)提要

內(nèi)容詳解

組合按鍵

上節(jié)課,我們學(xué)會(huì)了對(duì)單個(gè)按鍵的響應(yīng).今天我們來(lái)學(xué)習(xí)一下組合鍵(多鍵)響應(yīng)

示例: 按ALT + F4 來(lái)關(guān)閉程序

代碼:

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 來(lái)判斷

  • 這里用key.get_pressed()方法比直接用事件更簡(jiǎn)潔.因?yàn)閗ey.get_pressed()是專(zhuān)業(yè)的_

在我們開(kāi)發(fā)游戲的時(shí)候,組合鍵的功能還是比較常用的.比如我們需要讓人物同時(shí)按下U + I 時(shí)發(fā)一個(gè)大招.
示例代碼

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("我發(fā)動(dòng)了大招,就問(wèn)你怕不怕")

效果圖:

image.png

鼠標(biāo)響應(yīng)

鼠標(biāo)點(diǎn)擊事件

event == pygame.MOUSEBUTTONDOWN

屬性:button

值意義
1左鍵單擊
2滾輪單擊
3右鍵單擊
4滾輪朝上滾
5滾輪朝下滾

示例:

# 鼠標(biāo)單擊事件
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
獲取鼠標(biāo)點(diǎn)擊時(shí)的坐標(biāo)

示例:

print("鼠標(biāo)點(diǎn)擊的位置:", event.pos)

鼠標(biāo)移動(dòng)

event.type == pygame.MOUSEMOTION

屬性:pos 實(shí)時(shí)獲取鼠標(biāo)當(dāng)前位置的坐標(biāo)
屬性:rel 鼠標(biāo)的移動(dòng)邏輯(dx,dy)從上一個(gè)記錄點(diǎn)到這一個(gè)記錄點(diǎn)的坐標(biāo)變化情況
屬性:buttons:三個(gè)按鍵的按下情況的三元組.分別表示左中右三個(gè)按鍵.當(dāng)按下時(shí),值為1,松開(kāi)時(shí)值為0
舉例:按下左鍵時(shí)移動(dòng),buttons的值(1,0,0),按下右鍵的時(shí)候移動(dòng),buttons的值為(0,0,1)

示例:

# 鼠標(biāo)移動(dòng)
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)

松開(kāi)鼠標(biāo)

event.type == pygame.MOUSEBUTTONUP:

用法同鼠標(biāo)點(diǎn)擊

# 鼠標(biāo)松開(kāi)事件
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)

鼠標(biāo)拖拽

舉例:
鼠標(biāo)左鍵按下后拖拽效果
代碼:

def mouse_drag():
'''鼠標(biāo)左鍵拖拽效果'''
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()

效果圖:

鼠標(biāo)拖拽效果圖

代碼解析:

  • 鼠標(biāo)拖拽的起點(diǎn):drag_flag為假且鼠標(biāo)左鍵點(diǎn)擊

  • 鼠標(biāo)拖拽的終點(diǎn):drag_flag為真,且鼠標(biāo)移動(dòng)

  • 放棄拖拽:drag_flag為假

當(dāng)處于拖拽終點(diǎn)時(shí),要畫(huà)矩形.
當(dāng)處于放棄拖拽時(shí),要清空屏幕

作業(yè)

  • 隨心圓:以鼠標(biāo)左鍵點(diǎn)擊為圓心,畫(huà)一個(gè)半徑50 ,顏色隨機(jī)的圓

  • 點(diǎn)不中的矩形:在屏幕中初始化一個(gè)矩形,當(dāng)鼠標(biāo)點(diǎn)擊這個(gè)矩形時(shí),矩形移動(dòng)到鼠標(biāo)沒(méi)有點(diǎn)到的地方.
    備注:判斷一下點(diǎn)有沒(méi)有在矩形內(nèi),可以用矩形的collidepoint(x,y) 當(dāng)點(diǎn)(x,y)在矩形內(nèi)時(shí)返回True,否則返回False

  • 組合鍵:以上兩個(gè)的游戲關(guān)閉方法都是用組合鍵:alt + F4實(shí)現(xiàn)

  • 復(fù)制與粘貼:屏幕上初始一個(gè)矩形, 當(dāng)鼠標(biāo)框選中矩形時(shí),按CTRL + C 復(fù)制 這個(gè)矩形,然后在鼠標(biāo)下一次點(diǎn)擊時(shí)以鼠標(biāo)點(diǎn)擊處為矩形的中心粘貼這個(gè)矩形

  • 后記

    終于把按鍵的響應(yīng)講完了.今天的內(nèi)容比較多,也比較有用.是我們以后常用的內(nèi)容.請(qǐng)多多練習(xí)鞏固

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的判断按键值_Pygame(九)按键事件(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。