Pygame - stisk vice klaves – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pygame - stisk vice klaves – Python – Fórum – Programujte.comPygame - stisk vice klaves – Python – Fórum – Programujte.com

 

Tomas
~ Anonymní uživatel
560 příspěvků
25. 4. 2009   #1
-
0
-

Zdravim,
zkousim si hrat s pygame a jednu vec nemuzu rozchodit. Hraju si s pohybem a celkem to funguje i plynule. Pomoci pygame.key.set_repeat(1,0) mam nastaveno, aby se pohyb provadel i v pripade, ze je klavesa celou dobu stisknuta. Ale co nejde je stisk vice klaves. Konkretne bych chtel nasledujici:
- drzim sipku do prava a panacek bezi (mam)
- k drzene sipce primacknu mezernik a panacek tim smerem skoci (mam)
- pustim mezernik a cekam, ze panacek bude pokracovat v behu (a to mi nejde.....panacek se po pusteni druhe klavesy zastavi a ceka, az pustim sipku a znovu neco zmacknu). Nemate nejaky hint jak na to? Zde je kus kodu popisujici input:



pygame.key.set_repeat(1,0)
while 1:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[K_LEFT]:
objekt.posunl()
pygame.event.clear
if key_pressed[K_RIGHT]:
objekt.posunp()
pygame.event.clear
if key_pressed[K_RIGHT] and key_pressed[K_SPACE]:
objekt.jumpr()
pygame.event.clear(KEYDOWN)
if key_pressed[K_LEFT] and key_pressed[K_SPACE]:
objekt.jumpl()
pygame.event.clear(KEYDOWN)


Pouzivam po kazde akci pygame.event.clear protoze jinak se mi casto stalo, ze se panacek odmital zastavit i v pripade, ze uz sem vsechny klavesy pustil.

Diky,

Nahlásit jako SPAM
IP: 60.50.68.–
Koumes21
~ Anonymní uživatel
18 příspěvků
25. 4. 2009   #2
-
0
-

Já to obyčejně dělám tak, že nepoužívám set_repeat a když uživatel klávesu stiskne, zapamatuji si, že je stisknutá, pokud ji pustí, zapamatuji si, že už není stisknutá a nakonec vyhodnotím tyto hodnoty, které jsem si zapamatoval. Posílám přibližně ten úsek kódu, který si poslal ty, ale upravený způsobem, jakým bych to udělal já. Doufám, že bude užitečný.



# použijeme několik pomocných proměnných pro zapamatování stavu kláves
k_left = False
k_right = False
[...]

for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_ESCAPE:
sys.exit()

# tady si uložíme stavy kláves, když byla klávesa stisknuta
elif event.key==K_LEFT:
k_left = True
elif event.key==K_RIGHT:
k_right = True
[...]
elif event.type==KEYUP:
# a tady když byla puštěna
if event.key==K_LEFT:
k_left = False
elif event.key==K_RIGHT:
k_right = False
[...]

# tady si vyhodnoť klávesy, které jsou stisknuté, jak chceš
if k_left:
[...]
if k_right:
[...]

Nahlásit jako SPAM
IP: 212.24.152.–
Tomas
~ Anonymní uživatel
560 příspěvků
26. 4. 2009   #3
-
0
-

To Koumes21 :
Diky, takhle je to o moc lepsi, ale zase z nejakeho duvodu nemuzu odchytavat stisk vice klaves najednou. Napr.:



while 1:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_ESCAPE:
sys.exit()
if event.key==K_LEFT:
k_left=True
if event.key==K_RIGHT:
k_right=True
if event.key==K_RIGHT and event.key==K_SPACE:
k_jumpr=True
if event.key==K_LEFT and event.key==K_SPACE:
k_jumpl=True
elif event.type==KEYUP:
if event.key==K_LEFT:
k_left=False
if event.key==K_RIGHT:
k_right=False
if event.key==K_RIGHT and event.key==K_SPACE:
k_jumpr=False
print "FF"
if event.key==K_LEFT and event.key==K_SPACE:
k_jumpl=False

if k_left==True:
objekt.posunl()
if k_right==True:
objekt.posunp()
if k_jumpr==True:
objekt.jumpr()
if k_jumpl:
objekt.jumpl()


Nemas i na toto nejaky tip?

Zkousel sem i podminky:
if event.key==(K_RIGHT and K_SPACE):
ale to mi odchyti i v pripade, ze zmacknu jen space (tzn i v pripade, ze drzim sipku do leva a space)

Dik

Nahlásit jako SPAM
IP: 60.50.68.–
Koumes21
~ Anonymní uživatel
18 příspěvků
26. 4. 2009   #4
-
0
-

Na to si udělej proměnnou k_space a přiřazuj do ní stejně jako do k_left a k_right a až na konci (tam, kde máš teď "if k_jumpr") vyhodnoť "if k_left and k_space". Naopak k_jumpr a k_jumpl vůbec potřebovat nebudeš.

Nahlásit jako SPAM
IP: 212.24.152.–
Koumes21
~ Anonymní uživatel
18 příspěvků
26. 4. 2009   #5
-
0
-

Ještě abych řekl "proč" a ne jenom "jak": Jde o to, že jedna událost (event) je například jeden stisk klávesy, jedno puštění klávesy atd. Pokud stiskneš víc kláves úplně ve stejný okamžik (což by se ti pravděpodobně nepovedlo, ale teoreticky), tak se stejně vygenerují dvě události, které ty budeš vyhodnocovat postupně. Tudíž hodnota event.key se nemůže rovnat dvěma klávesám, ale vždy jen jedné. Proto si také musíš ukládat, v jakém stavu je která klávesa.

Nahlásit jako SPAM
IP: 212.24.152.–
Tomas
~ Anonymní uživatel
560 příspěvků
26. 4. 2009   #6
-
0
-

To Koumes21 :
Jo, myslel sem si, ze to bude ve zpusobu zpracovani eventu, ale nenapadlo me na to jit takhle jednoduse. Dik moc :)

Nahlásit jako SPAM
IP: 60.50.68.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Podobná vlákna

Stisk klavesy — založil Navstevnik

Čekání na stisk buttonu — založil Stěpán Bokoč

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý