Python游戏键没有响应
我正在尝试实现一个Python游戏(PyGame包中的异形.py),但当我运行它时,我无法移动我的玩家或进行任何射击…Python游戏键没有响应,python,macos,pygame,key,Python,Macos,Pygame,Key,我正在尝试实现一个Python游戏(PyGame包中的异形.py),但当我运行它时,我无法移动我的玩家或进行任何射击… 我在MacOSX、python3上运行它,并且有一个法语键盘。这和它不需要我的任何键盘命令有什么关系吗 在我的终端屏幕上,我看到: ^[(当我按esc键时), ^[[D(当我按下左箭头时), ^[[C(当我按下右箭头时), ^[[A(当我按下向上箭头时), ^[[B(当我按下向下箭头时 ... 这正常吗?用^[[C替换K_RIGHT #!/usr/bin/env python
我在MacOSX、python3上运行它,并且有一个法语键盘。这和它不需要我的任何键盘命令有什么关系吗 在我的终端屏幕上,我看到:
^[
(当我按esc键时),^[[D
(当我按下左箭头时),^[[C
(当我按下右箭头时),^[[A
(当我按下向上箭头时),^[[B
(当我按下向下箭头时... 这正常吗?用
^[[C
替换K_RIGHT
#!/usr/bin/env python
import random, os.path
#import basic pygame modules
import pygame
from pygame.locals import *
#see if we can load more than standard BMP
if not pygame.image.get_extended():
raise SystemExit("Sorry, extended image module required")
#game constants
MAX_SHOTS = 2 #most player bullets onscreen
ALIEN_ODDS = 22 #ances a new alien appears
BOMB_ODDS = 60 #chances a new bomb will drop
ALIEN_RELOAD = 12 #frames between new aliens
SCREENRECT = Rect(0, 0, 940, 480)
SCORE = 0
main_dir = os.path.split(os.path.abspath(__file__))[0]
def load_image(file):
"loads an image, prepares it for play"
file = os.path.join(main_dir, 'data', file)
try:
surface = pygame.image.load(file)
except pygame.error:
raise SystemExit('Could not load image "%s" %s'%(file, pygame.get_error()))
return surface.convert()
def load_images(*files):
imgs = []
for file in files:
imgs.append(load_image(file))
return imgs
class dummysound:
def play(self): pass
def load_sound(file):
if not pygame.mixer: return dummysound()
file = os.path.join(main_dir, 'data', file)
try:
sound = pygame.mixer.Sound(file)
return sound
except pygame.error:
print ('Warning, unable to load, %s' % file)
return dummysound()
# each type of game object gets an init and an
# update function. the update function is called
# once per frame, and it is when each object should
# change it's current position and state. the Player
# object actually gets a "move" function instead of
# update, since it is passed extra information about
# the keyboard
class Player(pygame.sprite.Sprite):
speed = 10
bounce = 24
gun_offset = -11
images = []
def __init__(self):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = self.images[0]
self.rect = self.image.get_rect(midbottom=SCREENRECT.midbottom)
self.reloading = 0
self.origtop = self.rect.top
self.facing = -1
def move(self, direction):
if direction: self.facing = direction
self.rect.move_ip(direction*self.speed, 0)
self.rect = self.rect.clamp(SCREENRECT)
if direction < 0:
self.image = self.images[0]
elif direction > 0:
self.image = self.images[1]
self.rect.top = self.origtop - (self.rect.left//self.bounce%2)
def gunpos(self):
pos = self.facing*self.gun_offset + self.rect.centerx
return pos, self.rect.top
class Alien(pygame.sprite.Sprite):
speed = 13
animcycle = 12
images = []
def __init__(self):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.facing = random.choice((-1,1)) * Alien.speed
self.frame = 0
if self.facing < 0:
self.rect.right = SCREENRECT.right
def update(self):
self.rect.move_ip(self.facing, 0)
if not SCREENRECT.contains(self.rect):
self.facing = -self.facing;
self.rect.top = self.rect.bottom + 1
self.rect = self.rect.clamp(SCREENRECT)
self.frame = self.frame + 1
self.image = self.images[self.frame//self.animcycle%3]
class Explosion(pygame.sprite.Sprite):
defaultlife = 12
animcycle = 3
images = []
def __init__(self, actor):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = self.images[0]
self.rect = self.image.get_rect(center=actor.rect.center)
self.life = self.defaultlife
def update(self):
self.life = self.life - 1
self.image = self.images[self.life//self.animcycle%2]
if self.life <= 0: self.kill()
class Shot(pygame.sprite.Sprite):
speed = -11
images = []
def __init__(self, pos):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = self.images[0]
self.rect = self.image.get_rect(midbottom=pos)
def update(self):
self.rect.move_ip(0, self.speed)
if self.rect.top <= 0:
self.kill()
class Bomb(pygame.sprite.Sprite):
speed = 9
images = []
def __init__(self, alien):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = self.images[0]
self.rect = self.image.get_rect(midbottom=
alien.rect.move(0,5).midbottom)
def update(self):
self.rect.move_ip(0, self.speed)
if self.rect.bottom >= 470:
Explosion(self)
self.kill()
class Score(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.font = pygame.font.Font(None, 20)
self.font.set_italic(1)
self.color = Color('white')
self.lastscore = -1
self.update()
self.rect = self.image.get_rect().move(10, 450)
def update(self):
if SCORE != self.lastscore:
self.lastscore = SCORE
msg = "Score: %d" % SCORE
self.image = self.font.render(msg, 0, self.color)
def main(winstyle = 0):
# Initialize pygame
pygame.init()
if pygame.mixer and not pygame.mixer.get_init():
print ('Warning, no sound')
pygame.mixer = None
# Set the display mode
winstyle = 0 # |FULLSCREEN
bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32)
screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth)
#Load images, assign to sprite classes
#(do this before the classes are used, after screen setup)
img = load_image('player1.gif')
Player.images = [img, pygame.transform.flip(img, 1, 0)]
img = load_image('explosion1.gif')
Explosion.images = [img, pygame.transform.flip(img, 1, 1)]
Alien.images = load_images('alien1.gif', 'alien2.gif', 'alien3.gif')
Bomb.images = [load_image('bomb.gif')]
Shot.images = [load_image('shot.gif')]
#decorate the game window
icon = pygame.transform.scale(Alien.images[0], (32, 32))
pygame.display.set_icon(icon)
pygame.display.set_caption('Pygame Aliens')
pygame.mouse.set_visible(0)
#create the background, tile the bgd image
bgdtile = load_image('background.gif')
background = pygame.Surface(SCREENRECT.size)
for x in range(0, SCREENRECT.width, bgdtile.get_width()):
background.blit(bgdtile, (x, 0))
screen.blit(background, (0,0))
pygame.display.flip()
#load the sound effects
boom_sound = load_sound('boom.wav')
shoot_sound = load_sound('car_door.wav')
if pygame.mixer:
music = os.path.join(main_dir, 'data', 'house_lo.wav')
pygame.mixer.music.load(music)
pygame.mixer.music.play(-1)
# Initialize Game Groups
aliens = pygame.sprite.Group()
shots = pygame.sprite.Group()
bombs = pygame.sprite.Group()
all = pygame.sprite.RenderUpdates()
lastalien = pygame.sprite.GroupSingle()
#assign default groups to each sprite class
Player.containers = all
Alien.containers = aliens, all, lastalien
Shot.containers = shots, all
Bomb.containers = bombs, all
Explosion.containers = all
Score.containers = all
#Create Some Starting Values
global score
alienreload = ALIEN_RELOAD
kills = 0
clock = pygame.time.Clock()
#initialize our starting sprites
global SCORE
player = Player()
Alien() #note, this 'lives' because it goes into a sprite group
if pygame.font:
all.add(Score())
while player.alive():
#get input
for event in pygame.event.get():
if event.type == QUIT or \
(event.type == KEYDOWN and event.key == K_ESCAPE):
return
keystate = pygame.key.get_pressed()
# clear/erase the last drawn sprites
all.clear(screen, background)
#update all the sprites
all.update()
#handle player input
direction = keystate[K_RIGHT] - keystate[K_LEFT]
player.move(direction)
firing = keystate[K_SPACE]
if not player.reloading and firing and len(shots) < MAX_SHOTS:
Shot(player.gunpos())
shoot_sound.play()
player.reloading = firing
# Create new alien
if alienreload:
alienreload = alienreload - 1
elif not int(random.random() * ALIEN_ODDS):
Alien()
alienreload = ALIEN_RELOAD
# Drop bombs
if lastalien and not int(random.random() * BOMB_ODDS):
Bomb(lastalien.sprite)
# Detect collisions
for alien in pygame.sprite.spritecollide(player, aliens, 1):
boom_sound.play()
Explosion(alien)
Explosion(player)
SCORE = SCORE + 1
player.kill()
for alien in pygame.sprite.groupcollide(shots, aliens, 1, 1).keys():
boom_sound.play()
Explosion(alien)
SCORE = SCORE + 1
for bomb in pygame.sprite.spritecollide(player, bombs, 1):
boom_sound.play()
Explosion(player)
Explosion(bomb)
player.kill()
#draw the scene
dirty = all.draw(screen)
pygame.display.update(dirty)
#cap the framerate
clock.tick(40)
if pygame.mixer:
pygame.mixer.music.fadeout(1000)
pygame.time.wait(1000)
pygame.quit()
#call the "main" function if running this script
if __name__ == '__main__': main()
!/usr/bin/env python
导入随机操作系统路径
#导入基本pygame模块
导入pygame
从pygame.locals导入*
#看看我们是否可以加载比标准BMP更多的内容
如果不是pygame.image.get_extended():
升起系统退出(“对不起,需要扩展映像模块”)
#博弈常数
最大射门数=2#屏幕上的大多数玩家子弹
外星人的几率=22#当新外星人出现时
炸弹命中率=60#新炸弹落下的几率
外星人重新加载=新外星人之间12帧
SCREENRECT=Rect(0,0940480)
分数=0
main_dir=os.path.split(os.path.abspath(_文件__))[0]
def load_图像(文件):
加载图像,准备播放
file=os.path.join(主目录'data',文件)
尝试:
surface=pygame.image.load(文件)
除了pygame.error:
raise SystemExit('无法加载映像“%s”%s%%(文件,pygame.get\u error()))
返回曲面。convert()
def load_图像(*文件):
imgs=[]
对于文件中的文件:
附加(加载图像(文件))
返回imgs
dummysound类:
def比赛(自我):传球
def加载_声音(文件):
如果不是pygame.mixer:返回dummysound()
file=os.path.join(主目录'data',文件)
尝试:
sound=pygame.mixer.sound(文件)
回音
除了pygame.error:
打印('警告,无法加载%s'%1!'文件)
返回dummysound()
#每种类型的游戏对象都有一个init和一个
#更新函数。更新函数被调用
#每帧一次,此时每个对象都应该
#改变它的当前位置和状态。玩家
#对象实际上获得一个“移动”函数,而不是
#更新,因为它传递了有关
#键盘
职业玩家(pygame.sprite.sprite):
速度=10
反弹=24
炮尾偏移量=-11
图像=[]
定义初始化(自):
pygame.sprite.sprite.\uuuu初始化(self,self.containers)
self.image=self.images[0]
self.rect=self.image.get_rect(midbottom=SCREENRECT.midbottom)
self.reloading=0
self.origtop=self.rect.top
self.faceting=-1
def移动(自身、方向):
如果方向:自面向=方向
自校正移动(方向*自速度,0)
self.rect=self.rect.clamp(SCREENRECT)
如果方向<0:
self.image=self.images[0]
elif方向>0:
self.image=self.images[1]
self.rect.top=self.origtop-(self.rect.left//self.bounce%2)
def gunpos(自身):
位置=自对准*自对准偏移+自对准中心
返回位置,自校正顶部
类外星人(pygame.sprite.sprite):
速度=13
生命周期=12
图像=[]
定义初始化(自):
pygame.sprite.sprite.\uuuu初始化(self,self.containers)
self.image=self.images[0]
self.rect=self.image.get_rect()
自我面对=随机选择(-1,1))*外星人速度
self.frame=0
如果自面向<0:
self.rect.right=SCREENRECT.right
def更新(自我):
自校正移动ip(自对准,0)
如果不是SCREENRECT.contains(self.rect):
自我面对=-自我面对;
self.rect.top=self.rect.bottom+1
self.rect=self.rect.clamp(SCREENRECT)
self.frame=self.frame+1
self.image=self.images[self.frame//self.animcycle%3]
类爆炸(pygame.sprite.sprite):
默认寿命=12
生命周期=3
图像=[]
定义初始(自我,参与者):
pygame.sprite.sprite.\uuuu初始化(self,self.containers)
self.image=self.images[0]
self.rect=self.image.get_rect(中心=actor.rect.center)
self.life=self.defaultlife
def更新(自我):
self.life=self.life-1
self.image=self.images[self.life//self.animcycle%2]
如果self.life肯定是由于键盘键的问题,只需转到本文档,找出相应键盘按钮的正确关键字:
“事件KEYDOWN
发送值unicode
,key
,mod
,您可以显示它以查看使用键盘的代码(数值)
if event.type == KEYDOWN;
print('key:', event.key)
print('unicode:', event.uniconde)
print('mod:', event.mod)
然后您可以使用它们来测试键和移动对象。KEY\u RIGHT
已分配整数值而不是^[[C
-尝试打印(KEY\u RIGHT)