Heim >Backend-Entwicklung >Python-Tutorial >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__ == '__main__': 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!