def __init__(self, screen, config, clock): super(ActorScene, self).__init__(screen, config, clock) rect_container = Rectangle(600, 200, 100, 100) rect_container2 = Rectangle(600, 0, 100, 100) rect_container3 = Rectangle(0, 0, 100, 100) rect_container4 = Rectangle(400, 200, 100, 100) rect_wall = Rectangle(0, 200, 400, 400) self.__A_wall = wallActor( pygame.image.load( 'F:/练习/PyCharm/PygameTest/resource/Test/wall.jpg'), rect_wall) self.__A_container = containerActor( pygame.image.load( 'F:/练习/PyCharm/PygameTest/resource/Test/container1.jpg'), rect_container) self.__A_container2 = containerActor( pygame.image.load( 'F:/练习/PyCharm/PygameTest/resource/Test/container2.jpg'), rect_container2) self.__A_container3 = containerActor( pygame.image.load( 'F:/练习/PyCharm/PygameTest/resource/Test/container3.jpg'), rect_container3) self.__A_container4 = containerActor( pygame.image.load( 'F:/练习/PyCharm/PygameTest/resource/Test/container4.jpg'), rect_container4) self.__A_container2.physicalBody.vel = vec2(0, 3) self.__A_container3.physicalBody.vel = vec2(0, 3) self.ps = physicalScene(Rectangle(0, 0, 800, 600), vec2(0, 0.098), self.startClock) self.ps.add(self.__A_container.physicalBody) self.ps.add(self.__A_container2.physicalBody) self.ps.add(self.__A_container3.physicalBody) self.ps.add(self.__A_container4.physicalBody)
def doClockEvent(self, NowClock): # if self.FPS != 0: # self.m.update(0.01) self.m.applyForce(vec2(0, 9.8)) if self.mousePressed: self.m.applyForce(vec2(4, 0)) self.m.update(0.1) self.m.edges(Rectangle(0, 0, self.width, self.height))
def __init__(self, location, constraintScope, mass=None): self.location = location self.velocity = vec2() self.acceleration = vec2() self.constraintScope = constraintScope self.mass = mass if self.mass is None: self.mass = random.randint(1, 10)
def setup(self): self.createTextElement('spring length1:') self.createTextElement('spring length2:') self.m1.local = vec2(100, 100) self.m2.local = vec2(200, 100) self.m3.local = vec2(100, 200) self.m4.local = vec2(200, 200) self.m5.local = vec2(280, 150)
def __init__(self, i, area): self.ang_vel = 0 self.vel = vec2() self.area = area self.acc_a = vec2() self.moi = i self.acc = vec2() self.angle = 0 self.ang_acc = 0 self.new_ang_acc = 0 self.drag = 0.04
def __init__(self, mass=0, pos=vec2()): self.mass = mass self.vel = vec2() self.acc = vec2() self.pos = pos self.bodyType = 0 self.drag = vec2() self.angularDrag = vec2() self.active = True self.isCollideChecked = False self.hasCollidedProbe = False
def draw(self): for c in self.__circleLis: if c.edges(self.width, self.height): c.growing = False else: for oth in self.__circleLis: if c != oth: _d = vec2(c.x, c.y).dist(vec2(oth.x, oth.y)) if _d - 2 < c.r + oth.r: c.growing = False break self.Circle(c, (255, 255, 255), 1) c.grow()
def __init__(self, screen, config, startClock): super(TestPainterScene, self).__init__(screen, config, startClock) self.painter = Painter(self.screen) self.points = [] for i in range(0, 6): x = random.randint(0, 800) y = random.randint(0, 400) self.points.append(vec2(x, y)) self.rect = Rectangle(400, 100, 200, 100) self.line = Ray(vec2(200, 200), math.radians(30), 400) self.white = (255, 255, 255) self.tra = Triangle(point2(100, 100), point2(60, 180), point2(140, 180)) self.circle = Circle(400, 300, 100) self.ellipse = Ellipse(400, 300, 160, 70)
def __createCircle(self): _x = random.randint(0, 800) _y = random.randint(0, 600) _flg_valid = True for c in self.__circleLis: _d = vec2(c.x, c.y).dist(vec2(_x, _y)) if _d < c.r: _flg_valid = False break if _flg_valid: return CircleEle(_x, _y) else: return None
def cast(self, a, b): x1 = a.x y1 = a.y x2 = b.x y2 = b.y x3 = self.pos.x y3 = self.pos.y x4 = self.pos.x + self.dir.x y4 = self.pos.y + self.dir.y dt = dtm2(x1 - x3, x3 - x4, y1 - y3, y3 - y4) du = dtm2(x1 - x2, x1 - x3, y1 - y2, y1 - y3) dd = dtm2(x1 - x2, x3 - x4, y1 - y2, y3 - y4) dd_val = dd.val() if dd_val == 0: return t = dt.val() / dd_val u = du.val() / dd_val if 0 < t < 1 and u > 0: return vec2(x1 + t * (x2 - x1), y1 + t * (y2 - y1)) else: return
def __init__(self, *args): super(SpringMassSystemTestScene, self).__init__(*args) self.springMassSys = SMSystem(10, 2.0, 0.9, 40, 0.2, vec2(0, 0.098), 2, 2, 1, 2, 700)
def __init__(self, *args): super(kaleidoscope, self).__init__(*args) self.symmetry = 6 self.angle = math.radians(360 / self.symmetry) self.isFill = False self.v = vec2(self.width / 2, self.height / 2) self.caption = '测试场景:万花筒 按下鼠标按键进行绘制,按q键清屏' self.painter = Painter(self.screen)
def __createModel_LINE(self): for i in range(self.massSum): m = Mass(self.massM) m.local = vec2(i * self.springLength, 400) self.masses.append(m) if i > 0: self.springs.append( Spring(self.masses[i - 1], self.masses[i], self.K, self.springLength, self.springFriction))
def draw(self): self.push() self.rotate(400, 300, self.m.angle) self.Rect(self.m.area, (255, 255, 255), 1) self.pop() if self.mousePressed: self.m.applyForce(vec2(100, 100)) self.m.drag = 0.03 self.getCreatedElement(0).setText(self.m.angle)
def __init__(self, location): self.location = location self.mass = 20 self.G = 1 self.dragOffset = vec2() self.Events = IOEvent3() self.Events.appendEvent(ioEvent3Enum.key_D | ioEvent3Enum.keyDown, lambda: self.__X(True), 0) self.Events.appendEvent(ioEvent3Enum.key_A | ioEvent3Enum.keyDown, lambda: self.__X(False), 0)
def draw(self): f = vec2(0.1, 0) self.m.applyForce(f) fa = self.a.attract(self.m) self.m.applyForce(fa) self.m.update() # self.a.update() self.a.display(self.screen) self.m.display(self.screen)
def execute(self, fixed=0): variable = self.beginMass.local - self.endMass.local var_len = variable.len() force = vec2() if var_len != 0: force += variable.dev(var_len).mul((var_len - self.length) * (-self.K)) force += (self.beginMass.velocity - self.endMass.velocity).negate().mul(self.frictionConst) if not fixed: self.beginMass.applyForce(force) self.beginMass.update() self.endMass.applyForce(force.negate()) self.endMass.update()
def draw(self): if 0 < self.mouseX < self.width and 0 < self.mouseY < self.height: mx = self.mouseX - self.width / 2 my = self.mouseY - self.height / 2 pmx = self.lastMousePos[0] - self.width / 2 pmy = self.lastMousePos[1] - self.height / 2 v1_n = vec2(self.width / 2 + mx, self.height / 2 + my) v1_l = vec2(self.width / 2 + pmx, self.height / 2 + pmy) v2_n = vec2(self.width / 2 + mx, self.height / 2 - my) v2_l = vec2(self.width / 2 + pmx, self.height / 2 - pmy) if self.mousePressed: self.painter.push() for i in range(0, self.symmetry): # v1_n = self.__rotateBy(v1_n, self.width / 2, self.height / 2) # v1_l = self.__rotateBy(v1_l, self.width / 2, self.height / 2) # v2_n = self.__rotateBy(v2_n, self.width / 2, self.height / 2) # v2_l = self.__rotateBy(v2_l, self.width / 2, self.height / 2) self.painter.rotate(self.width / 2, self.height / 2, self.angle) self.painter.Lines([v1_n, v1_l], (255, 255, 255), 1, 0, 1) self.painter.Lines([v2_n, v2_l], (255, 255, 255), 1, 0, 1) self.painter.pop()
def __init__(self, *args): super(noiseTestScene, self).__init__(*args) self.caption = 'Perlin Noise' self.sceneCanvas = pygame.Surface((800, 600)) self.sceneCanvas.fill((255, 255, 255)) self.noiseScale = 0.02 self._height, self._width = 600, 800 self.inc = 0.1 self.scl = 10 self.zoff = 0 self.cols, self.rows = math.floor(self._width / self.scl), math.floor( self._height / self.scl) self.particles = [] self.flowField = [vec2()] * (self.cols * self.rows) for i in range(0, 2500): self.particles.append(Particle(self._width, self._height))
def execute(self): for i in range(self.massSum - 1): self.springs[i].execute() for i in range(self.massSum): self.masses[i].applyForce(self.g.mul(self.masses[i].mass)) self.masses[i].applyForce(self.masses[i].velocity.negate().mul( self.airFriction)) if self.masses[i].local.y > self.groundHeight: v = self.masses[i].velocity v.y = 0 self.masses[i].applyForce(v.negate().mul(self.groundFriction)) v = self.masses[i].velocity v.x = 0 if v.y < 0: self.masses[i].applyForce(v.negate().mul( self.groundAbsorption)) f = vec2(0, self.groundRepulsion).mul(self.masses[i].local.y - self.groundHeight) self.masses[i].applyForce(f)
def __init__(self, width, height): self.w, self.h = width, height self.pos = vec2(random.randint(0, width), random.randint(0, height)) self.vel, self.acc, self.prevPos = vec2(), vec2(), vec2() self.maxSpeed = 2
def setup(self): self.springMassSys.createModel() self.springMassSys.setConnections((0, vec2(0, 0)))
def __init__(self, m, pos): self.vel = vec2() self.pos = pos self.mass = m self.acc = vec2() self.new_acc = vec2()
def __init__(self, *args): super(verletScene, self).__init__(*args) self.caption = 'VerletSceneTest' self.m = body(1, vec2(100, 100))
def setup(self): self.m.applyForce(vec2(0, 9.8).mul(self.m.mass))
def setup(self): self.createTextElement() self.m.applyForce(vec2(300, 300)) self.m.drag = 0
def __init__(self, texture, rect=None): super(containerActor, self).__init__(texture, rect) self.physicalBody = rigidBody(1, self.area, BodyType.DYNAMIC) self.physicalBody.drag = vec2(0, 0) self.physicalBody.hasCollidedProbe = True self.physicalBody.restitution = 0.8
def reset(self): self.acceleration = vec2() self.velocity = vec2() self.local = vec2()
def __init__(self, m): self.mass = m self.acceleration = vec2() self.velocity = vec2() self.local = vec2() self.__new_acc = vec2()
def __init__(self, screen, config, clock): super(PhysicsScene, self).__init__(screen, config, clock) self.m = Mover(vec2(500, 50), Rectangle(0, 0, 800, 600), 1) self.a = Attractor(vec2(400, 300))