Maison > Article > développement back-end > Jetons un coup d'œil à l'exemple de code d'implémentation simple du carnet de croquis python+pygame
Question : Pygame est-il obsolète ?
Je ne sais pas si c'est obsolète ou pas. Quoi qu'il en soit, cette chose n'a pas été officiellement mise à jour depuis près de quatre ans. Beaucoup de gens l'utilisent (par rapport à d'autres projets similaires), mais ils l'utilisent tous pour écrire de petites choses pour le plaisir, et personne ne l'utilise pour des projets commerciaux. Pygame est en fait la liaison python de SDL, et SDL est basé sur OpenGL, donc certaines personnes utilisent pygame+pyOpenGL pour faire des démonstrations 3D, etc. Si vous voulez vraiment écrire un jeu, l'encapsulation de pygame est relativement bas et peu utile. Vous devez implémenter beaucoup de choses par vous-même (bien sûr, le degré de liberté est également élevé). La documentation n'est pas très bonne non plus, mais heureusement les prédécesseurs ont laissé de nombreux articles. C’est un bon choix pour s’entraîner. Il peut être utilisé pour mettre en pratique de nombreuses idées et algorithmes couramment utilisés dans les jeux 2D. Si vous souhaitez l'utiliser directement pour écrire des jeux 2D, vous pouvez également choisir cocos2D (à noter qu'il ne s'agit pas de celle d'iOS, mais de celle de Python. Cette API est très bien conçue et simple à utiliser). Il existe également une gestion de scène, des consoles intégrées et bien plus encore. C'est dommage qu'il n'ait pas été mis à jour depuis un an... Bien que l'auteur ait dit qu'il serait mis à jour, je suppose qu'il se concentre sur la version Objective-C de cocos. Après tout, beaucoup de gens l'utilisent. . C'est dommage qu'il n'y ait pas de fonctionnalités telles que l'animation de trames (la version Objective-C Il y a T_T) Si vous voulez écrire un moteur, vous pouvez essayer pyglet. Si vous voulez écrire en 3D, essayez panda3D ou python-orge. Je n'ai jamais utilisé ni l'un ni l'autre, mais tout le monde le dit, donc cela ne devrait pas être faux. D'une manière générale, très peu de personnes utilisent Python pour écrire des jeux. Une fois l'écriture terminée, vous devez toujours installer l'environnement pour que d'autres puissent jouer, empaqueter et avoir divers bugs. Vous pouvez l'utiliser pour tester certains algorithmes dans le. jeu et réaliser des prototypes. Il vaut mieux oublier d’écrire. Bien sûr, la question principale est que je n'ai pas l'intention d'utiliser pygame pour écrire des jeux, alors faites comme si je n'avais rien dit...
Recommandations d'apprentissage associées : Tutoriel vidéo Python
(La réponse ci-dessus vient de Zhihu, merci !)
Ce qui suit est une capture d'écran de la planche à dessin
# -*- 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()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!