Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python游戏键没有响应_Python_Macos_Pygame_Key - Fatal编程技术网

Python游戏键没有响应

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

我正在尝试实现一个Python游戏(PyGame包中的异形.py),但当我运行它时,我无法移动我的玩家或进行任何射击…
我在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)