Heim  >  Artikel  >  Backend-Entwicklung  >  Werfen wir einen Blick auf das Codebeispiel für die einfache Sketchpad-Implementierung von Python+Pygame

Werfen wir einen Blick auf das Codebeispiel für die einfache Sketchpad-Implementierung von Python+Pygame

coldplay.xixi
coldplay.xixinach vorne
2020-08-07 15:58:182718Durchsuche

Werfen wir einen Blick auf das Codebeispiel für die einfache Sketchpad-Implementierung von Python+Pygame

Frage: Ist Pygame veraltet?

Ich weiß nicht, ob es veraltet ist oder nicht. Jedenfalls wurde dieses Ding seit fast vier Jahren nicht mehr offiziell aktualisiert. Es gibt immer noch ziemlich viele Leute, die es verwenden (im Vergleich zu anderen ähnlichen Projekten), aber alle verwenden es, um kleine Dinge zum Spaß zu schreiben, und niemand verwendet es für kommerzielle Projekte. Pygame ist eigentlich die Python-Bindung von SDL, und SDL basiert auf OpenGL. Daher verwenden einige Leute Pygame + pyOpenGL, um 3D-Demonstrationen usw. durchzuführen. Wenn Sie wirklich ein Spiel schreiben möchten, ist die Kapselung von Pygame relativ niedrig und nicht sehr nützlich. Sie müssen viele Dinge selbst implementieren (natürlich ist auch der Freiheitsgrad hoch). Die Dokumentation ist auch nicht sehr gut, aber glücklicherweise haben Vorgänger viele Artikel hinterlassen. Es ist eine gute Wahl zum Üben. Es kann zum Üben vieler Ideen und Algorithmen verwendet werden, die häufig in 2D-Spielen verwendet werden. Wenn Sie es direkt zum Schreiben von 2D-Spielen verwenden möchten, können Sie auch cocos2D wählen (beachten Sie, dass es sich nicht um iOS, sondern um Python handelt). Diese API ist sehr gut gestaltet und einfach zu verwenden. Außerdem gibt es Szenenverwaltung, integrierte Konsolen und mehr. Schade, dass es seit einem Jahr nicht aktualisiert wurde ... Obwohl der Autor sagte, dass es aktualisiert wird, konzentriert er sich wohl auf die Objective-C-Version von Cocos. Schließlich gibt es viele Leute, die es verwenden. Schade, dass es keine Funktionen wie Frame-Animation gibt (in der Objective-C-Version gibt es T_T). Wenn Sie eine Engine schreiben möchten, können Sie Pyglet ausprobieren. Wenn Sie 3D schreiben möchten, versuchen Sie es mit Panda3D oder Python-Orge. Ich habe beides noch nie verwendet, aber das sagen alle, also sollte es nicht falsch sein. Im Allgemeinen verwenden nur sehr wenige Leute Python zum Schreiben von Spielen. Sie müssen die Umgebung noch installieren, damit andere sie spielen und verpacken können. Es ist in Ordnung, sie zum Testen bestimmter Algorithmen zu verwenden Spiele und mache Prototypen. Es ist besser, das eigentliche Schreiben zu vergessen. Die Hauptfrage ist natürlich, dass ich überhaupt nicht vorhabe, Pygame zum Schreiben von Spielen zu verwenden ...

Verwandte Lernempfehlungen: Python-Video-Tutorial

(The Die obige Antwort stammt von Zhihu, danke!)

Das Folgende ist ein Screenshot des Zeichenbretts

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import math
class Brush:
  def __init__(self, screen):
    self.screen = screen
    self.color = (0, 0, 0)
    self.size = 1
    self.drawing = False
    self.last_pos = None
    self.style = True
    self.brush = pygame.image.load("images/brush.png").convert_alpha()
    self.brush_now = self.brush.subsurface((0, 0), (1, 1)) 
  def start_draw(self, pos):
    self.drawing = True
    self.last_pos = pos 
  def end_draw(self):
    self.drawing = False 
  def set_brush_style(self, style):
    print("* set brush style to", style)
    self.style = style 
  def get_brush_style(self):
    return self.style 
  def get_current_brush(self):
    return self.brush_now 
  def set_size(self, size):
    if size < 1:
      size = 1
    elif size > 32:
      size = 32
    print("* set brush size to", size)
    self.size = size
    self.brush_now = self.brush.subsurface((0, 0), (size*2, size*2)) 
  def get_size(self):
    return self.size 
  def set_color(self, color):
    self.color = color
    for i in xrange(self.brush.get_width()):
      for j in xrange(self.brush.get_height()):
        self.brush.set_at((i, j),
                 color + (self.brush.get_at((i, j)).a,)) 
  def get_color(self):
    return self.color 
  def draw(self, pos):
    if self.drawing:
      for p in self._get_points(pos):
        if self.style:
          self.screen.blit(self.brush_now, p)
        else:
          pygame.draw.circle(self.screen, self.color, p, self.size)
      self.last_pos = pos
 
  def _get_points(self, pos):
    points = [(self.last_pos[0], self.last_pos[1])]
    len_x = pos[0] - self.last_pos[0]
    len_y = pos[1] - self.last_pos[1]
    length = math.sqrt(len_x**2 + len_y**2)
    step_x = len_x / length
    step_y = len_y / length
    for i in xrange(int(length)):
      points.append((points[-1][0] + step_x, points[-1][1] + step_y))
    points = map(lambda x: (int(0.5 + x[0]), int(0.5 + x[1])), points)
    return list(set(points)) 
class Menu:
  def __init__(self, screen):
    self.screen = screen
    self.brush = None
    self.colors = [
      (0xff, 0x00, 0xff), (0x80, 0x00, 0x80),
      (0x00, 0x00, 0xff), (0x00, 0x00, 0x80),
      (0x00, 0xff, 0xff), (0x00, 0x80, 0x80),
      (0x00, 0xff, 0x00), (0x00, 0x80, 0x00),
      (0xff, 0xff, 0x00), (0x80, 0x80, 0x00),
      (0xff, 0x00, 0x00), (0x80, 0x00, 0x00),
      (0xc0, 0xc0, 0xc0), (0xff, 0xff, 0xff),
      (0x00, 0x00, 0x00), (0x80, 0x80, 0x80),
    ]
    self.colors_rect = []
    for (i, rgb) in enumerate(self.colors):
      rect = pygame.Rect(10 + i % 2 * 32, 254 + i / 2 * 32, 32, 32)
      self.colors_rect.append(rect)
    self.pens = [
      pygame.image.load("images/pen1.png").convert_alpha(),
      pygame.image.load("images/pen2.png").convert_alpha(),
    ]
    self.pens_rect = []
    for (i, img) in enumerate(self.pens):
      rect = pygame.Rect(10, 10 + i * 64, 64, 64)
      self.pens_rect.append(rect)
    self.sizes = [
      pygame.image.load("images/big.png").convert_alpha(),
      pygame.image.load("images/small.png").convert_alpha()
    ]
    self.sizes_rect = []
    for (i, img) in enumerate(self.sizes):
      rect = pygame.Rect(10 + i * 32, 138, 32, 32)
      self.sizes_rect.append(rect)
 
  def set_brush(self, brush):
    self.brush = brush
 
  def draw(self):
    for (i, img) in enumerate(self.pens):
      self.screen.blit(img, self.pens_rect[i].topleft)
    for (i, img) in enumerate(self.sizes):
      self.screen.blit(img, self.sizes_rect[i].topleft)
    self.screen.fill((255, 255, 255), (10, 180, 64, 64))
    pygame.draw.rect(self.screen, (0, 0, 0), (10, 180, 64, 64), 1)
    size = self.brush.get_size()
    x = 10 + 32
    y = 180 + 32
    if self.brush.get_brush_style():
      x = x - size
      y = y - size
      self.screen.blit(self.brush.get_current_brush(), (x, y))
    else:
      pygame.draw.circle(self.screen,
                self.brush.get_color(), (x, y), size)
    for (i, rgb) in enumerate(self.colors):
      pygame.draw.rect(self.screen, rgb, self.colors_rect[i])
  def click_button(self, pos):
    for (i, rect) in enumerate(self.pens_rect):
      if rect.collidepoint(pos):
        self.brush.set_brush_style(bool(i))
        return True
    for (i, rect) in enumerate(self.sizes_rect):
      if rect.collidepoint(pos):
        if i:
          self.brush.set_size(self.brush.get_size() - 1)
        else:
          self.brush.set_size(self.brush.get_size() + 1)
        return True
    for (i, rect) in enumerate(self.colors_rect):
      if rect.collidepoint(pos):
        self.brush.set_color(self.colors[i])
        return True
    return False
class Painter:
  def __init__(self):
    self.screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("Painter")
    self.clock = pygame.time.Clock()
    self.brush = Brush(self.screen)
    self.menu = Menu(self.screen)
    self.menu.set_brush(self.brush)
  def run(self):
    self.screen.fill((255, 255, 255))
    while True:
      self.clock.tick(30)
      for event in pygame.event.get():
        if event.type == QUIT:
          return
        elif event.type == KEYDOWN:
          if event.key == K_ESCAPE:
            self.screen.fill((255, 255, 255))
        elif event.type == MOUSEBUTTONDOWN:
          if event.pos[0] <= 74 and self.menu.click_button(event.pos):
            pass
          else:
            self.brush.start_draw(event.pos)
        elif event.type == MOUSEMOTION:
          self.brush.draw(event.pos)
        elif event.type == MOUSEBUTTONUP:
          self.brush.end_draw()
      self.menu.draw()
      pygame.display.update()
def main():
  app = Painter()
  app.run()
 
if __name__ == &#39;__main__&#39;:
  main()

Das obige ist der detaillierte Inhalt vonWerfen wir einen Blick auf das Codebeispiel für die einfache Sketchpad-Implementierung von Python+Pygame. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen