python按鍵按住不放持續(xù)響應(yīng)的實(shí)例代碼
在學(xué)習(xí)飛機(jī)大戰(zhàn)(我也不知道為什么都拿這個(gè)練手),飛機(jī)左右控制都是按鍵按一次移動(dòng)一次,不能按住一個(gè)鍵后持續(xù)移動(dòng),離開后停止移動(dòng)。
為了解決這個(gè),查看了參考手冊(cè),說(shuō)讓用pygame.key.set_repeat() 方法,奈何我剛開始學(xué)也看不太明白,只能看懂一些。并且看別人的代碼也比較費(fèi)勁,畢竟不是自己的邏輯,得看一會(huì)兒,最后還是自己想了一個(gè)辦法,用flag標(biāo)簽:
大體思路是這樣的,比如向左持續(xù)移動(dòng),先在hero定一個(gè)屬性標(biāo)簽設(shè)置布爾值為False,然后定義移動(dòng)方法,在為真時(shí),移動(dòng);再然后定義鍵盤的事件,當(dāng)按下鍵盤時(shí),標(biāo)簽為真,當(dāng)抬起鍵盤時(shí),設(shè)置為False。最后再while循環(huán)里執(zhí)行這個(gè)移動(dòng)方法和鍵盤函數(shù)。具體的代碼部分舉例為:(并不是全部代碼,只是實(shí)現(xiàn)這個(gè)功能的核心代碼),主要看Hero 類里的__init__方法里的四個(gè)屬性以及move方法;key_control函數(shù)以及在main函數(shù)里的while循環(huán)里的 key_control(hero) 以及hero.move()。
import pygame import time from pygame.locals import * # 用來(lái)檢測(cè)事件,比如鍵盤按鍵操作 class Hero(BasePlane): """定義我方飛機(jī)類""" def __init__(self, screen, enemy_temp): BasePlane.__init__(self, 140, 488, screen, "./spritesheets/hero_fly_1.png") # 繼承飛機(jī)基類,這里不用管 self.enemy = enemy_temp # 設(shè)置上下左右四個(gè)屬性 self.key_right_status = False self.key_left_status = False self.key_up_status = False self.key_down_status = False # 以下方法是控制上下左右移動(dòng) def move(self): if self.key_right_status: self.x += 3 if self.key_left_status: self.x -= 3 if self.key_down_status: self.y += 3 if self.key_up_status: self.y -= 3 def key_control(hero_temp): """控制鍵盤的函數(shù)""" for event in pygame.event.get(): # 判斷是否是點(diǎn)擊了退出按鈕 if event.type == QUIT: print("exit") exit() # 在按下鍵盤時(shí),設(shè)置hero的屬性為True elif event.type == KEYDOWN: if event.key == K_a or event.key == K_LEFT: hero_temp.key_left_status = True elif event.key == K_d or event.key == K_RIGHT: hero_temp.key_right_status = True elif event.key == K_w or event.key == K_UP: hero_temp.key_up_status = True elif event.key == K_s or event.key == K_DOWN: hero_temp.key_down_status = True elif event.key == K_SPACE: hero_temp.shoot() # 這里應(yīng)該是飛機(jī).顯示子彈方法() elif event.type == KEYUP: if event.key == K_a or event.key == K_LEFT: hero_temp.key_left_status = False # 檢測(cè)按鍵是否是d或者方向鍵right elif event.key == K_d or event.key == K_RIGHT: hero_temp.key_right_status = False elif event.key == K_w or event.key == K_UP: hero_temp.key_up_status = False elif event.key == K_s or event.key == K_DOWN: hero_temp.key_down_status = False def main(): # 1.創(chuàng)建一個(gè)窗口,用來(lái)顯示內(nèi)容 screen = pygame.display.set_mode((320, 568), 0, 32) # 2.創(chuàng)建一個(gè)跟窗口大小一致的圖片,用來(lái)填充當(dāng)背景 background = pygame.image.load("./spritesheets/background_2.png") enemy = Enemy(screen) hero = Hero(screen, enemy) # 創(chuàng)建我方飛機(jī)英雄對(duì)象 while True: # 設(shè)定需要顯示的圖在窗口中哪個(gè)位置顯示 screen.blit(background, (0, 0)) # 我方飛機(jī)英雄顯示 hero.display() # 敵方飛機(jī)顯示 enemy.display() enemy.move() enemy.shoot() # 獲取事件,比如按鍵等 key_control(hero) hero.move() # 更新需要顯示的內(nèi)容 pygame.display.update() time.sleep(0.01) if __name__ == '__main__': main()
以上這篇python按鍵按住不放持續(xù)響應(yīng)的實(shí)例代碼就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python 實(shí)現(xiàn)鍵盤鼠標(biāo)按鍵模擬
- python實(shí)現(xiàn)模擬按鍵,自動(dòng)翻頁(yè)看u17漫畫
- Python實(shí)現(xiàn)windows下模擬按鍵和鼠標(biāo)點(diǎn)擊的方法
- python實(shí)現(xiàn)按鍵精靈找色點(diǎn)擊功能教程,使用pywin32和Pillow庫(kù)
- python中字典按鍵或鍵值排序的實(shí)現(xiàn)代碼
- python對(duì)綁定事件的鼠標(biāo)、按鍵的判斷實(shí)例
- Python中按鍵來(lái)獲取指定的值
- Python實(shí)現(xiàn)的字典排序操作示例【按鍵名key與鍵值value排序】
- Python實(shí)現(xiàn)對(duì)字典分別按鍵(key)和值(value)進(jìn)行排序的方法分析
- python 字典(dict)按鍵和值排序
- Python可跨平臺(tái)實(shí)現(xiàn)獲取按鍵的方法
- Python 隨機(jī)按鍵模擬2小時(shí)
相關(guān)文章
python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法
這篇文章主要介紹了python實(shí)現(xiàn)基于兩張圖片生成圓角圖標(biāo)效果的方法,實(shí)例分析了Python使用pil模塊進(jìn)行圖片處理的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03Python使用gRPC實(shí)現(xiàn)數(shù)據(jù)分析能力的共享
gRPC是一個(gè)高性能、開源、通用的遠(yuǎn)程過(guò)程調(diào)用(RPC)框架,由Google推出,本文主要介紹了Python如何使用gRPC實(shí)現(xiàn)數(shù)據(jù)分析能力的共享,感興趣的可以了解下2024-02-02pandas中DataFrame的merge操作的實(shí)現(xiàn)
本文主要介紹了pandas中DataFrame的merge操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Pytest+request+Allure實(shí)現(xiàn)接口自動(dòng)化框架
接口自動(dòng)化是指模擬程序接口層面的自動(dòng)化,由于接口不易變更,維護(hù)成本更小,所以深受各大公司的喜愛(ài),本文主要介紹了Pytest+request+Allure實(shí)現(xiàn)接口自動(dòng)化框架,感興趣的可以了解一下2021-07-07OpenCV實(shí)現(xiàn)常見(jiàn)的四種圖像幾何變換
這篇文章主要介紹了利用OpenCV實(shí)現(xiàn)的四種圖像幾何變換:縮放、翻轉(zhuǎn)、仿射變換及透視。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-04-04解決pytorch讀取自制數(shù)據(jù)集出現(xiàn)過(guò)的問(wèn)題
這篇文章主要介紹了解決pytorch讀取自制數(shù)據(jù)集出現(xiàn)過(guò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05實(shí)例講解Python爬取網(wǎng)頁(yè)數(shù)據(jù)
這篇文章給大家通過(guò)實(shí)例講解了Python爬取網(wǎng)頁(yè)數(shù)據(jù)的步驟以及操作過(guò)程,有興趣的朋友跟著學(xué)習(xí)下吧。2018-07-07Python集合union()函數(shù)使用實(shí)例詳解
union()方法的工作原理是:返回多個(gè)集合(集合的數(shù)量大于等于2)的并集,即結(jié)果集合包含了所有被合并集合中的所有元素,因?yàn)榧现械脑夭豢芍貜?fù),所以各個(gè)集合中重復(fù)的元素在結(jié)果集合中只會(huì)出現(xiàn)一次,本文將簡(jiǎn)單介紹一下Python union()函數(shù)使用方法2023-07-07