关于python:pygame中没有pygame.display初始化错误无法转换

cannot convert without pygame.display initialized error in pygame

我正在使用pygame在我的大学为一个项目制作游戏。我现在想要做的就是创建一个可以控制的球,当用户按下向左和向右箭头键时,它可以在屏幕上来回移动。老实说,我真的不知道自己在做什么,所以我使用的是pygame文档中的代码,该文档曾将pong用作游戏的基础。我的代码在下面,如果有人知道为什么我得到标题中的错误,请告诉我。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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()

All I'm trying to get done right now is create a ball that can be
controlled to go back and forth on the screen when the user presses
the left and right arrow keys.

您已经非常复杂了,您不需要102条线就可以移动一个球。我写并评论了一个简单的示例,我认为它可以为您提供很多帮助。您真正需要做的就是检测按键,然后更新x和y变量,然后使用x和y变量绘制图像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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()


您正在运行什么版本的python / pygame,就像我用python 3.4测试代码时一样,我的try:语句首次出现语法错误,但这可能是由于不同版本的语法不同所致。修复该问题后,我遇到了按向左或向右时未定义movepos的问题。将self.movepos = [0, 0]添加到Ball类的__init__()中可以解决此问题。

我从未遇到您所描述的错误,但是无论我做什么,游戏的确提供了恒定的黑屏。

我要说的是,有时错误可能是由代码中较早出现的其他错误引起的,这些错误没有被发现。这里的答案之一很好地总结了一下:错误:视频系统未初始化;错误:视频系统未初始化。有解决方案吗?

还有,什么变量存储球的x和y位置?我似乎无法弄清您是如何控制的?