<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://tmplab.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Laser_Pinball</id>
		<title>Laser Pinball - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://tmplab.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Laser_Pinball"/>
		<link rel="alternate" type="text/html" href="https://tmplab.org/wiki/index.php?title=Laser_Pinball&amp;action=history"/>
		<updated>2026-04-05T19:29:26Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>https://tmplab.org/wiki/index.php?title=Laser_Pinball&amp;diff=5929&amp;oldid=prev</id>
		<title>Alban at 20:59, 5 May 2016</title>
		<link rel="alternate" type="text/html" href="https://tmplab.org/wiki/index.php?title=Laser_Pinball&amp;diff=5929&amp;oldid=prev"/>
				<updated>2016-05-05T20:59:16Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 20:59, 5 May 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l38&quot; &gt;Line 38:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 38:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;space = pymunk.Space(50)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;space = pymunk.Space(50)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# To be tinkered with (second only):)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# To be tinkered with (second only):)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;space.gravity = (0.0, -&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;1650&lt;/del&gt;.0)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;space.gravity = (0.0, -&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;1850&lt;/ins&gt;.0)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Define collision callback function, will be called when X touches Y &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Define collision callback function, will be called when X touches Y &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Alban</name></author>	</entry>

	<entry>
		<id>https://tmplab.org/wiki/index.php?title=Laser_Pinball&amp;diff=5926&amp;oldid=prev</id>
		<title>Alban: New page: &lt;pre&gt; &quot;&quot;&quot;A very basic flipper game. &quot;&quot;&quot; __version__ = &quot;$Id:$&quot; __docformat__ = &quot;reStructuredText&quot;  import random  import pygame from pygame.locals import * from pygame.color import * import...</title>
		<link rel="alternate" type="text/html" href="https://tmplab.org/wiki/index.php?title=Laser_Pinball&amp;diff=5926&amp;oldid=prev"/>
				<updated>2016-05-05T20:38:03Z</updated>
		
		<summary type="html">&lt;p&gt;New page: &amp;lt;pre&amp;gt; &amp;quot;&amp;quot;&amp;quot;A very basic flipper game. &amp;quot;&amp;quot;&amp;quot; __version__ = &amp;quot;$Id:$&amp;quot; __docformat__ = &amp;quot;reStructuredText&amp;quot;  import random  import pygame from pygame.locals import * from pygame.color import * import...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;A very basic flipper game.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
__version__ = &amp;quot;$Id:$&amp;quot;&lt;br /&gt;
__docformat__ = &amp;quot;reStructuredText&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
import pygame&lt;br /&gt;
from pygame.locals import *&lt;br /&gt;
from pygame.color import *&lt;br /&gt;
import os&lt;br /&gt;
import pymunk&lt;br /&gt;
from pymunk import Vec2d&lt;br /&gt;
&lt;br /&gt;
def to_pygame(p):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Small hack to convert pymunk to pygame coordinates&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return int(p.x), int(-p.y+600)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Sound&lt;br /&gt;
pygame.mixer.pre_init(44100, -16, 2, 2048)&lt;br /&gt;
&lt;br /&gt;
pygame.init()&lt;br /&gt;
screen = pygame.display.set_mode((600, 600))&lt;br /&gt;
clock = pygame.time.Clock()&lt;br /&gt;
running = True&lt;br /&gt;
print(os.path.join('snd','bumper.ogg'))&lt;br /&gt;
try:&lt;br /&gt;
#    pygame.mixer.music.load(os.path.join('data', 'music.ogg'))#load music&lt;br /&gt;
    snd_bump = pygame.mixer.Sound(os.path.join('snd','bumper.ogg'))  #load sound&lt;br /&gt;
except:&lt;br /&gt;
    raise UserWarning, &amp;quot;could not load or play soundfiles in 'data' folder :-(&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Physics stuff&lt;br /&gt;
# To be tinkered with :)&lt;br /&gt;
space = pymunk.Space(50)&lt;br /&gt;
# To be tinkered with (second only):)&lt;br /&gt;
space.gravity = (0.0, -1650.0)&lt;br /&gt;
&lt;br /&gt;
# Define collision callback function, will be called when X touches Y &lt;br /&gt;
def bumper_collision(space, arbiter):&lt;br /&gt;
    snd_bump = pygame.mixer.Sound(os.path.join('snd','bumper.ogg'))  #load sound&lt;br /&gt;
    snd_bump.play()&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
COLLTYPE_BALL = 1&lt;br /&gt;
COLLTYPE_BUMPER = 2&lt;br /&gt;
&lt;br /&gt;
# Setup the collision callback function&lt;br /&gt;
space.add_collision_handler(COLLTYPE_BALL, COLLTYPE_BUMPER, bumper_collision, None, None, None)   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Balls&lt;br /&gt;
balls = []&lt;br /&gt;
   &lt;br /&gt;
### walls&lt;br /&gt;
static_body = pymunk.Body()&lt;br /&gt;
static_lines = [&lt;br /&gt;
                # Main Box&lt;br /&gt;
                pymunk.Segment(static_body, (50, 50.0), (0.0, 600.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (550.0, 50.0), (600.0, 600.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (0.0, 600.0), (300.0, 580.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (300.0, 580.0), (600.0, 600.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (50.0, 50.0), (300.0, 0.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (300.0, 0.0), (550.0, 50.0), 1.0)&lt;br /&gt;
                # Upper triangle&lt;br /&gt;
                ,pymunk.Segment(static_body, (300.0, 400.0), (220.0, 500.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (300.0, 400.0), (380.0, 500.0), 1.0)&lt;br /&gt;
                # Lower triangle&lt;br /&gt;
                ,pymunk.Segment(static_body, (300.0, 300.0), (240.0, 360.0), 1.0)&lt;br /&gt;
                ,pymunk.Segment(static_body, (300.0, 300.0), (360.0, 360.0), 1.0)&lt;br /&gt;
                ]  &lt;br /&gt;
&lt;br /&gt;
for line in static_lines:&lt;br /&gt;
    line.elasticity = 0.05&lt;br /&gt;
    line.group = 1&lt;br /&gt;
space.add(static_lines)&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;bumpers&amp;quot;&lt;br /&gt;
for p in [&lt;br /&gt;
    (300,10), # Central&lt;br /&gt;
    (50,50),(550,50), # Lower&lt;br /&gt;
    (15,300),(585,300), # Middle&lt;br /&gt;
    (300,440), # Upper triangle &lt;br /&gt;
    (300,340), # Lower triangle&lt;br /&gt;
    ]:&lt;br /&gt;
    body = pymunk.Body()&lt;br /&gt;
    body.position = p&lt;br /&gt;
    shape = pymunk.Circle(body, 20)&lt;br /&gt;
    shape.elasticity = 2&lt;br /&gt;
    shape.collision_type = COLLTYPE_BUMPER&lt;br /&gt;
    space.add(shape)&lt;br /&gt;
    balls.append(shape)&lt;br /&gt;
&lt;br /&gt;
while running:&lt;br /&gt;
    for event in pygame.event.get():&lt;br /&gt;
        if event.type == QUIT:&lt;br /&gt;
            running = False&lt;br /&gt;
        elif event.type == KEYDOWN and event.key == K_ESCAPE:&lt;br /&gt;
            running = False&lt;br /&gt;
        elif event.type == KEYDOWN and event.key == K_p:&lt;br /&gt;
            pygame.image.save(screen, &amp;quot;flipper.png&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
        elif event.type == KEYDOWN and event.key == K_b:&lt;br /&gt;
            # The ball physics&lt;br /&gt;
            mass = 500&lt;br /&gt;
            radius = 10&lt;br /&gt;
            inertia = pymunk.moment_for_circle(mass, 0, radius, (0,0))&lt;br /&gt;
            body = pymunk.Body(mass, inertia)&lt;br /&gt;
            # The ball initial position&lt;br /&gt;
            rand_x = random.randint(1,5)&lt;br /&gt;
            if (rand_x % 2) :&lt;br /&gt;
                x = 300 - rand_x  &lt;br /&gt;
            else : &lt;br /&gt;
                x = 300 + rand_x;&lt;br /&gt;
            body.position = x, 550&lt;br /&gt;
            # Draw ball&lt;br /&gt;
            shape = pymunk.Circle(body, radius, (0,0))&lt;br /&gt;
            shape.elasticity = 1&lt;br /&gt;
            shape.collision_type = COLLTYPE_BALL&lt;br /&gt;
            space.add(body, shape)&lt;br /&gt;
            balls.append(shape)&lt;br /&gt;
    &lt;br /&gt;
    ### Clear screen&lt;br /&gt;
    screen.fill(THECOLORS[&amp;quot;white&amp;quot;])&lt;br /&gt;
    &lt;br /&gt;
    ### Draw stuff&lt;br /&gt;
    for ball in balls:&lt;br /&gt;
        p = to_pygame(ball.body.position)&lt;br /&gt;
        pygame.draw.circle(screen, THECOLORS[&amp;quot;blue&amp;quot;], p, int(ball.radius), 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    for line in static_lines:&lt;br /&gt;
        body = line.body&lt;br /&gt;
        pv1 = body.position + line.a.rotated(body.angle)&lt;br /&gt;
        pv2 = body.position + line.b.rotated(body.angle)&lt;br /&gt;
        p1 = to_pygame(pv1)&lt;br /&gt;
        p2 = to_pygame(pv2)&lt;br /&gt;
        pygame.draw.lines(screen, THECOLORS[&amp;quot;lightgray&amp;quot;], False, [p1,p2])&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    ### Update physics&lt;br /&gt;
    dt = 1.0/60.0/5.&lt;br /&gt;
    for x in range(5):&lt;br /&gt;
        space.step(dt)&lt;br /&gt;
    &lt;br /&gt;
    ### Flip screen&lt;br /&gt;
    pygame.display.flip()&lt;br /&gt;
    clock.tick(50)&lt;br /&gt;
    pygame.display.set_caption(&amp;quot;fps: &amp;quot; + str(clock.get_fps()))&lt;br /&gt;
        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alban</name></author>	</entry>

	</feed>