2016-05-08 26 views
1

我正在使用pygame的在我的大学做了一个项目的比赛。我现在要做的所有事情就是创建一个球,当用户按下左右箭头键时,可以控制球在屏幕上来回切换。老实说,我并不真正知道自己在做什么,所以我使用pygame文档中的代码作为游戏的基础。我的代码在下面,如果有人知道我为什么会收到标题中的错误,请告诉我。离不开pygame.display初始化错误转换在pygame的

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() 

回答

0

所有我想现在就得到完成的就是创建一个球,可以是 控制当用户按下 左,右箭头键来回在屏幕上。

你很大程度上复杂化了这一点,你不需要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() 
+0

哦,我的上帝,谢谢你这么多。我真的很新,所以这真的很有帮助,谢谢! –

+0

没问题,我想你会离开从头开始建立你的程序更好,而不是代码,你不明白一个巨大的,神秘的块开始了。 – Keatinge

0

巨蟒/ pygame的版本,你跑步时,我与Python 3.4测试你的代码是什么,我第一次与你试试语法错误:除了语句,但是这可能是由于不同的语法了不同的版本。修复后,我遇到了问题movepos没有被定义时按左或右。将self.movepos = [0, 0]添加到球类的__init__()固定此。

我从来没有碰见你描述的错误,但是比赛并提供恒定的黑屏,无论我做什么。

我想要说的是错误的,有时可以通过其他错误早些时候在没有得到回升的代码引起的。答案之一在这里概括起来很好:error: video system not initialized; Is there a solution?

此外,什么变量存储球x和y位置?我似乎无法弄清楚你是如何控制它的?