PyODE Tutorial1 + pygame
PyODEっていう物理演算用のモジュールがあります。
そのPyODE Tutorial1が数字だけでつまらないのでpygameで作ってみた。
まぁ次の章で使うんだけどね。
コードと感想は続きを読むで。
Require: pygame, pyode, gameutil
# 1m = 200px import ode import pygame from pygame import * import gameutil as gu class VisibleBody(ode.Body, pygame.sprite.Sprite): def __init__(self, world): ode.Body.__init__(self, world) pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface((10, 10)) self.image.fill((255, 255, 255)) self.rect = self.image.get_rect() pygame.draw.circle(self.image, (255, 0, 0), (5, 5), 5) def update(self): x, y = body.getPosition()[0:2] self.rect.center = (x*200+320, y*200-120) print self.rect.center #Prepare SDL SCREEN_SIZE = (640, 480) pygame.init() screen = pygame.display.set_mode(SCREEN_SIZE) pygame.display.set_caption('') background = pygame.Surface(screen.get_size()) background = background.convert() background.fill((255, 255, 255)) screen.blit(background, (0, 0)) pygame.display.flip() clock = pygame.time.Clock() #Prepare physical world world = ode.World() world.setGravity((0, -9.81, 0)) body = VisibleBody(world) M = ode.Mass() M.setSphere(2500.0, 0.02) M.mass = 1.0 body.setMass(M) body.setPosition((0, 2, 0)) body.addForce((0, 200, 0)) #Prepare sprites tb = gu.TextBoard(gu.TextRender(gu.load_font(24, "tahoma.ttf"), (0, 0, 0))) spr = pygame.sprite.RenderPlain([body]) tx = pygame.sprite.RenderPlain([tb]) dt = 0.01 nowtime = 0.0 while 1: clock.tick(100/2) screen.blit(background, (0, 0)) for e in pygame.event.get(): gu.quit(e) world.step(dt) nowtime += dt tb.render(str(nowtime) + "sec.") tb.rect.topleft = (0, 0) spr.update() spr.draw(screen) screen.blit(pygame.transform.flip(screen, False, True), (0, 0)) tx.update() tx.draw(screen) pygame.display.flip()
当たり前といってしまえば当たり前なんだけど、やっぱり目に見えるって言うのは楽しいなぁ。
あと、やっぱり継承便利。今回は多重継承(?)を使ってみた。できない言語多いんだってね。
インターフェース?なにそれおいしいの?せっかく以前習得した座標変換使用せず。
そのうち使うように書き直す。