0 Members and 2 Guests are viewing this topic.
function on.charIn(ch) if ch=="r" then blocks={5,5,5,5,5,5,5,5,5,5,5,5} blockAttacked=0 game="notfinished" score=0 player=100 shotX=0 shotY=0 level=1 wait=0.04 aliensDir="right" down="no" aliensX={} aliensY={} shotsX={} shotsY={} lives=3 for i=1,21,1 do aliensX[i]=(i-1)%7*31+1 aliensY[i]=math.floor((i-1)/7)*25+10 shotsX[i]=aliensX[i] shotsY[i]=200 end end if ch=="c" then originalColors=not originalColors endendfunction blocktest(x,y) blockAttacked=0 if y>170 and y<177 then if x>30 and x<40 and blocks[1]>0 then blockAttacked=1 elseif x>40 and x<=50 and blocks[2]>0 then blockAttacked=2 elseif x>50 and x<=60 and blocks[3]>0 then blockAttacked=3 elseif x>60 and x<=70 and blocks[4]>0 then blockAttacked=4 elseif x>140 and x<=150 and blocks[5]>0 then blockAttacked=5 elseif x>150 and x<=160 and blocks[6]>0 then blockAttacked=6 elseif x>160 and x<=170 and blocks[7]>0 then blockAttacked=7 elseif x>170 and x<=180 and blocks[8]>0 then blockAttacked=8 elseif x>250 and x<=260 and blocks[9]>0 then blockAttacked=9 elseif x>260 and x<=270 and blocks[10]>0 then blockAttacked=10 elseif x>270 and x<=280 and blocks[11]>0 then blockAttacked=11 elseif x>280 and x<=290 and blocks[12]>0 then blockAttacked=12 end endendon.charIn("r")function on.arrowLeft() if player>0 then player=player-10 endendfunction on.arrowRight() if player<290 then player=player+10 endendfunction on.tabKey() if shotY<=0 then shotY=195 shotX=player+13 endendfunction on.paint(gc) if originalColors then gc:setColorRGB(0,0,0) gc:fillRect(0,0,platform.window:width(),platform.window:height()) end if not originalColors then gc:setColorRGB(0,0,0) else gc:setColorRGB(255,255,255) end gc:setPen("thin","smooth") gc:setFont("sansserif","r",8) gc:drawString("Lua Alien Invaders - Par Loic Pujet",10,200,"top") if game=="notfinished" then if not originalColors then gc:setColorRGB(200,0,0) else gc:setColorRGB(255,255,255) end for i=1,21,1 do if aliensY[i]~=0 then gc:drawArc(aliensX[i]+4,aliensY[i]-9,10,10,0,360) gc:fillArc(aliensX[i]-5,aliensY[i]-4,28,8,0,360) end end if not originalColors then gc:setColorRGB(0,0,200) else gc:setColorRGB(255,255,0) end for i=1,21,1 do if shotsY[i]<200 then gc:fillRect(shotsX[i],shotsY[i],2,5) end end if shotY>0 then gc:fillRect(shotX,shotY,4,6) end if not originalColors then gc:setColorRGB(100,0,255) else gc:setColorRGB(0,255,0) end gc:fillRect(player,195,30,10) gc:fillRect(player+13,191,4,4) gc:setFont("sansserif","r",10) gc:drawString("Lives:"..tostring(lives).." Score:"..tostring(score).." Level:"..tostring(level),0,0,"top") if not originalColors then add=3 else add=0 end for i=1,12,1 do if blocks[i]>0 then gc:fillRect(i*10+math.floor((i-1)/4)*70+20,180-blocks[i]*2,10,blocks[i]*2) end end else if var.recall("highscore")==nil then var.store("highscore",0) else if var.recall("highscore")<score then var.store("highscore",score) document.markChanged() end end if not originalColors then gc:setColorRGB(0,0,0) else gc:setColorRGB(255,255,255) end gc:setFont("sansserif","b",15) gc:drawString("Score : "..tostring(score).." High score : "..tostring(var.recall("highscore")),50,50, "top") if not originalColors then gc:setColorRGB(0,0,255) end if locale.name()=="fr" then gc:drawString("Appuyez sur R pour rejouer",50,150,"top") else gc:drawString("Press R to try again",80,150,"top") end end if wait>0.01 then timer.start(wait) else timer.start(0.01) endendfunction on.timer() timer.stop() if game=="notfinished" then if aliensDir=="right" then for i=1,21,1 do if aliensY[i]>0 then aliensX[i]=aliensX[i]+1 end end else for i=1,21,1 do if aliensY[i]>0 then aliensX[i]=aliensX[i]-1 end end end if aliensDir=="right" then for i=1,21,1 do if aliensX[i]>295 then down="yes" end end else for i=1,21,1 do if aliensX[i]<5 then down="yes" end end end if down=="yes" then down="no" for i=1,21,1 do if aliensY[i]>0 then aliensY[i]=aliensY[i]+25 end end if aliensDir=="left" then aliensDir="right" else aliensDir="left" end end for i=1,21,1 do if aliensY[i]>180 then game="finished" end if shotsY[i]>=200 and aliensY[i]~=0 then if math.random(1,100)==5 then shotsY[i]=aliensY[i]+math.random(1,10) shotsX[i]=aliensX[i] end else shotsY[i]=shotsY[i]+3 end blocktest(shotsX[i],shotsY[i]) if blockAttacked>0 then shotsY[i]=201 blocks[blockAttacked]=blocks[blockAttacked]-1 end if shotsY[i]<200 then if shotsY[i]>195 and shotsX[i]>player and shotsX[i]<player+30 then lives=lives-1 shotsY[i]=200 end end if shotY>0 and shotY>aliensY[i]-5 and shotY<aliensY[i]+5 and shotX>aliensX[i]-10 and shotX<aliensX[i]+21 then aliensY[i]=0 aliensX[i]=100 shotY=0 score=score+1 end end blocktest(shotX,shotY) if blockAttacked>0 then shotY=-1 blocks[blockAttacked]=blocks[blockAttacked]-1 end if shotY>=0 then shotY=shotY-5 end if lives<=0 then game="finished" end wintest=0 for i=1,21,1 do wintest=wintest+aliensY[i] end if wintest==0 then if wait>0.01 then wait=wait-0.005 end level=level+1 aliensDir="right" down="no" for i=1,21,1 do aliensX[i]=(i-1)%7*31+1 aliensY[i]=math.floor((i-1)/7)*25+10 shotsX[i]=aliensX[i] shotsY[i]=200 end end end platform.window:invalidate()end
The player can shoot with the up arrow, but that's not really convenient. If you had any better idea...
Hello everybody !
That's my first post here, so I'll try to introduce myself.
First, I'm French. I am a very bad English speaker (well, I'm fifteen and our English teacher sucks) so I apologize for all the nonsenses and mistakes that I'll do.
I was a member of TI-Bank, and I left this website because of all the troubles (fights between admins, etc)
So the most interesting website about calculators was Omnimaga, and I registered.
I have a TI-83+ and a TI-Nspire (Non-CAS & clickpad), and I code in Axe, in C for Nspire and in Lua. I also program in C with OpenGL on my PC, but that's not really interesting.
Well, I think I've enough talked about myself.
I made this post because I wanted feedbacks (not sure about this word) for my newest project, a Space Invaders game in Lua.
It looks like the original game, excepted that there's only one kind of enemies, and there's no "houses". Also, the enemies doesn't go faster as they go down, but the speed increases with the level.
The player can shoot with the up arrow, but that's not really convenient. If you had any better idea...Also, I've never tried it on a calc. I don't have any CX and I use the OS 2.0.1 on my clickpad. If you could try it on your calc (and post your hi-score !)
Thank you,Chockosta (Loic Pujet)
for i=1,21,1 do if aliensY>0 then aliensY=aliensY+25 end end
function on.charIn(ch) if ch=="r" then game="notfinished" score=0 player=100 shotX=0 shotY=0 wait=0.04 aliensDir="right" down="no" aliensX={} aliensY={} shotsX={} shotsY={} lives=3 for i=1,21,1 do aliensX[i]=(i-1)%7*31+1 aliensY[i]=math.floor((i-1)/7)*25+10 shotsX[i]=aliensX[i] shotsY[i]=200 end endendon.charIn("r")function on.arrowLeft() if player>0 then player=player-10 endendfunction on.arrowRight() if player<290 then player=player+10 endendfunction on.arrowUp() if shotY<=0 then shotY=195 shotX=player+13 endendfunction on.paint(gc) gc:setColorRGB(0,0,0) gc:setPen("thin","smooth") gc:setFont("sansserif","r",8) gc:drawString("Lua Alien Invaders - Par Loic Pujet",10,200,"top") if game=="notfinished" then gc:setColorRGB(200,0,0) for i=1,21,1 do if aliensY[i]~=0 then gc:drawArc(aliensX[i]+4,aliensY[i]-9,10,10,0,360) gc:fillArc(aliensX[i]-5,aliensY[i]-4,28,8,0,360) end end gc:setColorRGB(0,0,200) for i=1,21,1 do if shotsY[i]<200 then gc:fillRect(shotsX[i],shotsY[i],2,5) end end if shotY>0 then gc:fillRect(shotX,shotY,4,6) end gc:setColorRGB(100,0,255) gc:fillRect(player,195,30,10) gc:fillRect(player+13,191,4,4) gc:setFont("sansserif","r",10) gc:drawString("vies:"..tostring(lives).." score:"..tostring(score),0,0,"top") else gc:setColorRGB(0,0,0) gc:setFont("sansserif","b",15) gc:drawString("Score : "..tostring(score),100,50, "top") gc:setColorRGB(0,0,255) gc:drawString("Appuyez sur R pour rejouer",50,150,"top") end timer.start(wait)endfunction on.timer() timer.stop() if game=="notfinished" then if aliensDir=="right" then for i=1,21,1 do if aliensY[i]>0 then aliensX[i]=aliensX[i]+1 end end else for i=1,21,1 do if aliensY[i]>0 then aliensX[i]=aliensX[i]-1 end end end if aliensDir=="right" then for i=1,21,1 do if aliensX[i]>305 then down="yes" end end else for i=1,21,1 do if aliensX[i]<15 then down="yes" end end end if down=="yes" then down="no" for i=1,21,1 do if aliensY[i]>0 then aliensY[i]=aliensY[i]+25 end end if aliensDir=="left" then aliensDir="right" else aliensDir="left" end end for i=1,21,1 do if aliensY[i]>200 then game="finished" end end for i=1,21,1 do if shotsY[i]>=200 and aliensY[i]~=0 then if math.random(1,100)==5 then shotsY[i]=aliensY[i]+math.random(1,10) shotsX[i]=aliensX[i] end else shotsY[i]=shotsY[i]+3 end end if shotY>=0 then shotY=shotY-5 end for i=1,21,1 do if shotsY[i]<200 then if shotsY[i]>195 and shotsX[i]>player and shotsX[i]<player+30 then lives=lives-1 shotsY[i]=200 end end end if lives==0 then game="finished" end if shotY>0 then for i=1,21,1 do if shotY>0 and shotY>aliensY[i]-5 and shotY<aliensY[i]+5 and shotX>aliensX[i]-15 and shotX<aliensX[i]+15 then aliensY[i]=0 aliensX[i]=100 shotY=0 score=score+1 end end end wintest=0 for i=1,21,1 do wintest=wintest+aliensY[i] end if wintest==0 then if wait>0.02 then wait=wait-0.005 end aliensDir="right" down="no" for i=1,21,1 do aliensX[i]=(i-1)%7*31+1 aliensY[i]=math.floor((i-1)/7)*25+10 shotsX[i]=aliensX[i] shotsY[i]=200 end end end platform.window:invalidate()endfunction on.arrowKey(key) platform.window:invalidate()end
I looked through some of your code, and I noticed a few things wrong with it:- unoptimized math commands. While it's not huge, using player+=10 is a lot better than player=player+10.- what's the deal with all of the for loops? I don't see the point in many of them.- you should chain if statements together more, it'll remove the need for much of the redundancies and might even half your code size.- why do you assign different functions to keys instead of just making a checkKeys() function or just putting all checks inline? Or are you overriding previously existing functions provided by an NLua module?
Quote from: Ashbad on June 03, 2011, 03:38:54 pmI looked through some of your code, and I noticed a few things wrong with it:- unoptimized math commands. While it's not huge, using player+=10 is a lot better than player=player+10.- what's the deal with all of the for loops? I don't see the point in many of them.- you should chain if statements together more, it'll remove the need for much of the redundancies and might even half your code size.- why do you assign different functions to keys instead of just making a checkKeys() function or just putting all checks inline? Or are you overriding previously existing functions provided by an NLua module?I just started in LUA...The '+=' works ? Omg I was fed up with all the 'player=player+10'I will check all the other things tomorrow...
function on.charIn(ch) if ch=="r" then game="notfinished" score=0 player=100 shotX=0 shotY=0 wait=0.04 aliensDir="right" down="no" aliensX={} aliensY={} shotsX={} shotsY={} lives=3 for i=1,21,1 do aliensX=(i-1)%7*31+1 aliensY=math.floor((i-1)/7)*25+10 shotsX=aliensX shotsY=200 end endendon.charIn("r")function on.arrowLeft() if player>0 then player=player-10 endendfunction on.arrowRight() if player<290 then player=player+10 endendfunction on.arrowUp() if shotY<=0 then shotY=195 shotX=player+13 endendfunction on.paint(gc) gc:setColorRGB(0,0,0) gc:setPen("thin","smooth") gc:setFont("sansserif","r",8) gc:drawString("Lua Alien Invaders - Par Loic Pujet",10,200,"top") if game=="notfinished" then gc:setColorRGB(200,0,0) if aliensY~=0 then gc:drawArc(aliensX+4,aliensY-9,10,10,0,360) gc:fillArc(aliensX-5,aliensY-4,28,8,0,360) end gc:setColorRGB(0,0,200) if shotsY<200 then gc:fillRect(shotsX,shotsY,2,5) end if shotY>0 then gc:fillRect(shotX,shotY,4,6) end gc:setColorRGB(100,0,255) gc:fillRect(player,195,30,10) gc:fillRect(player+13,191,4,4) gc:setFont("sansserif","r",10) gc:drawString("vies:"..tostring(lives).." score:"..tostring(score),0,0,"top") else gc:setColorRGB(0,0,0) gc:setFont("sansserif","b",15) gc:drawString("Score : "..tostring(score),100,50, "top") gc:setColorRGB(0,0,255) gc:drawString("Appuyez sur R pour rejouer",50,150,"top") end timer.start(wait)endfunction on.timer() timer.stop() if game=="notfinished" then if aliensDir=="right" then if aliensY>0 then aliensX+=1 end else if aliensY>0 then aliensX-=1 end end if aliensDir=="right" then if aliensX>305 then down="yes" end else if aliensX<15 then down="yes" end end if down=="yes" then down="no" if aliensY>0 then aliensY+=25 end if aliensDir=="left" then aliensDir="right" else aliensDir="left" end end if aliensY>200 then game="finished" end if shotsY>=200 and aliensY~=0 then if math.random(1,100)==5 then shotsY=aliensY+math.random(1,10) shotsX=aliensX end else shotsY+=3 end if shotY>=0 then shotY-=5 end if shotsY<200 then if shotsY>195 and shotsX>player and shotsX<player+30 then lives-=1 shotsY=200 end end if lives==0 then game="finished" end if shotY>0 then if shotY>0 and shotY>aliensY-5 and shotY<aliensY+5 and shotX>aliensX-15 and shotX<aliensX+15 then aliensY=0 aliensX=100 shotY=0 score+=1 end end wintest=0 wintest=wintest+aliensY if wintest==0 then if wait>0.02 then wait-=0.005 end aliensDir="right" down="no" for i=1,21,1 do aliensX=(i-1)%7*31+1 aliensY=math.floor((i-1)/7)*25+10 shotsX=aliensX shotsY=200 end end endfunction on.arrowKey(key) platform.window:invalidate()end
function on.charIn(ch) if ch=="r" then game="notfinished" score=0 player=100 shotX=0;shotY=0 wait=0.04 aliensDir="right" down="no" aliensXY={} shotsXY={} lives=3 for i=1,21,2 do aliensXY[i]=(math.ceil(i/2)-1)%7*31+1 aliensXY[i+1]=math.floor((math.ceil(i+1/2)-1)/7)*25+10 shotsXY[i]=aliensX[i] shotsXY[i+1]=200 end endendon.charIn("r")function on.arrowLeft() if player~=0 then player-=10 endendfunction on.arrowRight() if player<290 then player+=10 endendfunction on.arrowUp() if shotY <= 0 then shotY=195 shotX+=13 endendfunction on.paint(gc) gc:setColorRGB(0,0,0) gc:setPen("thin","smooth") gc:setFont("sansserif","r",8) gc:drawString("Lua Alien Invaders - Par Loic Pujet",10,200,"top") if game=="notfinished" then gc:setColorRGB(200,0,0) for i=1,21,2 do if aliensXY[i+1]~=0 then gc:drawArc(aliensXY[i]+4,aliensXY[i+1]-9,10,10,0,360) gc:fillArc(aliensXY[i]-5,aliensXY[i+1]-4,28,8,0,360) end end gc:setColorRGB(0,0,200) for i=1,21,2 do if shotsXY[i+1]<200 then gc:fillRect(shotsXY[i],shotsxY[i+1],2,5) end end if shotY>0 then gc:fillRect(shotX,shotY,4,6) end gc:setColorRGB(100,0,255) gc:fillRect(player,195,30,10) gc:fillRect(player+13,191,4,4) gc:setFont("sansserif","r",10) gc:drawString("vies:"..tostring(lives).." score:"..tostring(score),0,0,"top") else gc:setColorRGB(0,0,0) gc:setFont("sansserif","b",15) gc:drawString("Score : "..tostring(score),100,50, "top") gc:setColorRGB(0,0,255) gc:drawString("Appuyez sur R pour rejouer",50,150,"top") end timer.start(wait)endfunction on.timer() timer.stop() if game=="notfinished" then if aliensDir=="right" then for i=1,21,2 do if aliensXY[i+1]>0 then aliensXY[i]+=1 end end else for i=1,21,2 do if aliensXY[i+1]>0 then aliensXY[i]-=1 end end end if aliensDir=="right" then for i=1,21,2 do if aliensXY[i]>305 then down="yes" end end else for i=1,21,2 do if aliensXY[i]<15 then down="yes" end end end if down=="yes" then down="no" for i=1,21,2 do if aliensXY[i+1]>0 then aliensXY[i+1]+=25 end end if aliensDir=="left" then aliensDir="right" else aliensDir="left" end end for i=1,21,2 do if aliensXY[i+1]>200 then game="finished" end end for i=1,21,2 do if shotsXY[i+1]>=200 and aliensXY[i+1]~=0 then if math.random(1,100)==5 then shotsXY[i+1]=aliensXY[i+1]+math.random(1,10) shotsXY[i]=aliensXY[i] end else shotsXY[i+1]+=3 end end if shotY>=0 then shotY-=5 end for i=1,21,2 do if shotsXY[i+]<200 then if shotsXY[i+1]>195 and shotsXY[i]>player and shotsXY[i]<player+30 then lives-=1 shotsXY[i+1]=200 end end end if lives==0 then game="finished" end if shotY ~= 0 then for i=1,21,2 do if shotY~=0 and shotY>aliensXY[i+1]-5 and shotY<aliensXY[i+1]+5 and shotX>aliensXY[i]-15 and shotX<aliensXY[i]+15 then aliensXY[i+1]=0 aliensXY[i]=100 shotY=0 score+=1 end end end wintest=0 for i=1,21,2 do wintest+=aliensXY[i+1] end if wintest==0 and if wait>0.02 then wait-=0.005 end aliensDir="right" down="no" for i=1,21,2 do aliensXY[i]=(math.ceil(i/2)-1)%7*31+1 aliensXY[i+1]=math.floor((math.ceil(i+1/2)-1)/7)*25+10 shotsXY[i]=aliensX[i] shotsXY[i+1]=200 end end end platform.window:invalidate()endfunction on.arrowKey(key) platform.window:invalidate()end
Most double math commands like +=, -=, and the like usually work in lua, with exceptions of a few good ones like ++, --, and depending on the platform and what version was ported, the bitwise shifting ops.