не может преобразовать без ошибки инициализации pygame.display в pygame

Я работаю над созданием игры для проекта в моем университете с использованием pygame. Все, что я пытаюсь сделать прямо сейчас, - это создать мяч, которым можно управлять, чтобы перемещаться вперед и назад по экрану, когда пользователь нажимает клавиши со стрелками влево и вправо. Честно говоря, я действительно не знаю, что делаю, поэтому я использую код из документации pygame, который использовался для pong в качестве основы для моей игры. Мой код ниже, и если кто-то знает, почему я получаю ошибку, указанную в заголовке, дайте мне знать.

try:
        import sys
        import random
        import math
        import os
        import getopt
        import pygame
        from socket import *
        from pygame.locals import *
except ImportError, err:
        print "couldn't load module. %s" % (err)
        sys.exit(2)

def load_png(name):
    """ Load image and return image object"""
    fullname = name
    try:
        image = pygame.image.load(fullname)
        if image.get_alpha() is None:
            image = image.convert()
        else:
            image = image.convert_alpha()
    except pygame.error, message:
            print 'Cannot load image:', fullname
            raise SystemExit, message
    return image, image.get_rect()

class Ball(pygame.sprite.Sprite):
    def __init__(self, (xy)):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_png('ball.png')
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.hit = 0
        self.speed = 10
        self.state = "still"

    def reinit(self):
        self.state = "still"
        self.movepos = [0,0]
        if self.side == "left":
            self.rect.midleft = self.area.midleft

    def update(self):
        newpos = self.rect.move(self.movepos)
        if self.area.contains(newpos):
            self.rect = newpos
        pygame.event.pump()

    def moveleft(self):
        self.movepos[1] = self.movepos[1] - (self.speed)
        self.state = "moveleft"

    def moveright(self):
        self.movepos[1] = self.movepos[1] + (self.speed)
        self.state = "moveright"

def main():
    running = True
    pygame.init()
    (width, height) = (800, 600)
    screen = pygame.display.set_mode((width, height))

    # Fill background
    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((0, 0, 0))
    screen.blit(background, (0, 0))
    pygame.display.flip()


    global player
    player = Ball("left")
    playersprite = pygame.sprite.RenderPlain(player)

    playersprite.draw(screen)
    player.update()
    while running:

        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_q:
                    running = False
                if event.key == K_LEFT:
                    player.moveleft()
                if event.key == K_RIGHT:
                    player.moveright()
            elif event.type == KEYUP:
                if event.key == K_UP or event.key == K_DOWN:
                    player.movepos = [0,0]
                    player.state = "still"
        #screen.blit(background, ball.rect, ball.rect)
        screen.blit(background, player.rect, player.rect)
        #screen.blit(background, player2.rect, player2.rect)
        #ballsprite.update()
        playersprite.update()
        #ballsprite.draw(screen)
        playersprite.draw(screen)



if __name__ == '__main__': main()

person r.rodriguez    schedule 08.05.2016    source источник


Ответы (2)


Все, что я пытаюсь сделать прямо сейчас, - это создать мяч, которым можно управлять, чтобы перемещаться вперед и назад по экрану, когда пользователь нажимает клавиши со стрелками влево и вправо.

Вы сильно усложняете это, вам не нужны 102 линии, чтобы перемещать мяч. Я написал и прокомментировал простой пример, который, как мне кажется, может вам очень помочь. Все, что вам действительно нужно сделать, это обнаружить нажатия клавиш, а затем обновить переменные x и y, а затем нарисовать изображение, используя переменные x и y.

import pygame

screen_width = 1280
screen_height = 720

pygame.init()
screen = pygame.display.set_mode((screen_width,screen_height))

BLACK = (0,0,0)

ballImg = pygame.image.load("ball.jpg")
ballPosition = [0,0]
speed = 1


def game_loop():
    while 1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()

        #get all the keys being pressed
        keys = pygame.key.get_pressed()


        #depending on what key the user presses, update ball x and y position accordingly
        if keys[pygame.K_UP]:
            ballPosition[1] -= speed
        if keys[pygame.K_DOWN]:
            ballPosition[1] += speed
        if keys[pygame.K_LEFT]:
            ballPosition[0] -= speed
        if keys[pygame.K_RIGHT]:
            ballPosition[0] += speed


        screen.fill(BLACK) #fill the screen with black
        screen.blit(ballImg, ballPosition) #draw the ball
        pygame.display.update() #update the screen

game_loop()
person Keatinge    schedule 08.05.2016
comment
Боже мой, спасибо тебе большое. Я новичок в этом, так что это действительно помогает, спасибо! - person r.rodriguez; 08.05.2016
comment
Нет проблем, я думаю, вам будет гораздо лучше создать свою программу с нуля, чем начинать с огромного загадочного фрагмента кода, который вы не понимаете. - person Keatinge; 08.05.2016

Какие версии python / pygame вы используете, поскольку, когда я тестировал ваш код с помощью python 3.4, я сначала получил синтаксические ошибки с вашими операторами try: except, но это может быть связано с различным синтаксисом в разных версиях. После исправления этого я столкнулся с проблемой, когда movepos не определяется при нажатии влево или вправо. Добавление self.movepos = [0, 0] к __init__() класса Ball исправило это.

Я никогда не сталкивался с описанной вами ошибкой, однако игра постоянно показывала черный экран, что бы я ни делал.

Я пытаюсь сказать, что ошибки иногда могут быть вызваны другими ошибками в коде ранее, которые не улавливаются. Один из ответов здесь хорошо резюмирует: ошибка: видеосистема не инициализирован; Есть ли решение?

Кроме того, какие переменные хранят положение шаров по x и y? Я не мог понять, как вы это контролировали?

person Charlton Lane    schedule 08.05.2016