1

ボールが動いたときにpygameに線を引くにはどうすればよいですか? 現在、矢印を使用すると、黒い境界線のある大きな赤いボールが画面上を移動するようになっています。私が望むのは、ユーザーにボタンを押してもらい、基本的にtriger pygameに線を描画させ、ユーザーがそのキーをもう一度押すともう描画されず、ボタンを押すとクリアされることです。現在のコードに組み込みたいと思います。私は pygame.draw の調査と 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) 
4

1 に答える 1

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) 

ここに画像の説明を入力

(PS: あなたのコード/インデントは非常に乱雑で、質問は 100% 明確ではありませんが、それでもアイデアを得る必要があります)。

于 2013-07-15T15:04:14.343 に答える