import pygame
import sys
import setting
pygame.init()
'主窗口'
screen_image = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
screen_rect = screen_image.get_rect()
'标题栏'
pygame.display.set_caption('Alien Qu Letian Invasion')
'曲乐天天帝一号飞船'
qlt_image = pygame.image.load('images/qlt.bmp')
qltsr_image = pygame.transform.scale(qlt_image, (90, 60))
qltsr_rect = qltsr_image.get_rect()
qltsr_rect.midbottom = screen_rect.midbottom
moving_left = False
moving_right = False
'子弹'
bullets = pygame.sprite.Group()
'死循环'
while True:
# 捕获键盘鼠标操作,按了退出按钮程序立刻结束
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
###########################
if event.key == pygame.K_F1:
pygame.quit()
sys.exit(0)
if event.key == pygame.K_LEFT:
moving_left = True
if event.key == pygame.K_RIGHT:
moving_right = True
if event.key == pygame.K_SPACE:
if len(bullets) < setting.bullets_allowed:
new_bullet = pygame.sprite.Sprite()
new_bullet.rect = pygame.Rect(0, 0, 3, 15) # type: ignore
new_bullet.rect.midbottom = qltsr_rect.midtop # type: ignore
bullets.add(new_bullet)
elif event.type == pygame.KEYUP:
print(event)
if event.key == pygame.K_LEFT:
moving_left = False
if event.key == pygame.K_RIGHT:
moving_right = False
'飞船随开关移动'
if moving_left and qltsr_rect.left > 0:
qltsr_rect.x -= setting.qltsr_speed
if moving_right and qltsr_rect.right < screen_rect.right:
qltsr_rect.x += setting.qltsr_speed
'绘制图像'
screen_image.fill(setting.bg_color1)
screen_image.blit(qltsr_image, (qltsr_rect))
pygame.display.flip()
for bullet in bullets:
pygame.draw.rect(screen_image, setting.bg_color2, bullet.rect)
bullet.rect.y -= 1
if bullet.rect.bottom < 0:
bullets.remove(bullet)
pygame.display.flip()
我的困惑是在“#”下面那三行:
因为我的本意是在全屏模式下按键q可以程序退出,母版本是我仅仅用了:
```python
sys.exit()
```python
pygame.key.set_mods(pygame.KMOD_CAPS)
仍然不能成功,我就删除了该段代码又添加了:
```python
```pygame.quit()
但是仍然不能成功,查阅资料了一个晚上也没有什么好的好的理解,如果按键F1退出倒是很容易解决,但如果我只想按键q退出,有什么好的思路建议嘛?万分感谢。
中文输入法不行就换成英文输入法,试试
中文输入法状态下无法触发KEYDOWN,转换成英文输入法才可以。可以通过环境变量显示输入法候选框,这样用户可以知道是中文输入法的问题。
import os
os.environ["SDL_IME_SHOW_UI"] = "1"
详见https://blog.csdn.net/qq_48979387/article/details/128784116 (7.4)
不知道你这个问题是否已经解决, 如果还没有解决的话:比方说,我们上一节课演示了代码,我们来一个截图:
这只小猪就是 surface 对象的 blit()方法将其移动到画布的背景上面的,这里有两个surface对象嘛,一个是小猪,一个是背景画布。那我现在问大家,眼前的是一个图像还是两个图像呢?
没错,答案是一个图像。事实上,在Pygame里面,每一刻呈现出来的也是一个图像,我们知道,图像是由像素组成的,比方说,我们的这只小猪,我们将其放大,就会看到很多小方块,就是像素。
我们使用 blit() 方法将一个图像放到另一个图像上,其实说并不是将一个图像真的拷贝到另一个图像上,Pygame 只是修改另一个图像某一部分的像素的颜色。例如,将小猪移动到白色画布上,Pygame只是将画布上小猪这一部分位置的像素的颜色改成小猪这个surface对象对应的像素的颜色,从而达到覆盖的效果。
安装一个pyautogui模块吧,使用函数自动按下Windows+空格热键,退出时再调用一下,就好了,我就是这样解决的;或者把输入法关掉,因为英文输入法可能也会霸占键盘输入。
希望可以帮助你,pyautogui模块详细请查必应。