Hello!

My name is Christian Perfect and this is my website. Here I upload the various things I make.

If you want to email me, you can! My email address is christianperfect@gmail.com. Like most people, I am especially open to receiving friendly emails.

cp

checkmyworking

checkmyworking.com

wordpress

wordpress.zip

antiasteroids

antiasteroids.debug.exe

antiasteroids.debug

antiasteroids.bmx

newscorm

newscorm.zip

graph

graph.pdf

oldones

oldones.bmx

oldones1.jpg

horsey

horsey.exe

horsey.jpg

positionbased

positionbased.bmx

I found a nice paper a few days ago called Position Based Dynamics, by a chap called muller and some other dudes. It explains rather clearly how to implement a dynamics system that can handle pretty much whatever sort of rules you want to put in it.
This is great, because physics is something that everyone seems to have trouble with beyond simply moving particles about, without resorting to those wrappers for things like newton or ODE. I certainly do, so this is going to stick around for a good while in my how-to-do-stuff folder.
So, I had a go at writing this system in BMax, and here it is. I hope someone finds it useful!


Position - based dynamics (Muller et al 2006)

HOW IT WORKS
There are objects , which are collections of vertices and constraints on how those
vertices act.
So you create an object , add a bunch of vertices , then add some constraints
Constraints can set the distance between vertices , make sure something doesn't bend too
much, make sure an object retains its volume, whatever.
The update function then moves everything about for one timestep then finds an arrangement
for them to be in that satisfies the constraints

That's it!

You can make sure a vertex isn't moved by the solver by setting its inverse mass, w, to 0.
(For example when you've attached it to something)

Adding different kinds of constraints requires a little bit of maths and know - how ,
which you can find in the original paper:
http:/ / www.matthiasmueller.info / .....

httpserver

httpserver.zip

sketchgame

sketchgame.zip

blitz

blitz.js

museum

museum.bmx

museum.jpg

schizoman

I've made a game.

It's called Schizophrenic Pacman.

It involves popping pills to keep your sanity in a maze of twisty passages that only vaguely makes sense.

Try it out! .....

schizoman.exe

schizoman.bb

clockworkshooter

The Clockwork Shooter!

A story, why not?
---
So someone finally got the Swiss angry, and they've conquered the known universe, prompting every Heroic Little Dude to climb in his spaceship and head for Lake Geneva. It's your job as the Swiss master watchmaker to build the clockwork machinery of destruction that will defend your beloved alpine nation from the villainous forces of liberty and imprecise timekeeping. Connect the cogs together, shoot the Heroic Little Dudes, eat some cheese with holes in it.
---


An explanation, because someone's bound to ask:
Link cogs together by clicking where you want them to go. The large pegs on the cogs are what push the other cogs round. Red lines on cogs show where they will shoot when turned. The bullets from ships either shoot out the large pegs, or damage the cogs. Cogs turn red the more they get damaged, but repair themselves when they are turned. There's no end to the game, I can never be bothered to put an end in my games......

ClockworkShooter.exe

ClockworkShooter.zip

ClockworkShooter.bmx

clockworkshooter1.jpg

waterdrops

WATER DROPS!

Instructions
------------

There's water falling all over the shop. It must be raining or something. The rain gods are pleased when you keep the rainwater in jugs, especially thin ones, they're very fashionable rain gods.
You can move the buckets about by left clicking on the circle in the centre of a bucket and dragging it about, but it can only move within a certain range from where it started.
The buckets will disappear after a while so you need to move the water about with pipes. To create a pipe draw a line with the left mouse button. You can grab either end of a pipe and move it about if you need to. To pump water, grab the crank in the middle of the pipe with the left mouse button and swing it left and right as fast as you feel like. To remove a pipe that's getting in your way right click on it.

The game ends when the water level reaches the top of the screen. When that happens you'll be given your score......

waterdrops.zip

surroundemup

In this game, you have to create a path along the network of points.

You do this by left-clicking on the points connected to your current
point (THE BIG RED ONE), to move to that point.

BUT: You can't visit a point twice, apart from the one you started at.
SO: If you get stuck, right-click to destroy your path and start again.

The aim of the game is to get back to the point you started at (THE GREEN ONE).
Doing this gets you points. You get more points for a longer path,
And lots more points for enclosing other points within your path......

surroundemup.exe

surroundemup.bmx

bigboots

Big Boots

Clanging, banging, shooting robots roam the countryside. It's a bit like war of the worlds!.....

bigboots.zip

bigboots.exe

origami

I was going to wait until I'd got this perfect and then wow everyone with it, but as usual my mind's wandered elsewhere.

So for the last couple of weeks I've been thinking about how to do a simulation of that thing where you fold a piece of paper up lots of times, then cut it into the shape of a little person, unfolding to give a whole chain of little people.

So here's a why-can't-I-concentrate-for-longer-than-5-minutes-on-something EXE.

You can cut the bit of paper by clicking first outside of it, in the black space. Click on another point outside the paper to make a clean cut along that line, or click inside the paper to make an incision. Make another incision to the same point to cut a chunk out of the paper.

You can fold the paper by doing a normal clean cut, but right clicking instead of left clicking on the second click. You can cut folded paper, and unfold a fold by right clicking on it.

The folding doesn't completely work all the time yet because I haven't put the layering in. I know how to fix it, but can't be bothered today.

Anyway, hope someone likes this, I'm quite chuffed with myself for working out all the geometry and algorithms, but a bit disappointed I couldn't find the motivation to finish it properly......

origami.bmx

origami.exe

origami1.jpg

rowing

Rowing boats and jellyfish.
A really rather pleasing scene of rowing boats going out to fish for jellyfish......

rowing.exe

rowing.bb

worlds

Worlds!
The beginning of an idea that didn't become playable. A little world where stuff happens. The idea was to have one on the bottom of the screen and one upside down at the top, and they'd fight each other......

worlds.bb

colourpicker

colourpicker.zip

groupsmultiplayertest

groupsmultiplayertest.zip

groupsfullscreen

groupsfullscreen.zip

beards

beards.zip

beards1.jpg

eugottabeclidding

Another diversion, which I'm considering making into a surveying / charting mini game.
It's a virtual ruler and compass set, for making geometric constructions. I've also spent a frustrating evening making it calculate the area of arbitrary polygons, even with holes in, albeit very slowly. .....

eugottabeclidding.bmx

eugottabeclidding1.jpg

masala

masala.zip

charsets

charsets.bmx

regexp

regexp.bmx

unicycle

unicycle.bmx

unicycle.exe

sausages

sausages.bmx

sausages.exe

schroedingersghost

schroedingersghost.bmx

Schroedinger's Ghost

HOT DAMN this is a good idea!

It's like your common or garden Pacman, but the ghosts are wave-functions: Until you observe them, they have a probability of being everywhere. This probability is shown by the board lighting up with each ghost's colour where they are likely to be. If you observe a square, there is a probability that the ghost will appear there and start chasing you. Cripes!
If a ghost does start chasing you, try and get it out of your sight, where it will fade away until it becomes a wave-function again.

Cursor keys to move, objective is to pick up all the pills, yadda yadda yadda. There's no need for the super pill things, because you can just hide from the ghosts......

schroedingersghost.zip

trains

trains.bmx

trains2.jpg

trains1.jpg

wobblymen

wobblymen.bmx

wobblymen.exe

trader

For ages I've wanted to make a game where you control a trading empire, like in Anno 1602 or any number of other German games, but you don't have a god-like overview of the whole world. Instead, you are confined to your banca in whatever port you reside in, sending ships full of letters and goods to your agents in foreign places for them to use.

There were two main problems with this idea - the first being that you need to have a simple, intuitive way of writing letters that can be interpreted by the game, but don't take too long to write and look plausibly like a person wrote them. I had a brainwave about how to solve that, so I could proceed to the second problem - that I would have to create an incredibly complex world for there to be any interest in the game - repeatedly doing the same thing over and over is only fun when there are pretty graphics to go with it.

So, the letter writing system.
I've made a system that works like predictive text on your mobile, but with an added grammar constraint that interprets what you're writing as you write it, and suggests what you might want to next write while correcting any mistakes you make. You could feasibly write out whole sentences and have the game interpret them, but most of the time it's only necessary to type the first couple of letters of the word or phrase you want and then press tab or enter to automatically complete it. It's rather clever!

And now the game world. I've arranged the world as a set of towns, all inter-c.....

trader.zip

trader.exe

trader2.jpg

trader3.jpg

trader4.jpg

trader5.jpg

trader1.jpg

lettering

lettering.bmx

snakes

snakes.zip

snakes1.jpg

group theory

group theory.bmx

penpals

penpals.zip

penpals1.jpg

keycodes

keycodes.xls

duel

duel.exe

boids

boids.exe

boids.jpg

fiftween

fiftween.exe

bubbleworlds

bubbleworlds.exe

Following on from the effect I made for this thread, here's a pleasant little game.

It's a game that requires patience, because everything happens quite slowly. Use the arrow keys or a joystick to move your little circle about and navigate the worlds. The jewels will be attracted to you and can help push about the bubbles......

bubbleworlds3.jpg

bubbleworlds2.jpg

bubbleworlds.jpg

index

index.html.erb

fascinating

fascinating.debug.exe

fencing

fencing.zip

fencing1.jpg

3dwongo

3dwongo.exe

crazysanta

crazysanta.exe

crazysanta4.jpg

crazysanta2.jpg

crazysanta3.jpg

crazysanta1.jpg

the word problem in group theory

the word problem in group theory.pdf

gilliamoid

gilliamoid.zip

knnniggets

knnniggets.exe

gilliamesque

A Gilliam-esque animation program. Press Space to play, I think......

gilliamesque.zip

swirlograph

A nice effect based on a carefully broken law of gravity......

swirlograph.exe

gibboon

Keys left-to-right to swing, up or down to adjust rope. Click to shoot tail / detach. .....

gibboon.exe

poption

GROUPS OF LITTLE THINGS
or
Poption

Instructions
------------

So these little things keep popping up all over the place. You have to sweep them up by holding down the left mouse button and making a sweeping motion, then pop the little things by tapping the left mouse button on one of them. Who knows why, but you get more points for popping lots of them together.
If you leave the little things to their own devices too long they might pop of their own accord, especially if they're in large groups. It's a mystery why, but you don't get any points when this happens.
Some of the little things are red and flashing. You can't pop them, but they might pop themselves and anything else near them, earning you no points.
Yet others are blue and flashing - they scoot about dragging the other things in their wake. You can't push them so your best bet is to try and pop a group when they're passing by it.
Finally, the last kind of thing sucks the other things towards it, popping them for no points when they get close. You'll just have to do your best until one of these things disappears after a short while.

After however long, your time is up and you're given your score, for whatever reason. After that you can start the game again, if you like.

Level Editor Instructions
-------------------------

You can click and drag points and triangles to move them about
Hold down shift and click on an edge to toggle whether it's drawn
Hold down control and click in three places to make a triangle.
Ho.....

poption.zip

poption1.jpg

platespinning

So I've had a revelation - there is a God, and He has a plan for us all....
His plan for this little dude is for him to spend eternity doing a cosmic plate-spinning routine. God works in mysterious ways.

Anyway, you control the dude's fate! Asteroid-ish controls for when he's flying: arrow keys provide turning and thrust. Fly into a plate to send it spinning, then press the up key to spin it more. When you want to get off, point the mouse in the direction you want to go (there's a line drawn from the centre of the plate to help you) and left-click. The dude will detach from the plate at the right point. If that isn't fast enough for you, right-click to detach right away.

The aim of the game is to get every plate spinning so it's pure red. Plates go dark when they're not spinning, and yellow when they're spinning too fast. If the plate the dude is on is spinning too fast, he'll be thrown off.

There's an editor. Press E in the game to get it......

platespinning.zip

platespinning1.jpg

hamstrograph

HAMSTROGRAPH!
The objective is to be holding all of the weights at once (those white boxes for now)
Press left/right keys to roll right/left. Press space to pick up any weights you roll over. Let go of space to drop what you're carrying (you will need to do this!)
Press up to go up a ramp when you roll up to it, and down to roll down a ramp similarly......

hamstrograph.debug.exe

hamstrograph.exe

hamstrograph.bmx

hamstrograph2.jpg

hamstrograph.jpg

yousosceles

Isosceles, Yousosceles.

A game where you have to arrange triangles into closed groups, in order to score points. A triangle is a shape with three sides, and here each of those three sides could have a wall on it, which appears as a thick white line. Each triangle also has a colour, which it will mix with adjacent triangles if there's no wall between them. A triangle is always attached to your cursor. Right-click to rotate it (don't worry if it rotates of its own accord, it aligns itself to the tile you're hovering over) and left-click to place it in an empty square. When a triangle or group of triangles is completely surrounded by walls those triangles are removed from play and points are awarded based on the number of triangles in the group, the number of turns taken since you last scored, and the group's colour - if the group is a pure primary colour or pure white, you get more points than for any other kind of group.

The game has no end, and I hope to add hexagons to it later. For now, enjoy the mindless grouping!

Yrs sncrly,
cp.....

yousosceles.zip

yousosceles1.jpg

trenchant

trenchant.exe

trenchant3.jpg

trenchant2.jpg

trenchant.jpg

tdict

TDict.zip

swoshnessosityink

swoshnessosityink.htm

trees

trees.zip

swooshes

swooshes.bmx

santas

santas.zip

pictureballs

pictureballs.zip

littledoggy

littledoggy.mp4

monk1

monk1.png

magical bork

Magical Bork.doc

magics

magics.bb

kazumi_and_maia_l_amitie_1_a_l_endroit__a_l_envers

Kazumi_And_Maia_L_Amitie_1_A_l_endroit__A_l_envers.mp3

la comédie de fixed erreurs

La Comédie de fixed erreurs.doc

la comédie d'erreurs

La Comédie d'Erreurs.doc

juggling

juggling.bb

hippo

Chez moi, il y a un hippopotame. Je l'appelle Henri. Il s'appelle Jean, mais Jean n'est pas un bon nom pour un hippopotame.
Un jour, Henri (ou Jean, si tu préfères, mais j'ai déja dit que je l'appelle Henri) est allé vers ma porte et, à cause de son immense poids, je n'ai fait rien à l'arrêter......

hilton

Dear Mrs Hilton,
I've just heard your good news. Congratulations on leaving teaching! Will there be a party to celebrate your retirement? Are you invited? Do you need an after-dinner speaker? I could talk for hours about your skill, determination, and natural talent as a golfer, but you can't afford my rate.

I hear you're going to start a business teaching old people to use the internet. I'm glad to hear you're finally picking on someone your own age! I'm sure you'll have at least three, or maybe four years of happiness reminding senile vegetables what 'an internet' is before you drop dead.

I suppose the tercentenary year is a good time to leave the school you practically built from the ground up. I hear the school you were at before Dame Allan's was founded is having an anniversary next year as well.

I wish you the best of luck in your endeavours, though I've recently become a Buddhist so I can't sincerely say your chances look good, what with kharma and everything.

Yours duplicitously (note that the word 'Yours' does not constitute a contract),
cp

ps. I kid, eh? :).....

groupboard

groupboard.html

google8c11b615f116c7f1

GOOGLE8c11b615f116c7f1.html

gilliamesque-dist

gilliamesque-dist.zip

flies

flies.exe

flies.bb

divx521xp2k

DivX521XP2K.exe

cp clean

cp clean.ttf

face

face.bb

dada2

dada2.htm

dada2.pub

dada3

dada3.pub

dada

dada.pub

cubeys

cubeys.bb

cats

cats.bmx

cats.scr

catmullrom

catmullrom.bmx

bouncynumbers

bouncynumbers.zip

bouncynumbers.exe

boots

boots.zip

boats

boats.scr

boats.exe

boats.bb

blitzmax

BlitzMax.chl

blitzkeywords

Abs After And Before Case Const Data Default Delete Dim
Each Else ElseIf End End Function End Select End Type EndIf Exit False
Field First Float For Forever Function Global Gosub Goto If Include
Insert Int Last Local Mod New Next Not Null Or Pi Read Repeat Restore
Return Sar Select Sgn Shl Shr Step Str Then To True Type Until Wend
While Xor
Abs
Abstract
ACos
AllocChannel
And
AppArgs
AppDir
AppFile
AppTitle
Asc
ASin
Assert
ATan
ATan2
AutoImageFlags
AutoMidHandle
BankBuf
BankCapacity
BankSize
bglAdjustTexSize
bglCreateContext
bglDeleteContext
bglDisplayModes
bglDrawText
bglFixedFontBitmaps
bglSetMouseVisible
bglSetSwapInterval
bglSwapBuffers
bglTexFromPixmap
BigEndianStream
Bin
BindSocket
Byte
Case
CasedFileName
Catch
Ceil
ChangeDir
ChannelPlaying
Chr
ClearList
CloseDir
CloseFile
CloseGNetHost
CloseGNetObject
CloseGNetPeer
CloseSocket
CloseStream
Cls
CollideImage
CollideRect
compress
compress2
Confirm
ConnectSocket
Const
Continue
ConvertPixmap
CopyBank
CopyBytes
CopyPixmap
CopyStream
Cos
Cosh
CountGraphicsModes
CountList
CreateAudioSample
CreateBank
CreateBankStream
CreateDir
CreateFile
CreateGNetHost
CreateGNetMessage
CreateGNetObject
CreateImage
CreateList
CreatePixmap
CreateRamStream
CreateSocketStream
CreateStaticAudioSample
CreateStaticBank
CreateStaticPixmap
CreateTCPSocket
CreateTimer
CreateUDPSocket
CueSound
CurrentDate
CurrentDir
CurrentTime
D3D7Max2DDriver
DebugLog
DebugStop
Default
DefData
Delay
Delete
DeleteDir
DeleteFile
DottedIP
Double
DrawImage
DrawImageRect
Dra.....

battles - leyendecker

Battles - Leyendecker.mp3

arrows

arrows.bb

Other Images

picaresque5.jpg
picaresque4.jpg
picaresque3.jpg
picaresque2.jpg
picaresque1.jpg
cat.jpg
voronoi.jpg
diary post appears in.gif
projectline2.jpg
projectline3.jpg
projectline4.jpg
projectline1.jpg
robin.jpg
old man.jpg
zapem.jpg
tuxmonkey.jpg
windermere.jpg
wobbly man.jpg
waterdropsscreen.jpg
Victorian_squalor.gif
watercolours1.jpg
vbkey.jpg
screen2.jpg
screen3.jpg
screen1.jpg
title.jpg
tautology.jpg
swishguy.jpg
swishguy copy.jpg
smallrobin.jpg
smallchompcolours.jpg
sockmonkey.jpg
squirrel.jpg
snowman.jpg
snowsatan.JPG
smallsnowman.jpg
smallgrinningcat.jpg
smallgrinningcatlines.jpg
slidingvectors.gif
sketches2.jpg
sketches.jpg
sentientbanana.jpg
scribbleabouttikibirds.jpg
lamp.jpg
scribbleaboutfood.jpg
mopbg.gif
mopbg.jpg
onque.jpg
piratemanhead.jpg
polar.jpg
runaway.jpg
ragdollbenderscreen.jpg
Rolf.jpg
quandfermiersattaquent.gif
quandfermiersattaquent.jpg
present.jpg
oohfireworks.jpg
pirateman.jpg
peacewithmybear.gif
panda.jpg
my hamster.jpg
Mr spiffing copy.jpg
monster.jpg
mobsterwallpaper.jpg
mobsterbot.jpg
lostballoon.jpg
liger.jpg
lastmanonearth.gif
hey.jpg
igbrokenupload.jpg
kkey.jpg
kittensleep copy.jpg
KIF_0524.JPG
jam.jpg
jambw.jpg
IMAGE_076.jpg
IMAGE_075.jpg
hamtaro.jpg
happypanda.jpg
hamster.jpg
groupsscreen.jpg
grinningcatwallpaper.jpg
grinningcatlines.jpg
greys_monument_to_baltic.jpg
goggles.jpg
fruitcabaret.gif
flyingsantas.jpg
flying monkey.jpg
eurrgh.jpg
flatmap.jpg
enterkey.jpg
failuresongsmall.gif
didntwetakethebus.gif
elficon.jpg
elficoncolours.jpg
eh.jpg
demon.jpg
eeep.jpg
DSCN0564.JPG
discoturtle.jpg
de10eb86.jpg
crismus_bonus.jpg
clowns.jpg
chompcolours.jpg
chompbirdbig.jpg
chat perché.gif
catandblobwallpaper.jpg
card.jpg
bongo.jpg
bobgoestoplob.gif
bloke.jpg
bloke vector .jpg
blob splodgebig.jpg
blob splodge icon.jpg
big hamtaro.jpg
bearwithme.gif
bear.jpg
awaaaaycolourssuper.jpg
awaaaay.jpg
apologeticmeatshake.gif
angryblob.jpg
amucha30.gif
alloftherubbish.jpg
acomplimentarydrink.gif