判斷按鍵值_Pygame(九)按鍵事件(2)

Pygame(九)按鍵事件(2)

前情提要

eff78fcb4f80b7831f4036535bf823a1.png

前情提要

作業解析

完整代碼

# /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幀

本節提要

d696cb8fa98bfff82b0e1ee3389280db.png

本節提要

內容詳解

組合按鍵

上節課,我們學會了對單個按鍵的響應.今天我們來學習一下組合鍵(多鍵)響應

示例: 按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("我發動了大招,就問你怕不怕")

效果圖:

5e0ed03551b5dc814e44d3f59cb47c4a.png

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()

效果圖:

1aab46cef81baaba62b50b11bfe1c67d.gif

鼠標拖拽效果圖

代碼解析:

  • 鼠標拖拽的起點:drag_flag為假且鼠標左鍵點擊

  • 鼠標拖拽的終點:drag_flag為真,且鼠標移動

  • 放棄拖拽:drag_flag為假

當處于拖拽終點時,要畫矩形.
當處于放棄拖拽時,要清空屏幕

作業

  1. 隨心圓:以鼠標左鍵點擊為圓心,畫一個半徑50 ,顏色隨機的圓

  2. 點不中的矩形:在屏幕中初始化一個矩形,當鼠標點擊這個矩形時,矩形移動到鼠標沒有點到的地方.
    備注:判斷一下點有沒有在矩形內,可以用矩形的collidepoint(x,y) 當點(x,y)在矩形內時返回True,否則返回False

  3. 組合鍵:以上兩個的游戲關閉方法都是用組合鍵:alt + F4實現

  4. 復制與粘貼:屏幕上初始一個矩形, 當鼠標框選中矩形時,按CTRL + C 復制 這個矩形,然后在鼠標下一次點擊時以鼠標點擊處為矩形的中心粘貼這個矩形

后記

終于把按鍵的響應講完了.今天的內容比較多,也比較有用.是我們以后常用的內容.請多多練習鞏固

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534268.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態添加input_前端提效必備:動態模版生成

前言在日常開發中&#xff0c;我們需要不停的新建頁面和組件。以 Vue 項目為例&#xff0c;我們在新建一個頁面的時候&#xff0c;需要經歷一遍又一遍重復的過程&#xff1a;1、先新建一個文件夾2、然后新建一個 .vue 文件&#xff0c;寫上 、", "" ],"…

在dom最前面插入_JavaScript中的DOM

1. 關于DOM文檔對象模型(DocumentObject Model)&#xff0c;是基于瀏覽器編程的一套API接口&#xff0c;W3C出臺的推薦標準&#xff0c;每個瀏覽器都有一些細微的差別&#xff0c;其中以Mozilla(火狐)的瀏覽器最與標準接近。通過 DOM&#xff0c;可以訪問所有的 HTML元素&#…

python 快速刪除程序_如何快速一次性卸載所有python包(第三方庫)呢

很多時候我們都會有一個麻煩事&#xff0c;就是打開pycharm或者VScode等的時候&#xff0c;都有可能因為自己電腦上面安裝的第三方模塊過多&#xff0c;導致電腦很卡&#xff0c;風扇轉速不停地增加&#xff0c;這時候我們就會想去卸載一些不太用得著的第三方模塊&#xff0c;但…

python正則表達式修飾符_Python正則表達式

正則表達式是一個特殊的字符序列&#xff0c;它能幫助你方便的檢查一個字符串是否與某種模式匹配。re 模塊使 Python 語言擁有全部的正則表達式功能。compile 函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象。該對象擁有一系列方法用于正則表達式匹配和替換。r…

當代最值得收藏的畫家作品_當代最具潛力和收藏價值的十大畫家

原標題&#xff1a;當代最具潛力和收藏價值的十大畫家當代從事繪畫的人成千上萬&#xff0c;哪些名家作品值得收藏&#xff1f;當前都有哪些“潛力股”&#xff0c;相關專家綜合市場分析&#xff0c;純從藝術水準上列出值得收藏的“潛力股”&#xff0c;供愛好書畫收藏的各界人…

備抵附加賬戶的期末余額_會計賬戶的分類(二)

待攤費用賬戶的格式和運用方法同盤存類賬戶&#xff0c;即&#xff1a;期初如果有余額在借方&#xff0c;本期發生額的增加數在借方&#xff0c;本期發生額的減少數在貸方&#xff0c;期末如果有余額在借方。預提費用賬戶是指用來核算和監督按規定預先提取計入當期&#xff0c;…

mysql union all 別名_mysql union和union all

如下先創建2個表&#xff0c;aa bb.CREATE table aa(uid int(20) not null,name VARCHAR(30) not null)engineinnodb default charsetutf8mb4 COLLATE utf8mb4_general_ci;INSERT INTO aa(uid, name) VALUES (10, 張芳);INSERT INTO aa(uid, name) VALUES (11, 王凱);INSERT IN…

MySQL不走聯合索引_mysql group by 多列優化思路?為什么不走聯合索引?

explain SELECT a, b, COUNT(*) FROM tbnameGROUP BY a, border by a DESClimit 1a 和 b 列已經設置聯合索引&#xff0c; 為什么這種操作也會執行全表掃描呢&#xff1f;explain SELECT a, b FROM tbnameGROUP BY a, border by a DESC去掉 COUNT 和 limit 則走索引沒有掃描&am…

mysql ddl 鎖_MySQL Online DDL導致全局鎖表案例分析

MySQL Online DDL導致全局鎖表案例分析我這邊遇到了什么問題?線上給某個表執行新增索引SQL, 然后整個數據CPU打到100%, 連接數暴增到極限, 最后導致所有訪問數據庫的應用都奔潰.SQL如下:ALTER TABLE bookADD INDEX idx_sub_title (sub_title ASC);能看到什么?10063293, root,…

ci框架 亂碼 mysql_mysql容器亂碼問題

在docker-compose.yml文件中定義mysql導入utf-8的萬國碼services:mysql:image:mysql:5.7# command: [--character-set-serverutf8mb4, --collation-serverutf8mb4_unicode_ci]volumes:-./data/docker/mysql:/var/lib/mysql-./mysql/:/docker-entrypoint-initdb.d/-./conf/mys…

mysql分表 查詢 優化_MySQL性能管理及架構(查詢優化、分庫分表)一遍文章搞定...

相關配置參數&#xff1a;slow_query_log # 啟動停止記錄慢查日志&#xff0c;慢查詢日志默認是沒有開啟的可以在配置文件中開啟(on)slow_query_log_file # 指定慢查日志的存儲路徑及文件&#xff0c;日志存儲和數據從存儲應該分開存儲long_query_time # 指定記錄慢查詢日志SQL…

dokcer mysql修改編碼_默認支持utf8編碼的mysql docker鏡像

其他人都是不正確的使用mysql容器鏡像可以很快速的運行mysql&#xff0c;免去了傳統的虛擬機安裝方式的繁瑣配置。但是使用官方的mysql鏡像&#xff0c;你會遇到中文亂碼的問題&#xff0c;原因是官方鏡像的字符集默認值不是utf8。這時候你去google&#xff0c;會找到一些文章&…

mysql臨時表 清空_在數據庫中臨時表什么時候會被清除呢

展開全部我們仍使用 實驗 05 中的環境&#xff0c;略去準備數據的過程。我們仍然使用兩個會話&#xff0c;62616964757a686964616fe59b9ee7ad9431333433646439一個會話 run&#xff0c;用于運行主 SQL&#xff1b;另一個會話 ps&#xff0c;用于進行 performance_schema 的觀察…

locust mysql_locust性能壓測連接mysql,隨機取出班級,綁定學生

from locust import HttpLocust, TaskSet, taskimport pymysqlimport randomclass UserBehavior(TaskSet):def on_start(self):db pymysql.connect("ip地址", "用戶名", "密碼", "數據庫")cursor db.cursor()cursor.execute("S…

mysql無法添加或更新子行_違反完整性約束:1452無法添加或更新子行:

我試圖在我的注釋表中插入值&#xff0c;但出現錯誤。俗話說&#xff0c;我不能添加或更新子行&#xff0c;我也不知道這意味著什么。我的架構看起來像這樣-- ------------------------------ Table structure for comments-- ----------------------------DROP TABLE IF EXIST…

python醫學圖像分割_基于cv2的醫學圖像分割

例如&#xff0c;圖像如下所示&#xff1a;import cv2import numpy as npimg cv2.imread("mdb168.pgm",0)import matplotlib.pyplot as pltplt.imshow(img, cmap"gray")我想刪除圖像中所有的偽影和不必要的部分。在為此&#xff0c;我首先對圖像進行二值化…

python解析response的json_從HTML responseTex解析JSON

因此&#xff0c;我大體上同意&#xff0c;更好的解決方案是確保服務器只返回JSON&#xff0c;不過這是通過客戶端Javascript實現的一種快速方法&#xff0c;如Barmer所建議的那樣&#xff0c;將html解析到DOM&#xff0c;獲取body中的文本childNode并在其上運行JSONParse。在v…

mysql 密碼修改時間_Mysql修改密碼的方法

修改mysql密碼的方法&#xff1a;最簡單的&#xff0c;在Navicat連接后點用戶&#xff0c;找到rootlocalhost直接修改。注意如果裝了xampp&#xff0c;在phpmyadmin配置文件也需要改兩處密碼。下面是在命令行修改的方法。方法1&#xff1a;用mysqladmin----------------親測這個…

svn版本庫瀏覽器_在SVN版本庫瀏覽器中直接編輯文件保存后不會彈..._網絡編輯_幫考網...

原因是沒有實際添加到版本庫中&#xff0c;要添加到版本庫必須執行“Commit”。具體分析如下&#xff1a;SVN錯誤處理svn : Couldn’t perform atomic initialization. 臨時解決辦法&#xff1a;升級sqlite。原本安裝的是 subversion 1.6.16 sqlite 3.6.13&#xff0c;一直報”…

ubuntu下使用python將ppt轉成圖片_Ubuntu下使用Python實現游戲制作中的切分圖片功能...

本文實例講述了Ubuntu下使用Python實現游戲制作中的切分圖片功能。分享給大家供大家參考&#xff0c;具體如下&#xff1a;why拿到一個人物行走的素材&#xff0c;要用TexturePacker打包。TexturePacker打包后&#xff0c;助于游戲加載圖片效率&#xff0c;且比較好管理。目前得…