Spel47: Andrees Olyckliga Expedition till Nordpolen

 

IMG_0455

Som illustration till vad man enkelt man göra med några bilder nedladdade från nätet och sparade under photos och uppladdade till Codea via Dropbox, följer vi ingenjör Andrées olycksaliga expedition till Nordpolen genom att styra luftballongen efter given bana med lutning av skärmen. Spännande och instruktivt. Följ tragiken här. Jämför med Andree’s North Pole Expedition på App Store.

Template:

— Andree North Pole Expedition

displayMode(FULLSCREEN)

pos=vec2(300,500)
n=0

function setup()
print(“Hello North Pole!”)
end
function draw()
background(40, 40, 50)
n=n+1
if math.floor(n/100)==n/100 then
sound(“Game Sounds One:Wind 1”)
end

pos=pos+20*vec2(Gravity.x,Gravity.y)

sprite(“Dropbox:andree1”,WIDTH/2,HEIGHT/2,WIDTH)
sprite(“Dropbox:Andree3”,500,730,100)
sprite(“Dropbox:Andree4”,100,650,200)
sprite(“Dropbox:Andree5”,250,470,100)
sprite(“Dropbox:Andree6”,pos.x,pos.y,50)
sprite(“Dropbox:Andree7”,100,300,100)
sprite(“Dropbox:Andree8”,600,450,100)
sprite(“Dropbox:Andree9”,550,250,100)

end

Spel48: Binär Räkning för Förskolan

 

image

image

 

 

 

 

 

 

 

Vi programmerar en app för binär räkning för förskolan som visar hur barn från 3-års ålder kan lära sig addera (och subtrahera) godtyckliga heltal. Vi representar de binära talen 1, 10, 100, 1000,…, dvs de decimala talen 1, 2, 4, 8,…, med bilder på djur i stigande storleksordning som mus, råtta, katt, get,…med regeln att två mindre djur blir ett djur av närmast större storleksordning. Se Counting på App Store.

Vi lär oss använda olika scener och använder Helperclass för touch som sammanför tex två möss till en råtta genom dragning.

Titta på ett exempel här.

PS Titta på vad mätning och beräkning kan lära oss.

Template:

Main

function setup()
supportedOrientations(LANDSCAPE_ANY)
displayMode(FULLSCREEN)
noFill()
noSmooth()
noStroke()
pushStyle()
Scene(“scene1”,Scene1)
Scene(“scene5”,Scene5)
Scene.Change(“scene1”)
end

function touched(touch)
Scene.Touched(touch)
end

function draw()
background(40, 40, 50)
Scene.Draw()
end

Scene5

Scene5 = class()

local moveForwardButton
local first= vec2(0,0)
local second = vec2(0,0)
local mouse={}
local rat={}
local cat={}
local goat={}
local cow={}
local mammuth={}
local elephant={}
local dinosaur=({})
local N=16
local N1=2
local N2=2
local N3=2
local N4=2
local N5=2
local N6=2
local N7=2
local N8=2
local oldID={}
for n=1,N do
oldID=0
end

function Scene5:init()

speech.voice=speech.voices[19]
speech.rate=0.01
speech.say(“Dra en mus till närmaste mus och se att det blir en råtta och fortsätt på samma sätt till dess det inte finns två lika djur kvar.”)
speech.say(“Säg vad som blev kvar till slut!”)
speech.say(“Hur många möss var det från början?”)
for n=1,4 do
mouse[n]=SpriteObject(“Dropbox:mouse1”,vec2(100*n,1000),1)
end

for n=5,8 do
mouse[n]=SpriteObject(“Dropbox:mouse1”,vec2(100*n-400,900),1)
end

for n=9,12 do
mouse[n]=SpriteObject(“Dropbox:mouse1”,vec2(100*n-800,800),1)
end

for n=13,16 do
mouse[n]=SpriteObject(“Dropbox:mouse1”,vec2(100*n-1200,700),1)
end

for n=1,4 do
rat[n]=SpriteObject(“Dropbox:rat2”,vec2(100*n,600),0)
end

for n=5,8 do
rat[n]=SpriteObject(“Dropbox:rat2”,vec2(100*n-400,500),0)
end

for n=1,4 do
cat[n]=SpriteObject(“Dropbox:cat3”,vec2(100*n,400),0)
end

for n=1,2 do
goat[n]=SpriteObject(“Dropbox:goat4”,vec2(100*n,300),0)
end

cow[1]=SpriteObject(“Dropbox:cow5”,vec2(500,300),0)
moveForwardButton=Button(“Cargo Bot:Command Right”,vec2(50,100))
end

function Scene5:draw()

background(249, 248, 249, 255)

fill(27, 30, 26, 255)
rect(10,10,300,50)

for n=1,N do
if mouse[n].ID==1 then
sprite(“Dropbox:1bitr”,mouse[n].objectCurrentLocation.x,mouse[n].objectCurrentLocation.y-40,50)
end
end

for n=1,8 do
if rat[n].ID==1 then
sprite(“Dropbox:2bitr”,rat[n].objectCurrentLocation.x,rat[n].objectCurrentLocation.y-40,50)
end
end

for n=1,4 do
if cat[n].ID==1 then
sprite(“Dropbox:4bitr”,cat[n].objectCurrentLocation.x,cat[n].objectCurrentLocation.y-50,50)
end
end

for n=1,2 do
if goat[n].ID==1 then
sprite(“Dropbox:8bitr”,goat[n].objectCurrentLocation.x,goat[n].objectCurrentLocation.y-60,50)
end
end

if cow[1].ID==1 then
sprite(“Dropbox:16bitr”,cow[1].objectCurrentLocation.x,cow[1].objectCurrentLocation.y-60,50)
end

moveForwardButton:draw()

for n=1,N do
mouse[n]:draw()
end
for n=1,8 do
rat[n]:draw()
end
for n=1,4 do
cat[n]:draw()
end
for n=1,2 do
goat[n]:draw()
end
cow[1]:draw()

mouseID=0
ratID=0
catID=0
goatID=0
cowID=0

for n=1,N do
mouseID=mouseID+mouse[n].ID
end

for n=1,8 do
ratID=ratID+rat[n].ID
end

for n=1,4 do
catID=catID+cat[n].ID
end

for n=1,2 do
goatID=goatID+goat[n].ID
end

for n=1,1 do
cowID=cowID+cow[n].ID
end

finish=mouseID

if ratID>mouseID then
finish=ratID
end
if catID>ratID then
finish=catID
end
if goatID>catID then
finish=goatID
end
if cowID>goatID then
finish=cowID
end

if finish<1 then
for n=1,N do
mouse[n].ID=1
end
end

 

end

function Scene5:touched(touch)

moveForwardButton:touched(touch)

if(moveForwardButton.selected==true) then
Scene.Change(“scene7”)
end

for n=1,N do
mouse[n]:touched(touch)
end
for n=1,8 do
rat[n]:touched(touch)
end
for n=1,4 do
cat[n]:touched(touch)
end
for n=1,2 do
goat[n]:touched(touch)
end
cow[1]:touched(touch)

for n=1,N do
for m=1,N do
if m~=n then
if (mouse[m]:isTouching(mouse[n])==true) and mouse[m].ID*mouse[n].ID>0 then
for n=1,N1/2 do
rat[n].ID=1
end
mouse[m].ID=0
mouse[n].ID=0
N1=N1+2
end
end
end
end

for n=1,8 do
for m=1,8 do
if m~=n then
if (rat[m]:isTouching(rat[n])==true) and rat[m].ID*rat[n].ID>0 then
for n=1,N2/2 do
cat[n].ID=1
end
rat[m].ID=0
rat[n].ID=0
N2=N2+2
end
end
end
end

for n=1,4 do
for m=1,4 do
if m~=n then
if (cat[m]:isTouching(cat[n])==true) and cat[m].ID*cat[n].ID>0 then
for n=1,N3/2 do
goat[n].ID=1
end
cat[m].ID=0
cat[n].ID=0
N3=N3+2
end
end
end
end
if (goat[1]:isTouching(goat[2])==true) and goat[1].ID*goat[2].ID>0 then
cow[1].ID=1
goat[1].ID=0
goat[2].ID=0
end

end

Spel49: Big Crunch

image

Som spektakulär tillämpning av våra nyförvärvade simuleringsfärdigheter programmerar vi vad som brukar kallas Big Crunch av ett Universum som drar ihop sig under gravitation och sedan expanderar igen. Koden är väsentligen densamma som i 7: Planetsystem och i Dark Energy på App Store.

Följ det dramatiska förloppet i en simulering här utan rotation och här med lite rotation. Jämför med tex denna simulering eller denna.

Template:

— Gravitational Collapse

function setup()
displayMode(FULLSCREEN)
end

I1=10
I2=10

pos= {}
vel = {}
acc= {}
force= {}
mass={}
for i1=1,I1 do
pos[i1]= {}
vel[i1] = {}
acc[i1]= {}
force[i1] = {}
end

for i1=1,I1 do
for i2=1,I2 do
pos[i1][i2]= vec2(0,0)
vel[i1][i2]= vec2(0,0)
acc[i1][i2]= vec2(0,0)
force[i1][i2] = vec2(0,0)
end
end

dt =0.002
h1=40
h2=1

for i1=1,I1 do
for i2=1,I2 do
pos[i1][i2]=vec2(400+i1*h1*math.cos(2*math.pi*i2*h2/I2),400+i1*h1*math.sin(2*math.pi*i2*h2/I2))
end
end

function draw()

background(29, 22, 23, 255)

font(“AmericanTypewriter-Condensed”)
fontSize(70)
fill(0, 38, 255, 255)
text(“Gravitational Collapse”,350, 950)
stroke(43, 203, 22, 108)
strokeWidth(1)
fill(255, 0, 31, 255)
for i1=1,I1 do
for i2=1,I2 do
force[i1][i2] =vec2(0,0,0)
for j1=1,I1 do
for j2=1,I2 do
r2= (pos[i1][i2] -pos[j1][j2] ):len()
force[i1][i2] =force[i1][i2] -(1000000/(r2+20)^3)*(pos[i1][i2]-pos[j1][j2])
end
end
acc[i1][i2] = force[i1][i2]
vel[i1][i2]=vel[i1][i2] +acc[i1][i2]*dt
pos[i1][i2]=pos[i1][i2] +vel[i1][i2]*dt
d= (pos[i1][i2] -vec2(400,400)):len()
fill(255-d,d/2+18, d, 255)
ellipse(pos[i1][i2].x,pos[i1][i2].y,10+d*0.3)
end
end

end

Spel51: Text to Speak Input

Vi programmerar input av text i en ruta på skärmen från tangentbordet och låter också Siri säga vad som skrivits i rutan.

När man är färdig med input trycker man på retur och vad som skrivits i rutan skrivs ut på konsolen samtidigt som Siri läser upp.

Titta på ett exempel här.

Template:

function setup()

iTab={} — input box x,y,w,h
table.insert(iTab,vec4(200,600,200,50))
table.insert(iTab,vec4(200,500,200,50))
strTab={} — initial input text
table.insert(strTab,”Enter value”)
table.insert(strTab,”Enter value”)
rectMode(CENTER)
speech.voice=speech.voices[19]
speech.rate=0.01

end

function draw()

background(30,30,0,255)
stroke(255)
strokeWidth(6)
for a,b in pairs(iTab) do
fill(255, 0, 0, 255)
if a==selected then
fill(128,0,0,255)
strTab[a] = keyboardBuffer()
speak=1
end
rect(b.x,b.y,b.z,b.w)
fill(255)
text(strTab[a],b.x,b.y)
end

end

function touched()

for a,b in pairs(iTab) do
if CurrentTouch.x > b.x-b.z/2 and CurrentTouch.x < b.x+b.z/2 and
CurrentTouch.y > b.y-b.w/2 and CurrentTouch.y < b.y+b.w/2 then
showKeyboard()
selected=a
end
end

end

function keyboard(key)

if key == RETURN then
print(strTab[selected])
for a,b in pairs(iTab) do
if a==selected then
speech.say(keyboardBuffer())
speak=0
end
end
selected=0
hideKeyboard()
end

end

Spel52: Hoppande Apa

image

Inspirerade av de många spel som bygger på hoppande programmerar vi ett enkelt sådant spel, där vi använder physics.body samt body:applyLinearImpulse. Titta på ett fruktlöst försök här. Jämför med version på App Store.

Template:

supportedOrientations(LANDSCAPE_ANY)
displayMode(FULLSCREEN)

local box={}
local apa

function setup()

I=5
for i=1,I do
box[i] = physics.body(CIRCLE,20)
box[i].x=-100+200*i
box[i].y=math.random(20,300)
box[i].type = STATIC
box[i].restitution=0.5
end

apa = physics.body(CIRCLE,20)
apa.type = DYNAMIC
apa.x=110
apa.y=600

end

function draw()
sprite(“Dropbox:oceanisland”,400,400,1300)
fontSize(50)
fill(255, 8, 0, 255)
text(“Klicka på skärmen för att ge apan en kick!”,500,600)

fill(255, 0, 94, 255)
sprite(“Dropbox:Micky5”,apa.x,apa.y,50)
for i=1,I do
sprite(“Small World:Rock”,box[i].x,box[i].y,70)
end
end

function touched(touch)
if touch.state == ENDED then
apa:applyLinearImpulse(vec2(0,5))
end

end