2013-07-15 127 views
1

当球移动时,我会如何让pygame划一条线?目前我拥有它,因此当您使用箭头时,带有黑色边框的大红色球在屏幕上移动。我想要的是让用户按下一个按钮,然后它基本上会让triger pygame画出一条线,然后如果用户再次按下该按键,则不会再画出来,然后如果按下按钮就会清除它。我想融入当前的代码。我已经完成了对pygame.draw的研究,并且没有运气在pygame中绘制。 这里是我当前的代码:根据pygame中的球移动生成一条线

import os,sys 
import pygame as pg 


DIRECTDICT = {pg.K_LEFT : (-1, 0), 
      pg.K_RIGHT : (1, 0), 
      pg.K_UP : (0,-1), 
      pg.K_DOWN : (0, 1)} 

class Player: 

    def __init__(self,rect,speed): 
      self.rect = pg.Rect(rect) 
      self.speed = speed 
      self.movement = [0,0] 
      self.make_image() 
    def make_image(self): 

     self.image = pg.Surface((self.rect.size)).convert_alpha() 
     self.image.fill((0,0,0,0)) 
     pg.draw.ellipse(self.image,(0,0,0),(1,1,self.rect.size[0]-2,self.rect.size[1]-2)) 
      pg.draw.ellipse(self.image,(255,0,0),(6,6,self.rect.size[0]-12,self.rect.size[1]-12)) 
    def update(self,Surf): 

     self.rect.move_ip(self.movement) 
    self.draw(Surf) 
def draw(self,Surf): 
    Surf.blit(self.image,self.rect) 


def quit_game(): 

    pg.quit();sys.exit() 

def game(Player): 

    for event in pg.event.get(): 
      Player.movement = [0,0] 
      keys = pg.key.get_pressed() 
    if event.type == pg.QUIT or keys[pg.K_ESCAPE]: 
     quit_game() 
    for key in DIRECTDICT: 
     if keys[key]: 
      for i in (0,1): 
       Player.movement[i] += DIRECTDICT[key][i]*Player.speed 

def main(Surf,Player): 

     game(Player) 
     Surf.fill((255,255,255)) 
     Player.update(Surf) 
     pg.display.update() 


if __name__ == "__main__": 
     os.environ['SDL_VIDEO_CENTERED'] = '1' 
     Surface = pg.display.set_mode((500,500)) 
     pg.init() 
     Myclock = pg.time.Clock() 
     Myplayer = Player((250,250,100,100),3) 
     while 1: 
       main(Surface,Myplayer) 
       Myclock.tick(60) 

回答

2

你必须保持其指明线应绘制与否的状态。你还需要一个列表来存储玩家位置,这样你就可以在点之间划一条线。

import os,sys 
import pygame as pg 


DIRECTDICT = {pg.K_LEFT : (-1, 0), 
      pg.K_RIGHT : (1, 0), 
      pg.K_UP : (0,-1), 
      pg.K_DOWN : (0, 1)} 


class Player: 

    def __init__(self,rect,speed): 
      self.rect = pg.Rect(rect) 
      self.speed = speed 
      self.movement = [0,0] 
      self.make_image() 
    def make_image(self): 

     self.image = pg.Surface((self.rect.size)).convert_alpha() 
     self.image.fill((0,0,0,0)) 
     pg.draw.ellipse(self.image,(0,0,0),(1,1,self.rect.size[0]-2,self.rect.size[1]-2)) 
     pg.draw.ellipse(self.image,(255,0,0),(6,6,self.rect.size[0]-12,self.rect.size[1]-12)) 
    def update(self,Surf): 

     self.rect.move_ip(self.movement) 
     self.draw(Surf) 

    def draw(self,Surf): 
     Surf.blit(self.image,self.rect) 


def quit_game(): 

    pg.quit();sys.exit() 

state = 0 
points = [] 
def game(Player): 
    global state 
    global points 
    keys = pg.key.get_pressed() 
    for event in pg.event.get(): 
     if event.type == pg.QUIT or keys[pg.K_ESCAPE]: 
      quit_game() 
     ### change state when space is pressed 
     if event.type == pg.KEYDOWN and event.key == pg.K_SPACE: 
      if state == 0: 
       state = 1 
      elif state == 1: 
       state = 2 
      else: 
       ### clear the points list 
       state = 0 
       points = [] 
    Player.movement = [0,0] 
    for key in DIRECTDICT: 
     if keys[key]: 
      for i in (0,1): 
       Player.movement[i] += DIRECTDICT[key][i]*Player.speed 

### helper method to get each element of a list and each previous element 
def offset(iterable): 
    prev = None 
    for elem in iterable: 
     yield prev, elem 
     prev = elem 

def main(Surf,Player): 
     global state 
     global points 
     game(Player) 
     Surf.fill((255,255,255)) 
     Player.update(Surf) 
     ### in state 1, start "collecting" the player position 
     if state == 1: 
      points.append(Player.rect.center) 
     ### in state 1 and 2, draw the line 
     if state in (1, 2): 
      for p1, p2 in offset(points): 
       if p1 and p2: 
        pg.draw.line(Surf, (255,0,0), p1, p2) 
     pg.display.update() 


if __name__ == "__main__": 
     os.environ['SDL_VIDEO_CENTERED'] = '1' 
     Surface = pg.display.set_mode((500,500)) 
     pg.init() 
     Myclock = pg.time.Clock() 
     Myplayer = Player((250,250,100,100),3) 
     while 1: 
       main(Surface,Myplayer) 
       Myclock.tick(60) 

enter image description here

(P.S:您的代码/缩进是相当混乱,而你的问题是不是100%清楚,但你仍然应该得到的想法)。

+0

是啊我知道它的有线打字代码到stackoverflow –

+0

还有一种方法来添加一个清除按钮,以便当我再次单击空格键时它不完全清除它,但只是拿起笔,然后可以恢复再次即时将玩它,但我想id问 –

+0

下次粘贴代码,突出显示它,然后单击文本框上方的“代码”按钮。 – ninMonkey