local rect = graydraw.rect function garageDoor(x, y, width, height, position, panelHeight) rect(x, y, x + width, y - height, 4, 0) --draw garage outine for i = y + height - position, y, panelHeight do rect(x, i - panelHeight, x + width, i, 4, 0) if i <= y then i = panelHeight1 break end end rect(x, y, x + width, y - panelHeight1, 4, 0) --draw first panel end garageDoor(1, 1, 30, 30, 5, 6)
Code Causes A Reboot Screen
#1
Posted 25 May 2012 - 04:24 PM
#2
Posted 25 May 2012 - 05:42 PM
when reading my code, I see I forgot to test we are in the gray mode in this function (I didn't forgot it in the other functions)
Then you are writing in gray buffers, without beeing in gray mode....
#3
Posted 25 May 2012 - 07:27 PM
Also, I like how you made it so it doesn't reboot after a program executes.
#4
Posted 26 May 2012 - 05:39 AM
#5
Posted 27 May 2012 - 03:38 PM
#6
Posted 29 May 2012 - 08:10 PM
local rect = graydraw.rect local setColor = graydraw.setcolor function main() setColor(1) garageDoor(1, 1, 30, 30, 5, 6) end function garageDoor(x, y, width, height, position, panelHeight) rect(x, y, x + width, y - height, 4, 0) --draw garage outine for i = y + height - position, y, panelHeight do rect(x, i - panelHeight, x + width, i, 4, 0) if i <= y then panelHeight1 = i break end end rect(x, y, x + width, y - panelHeight1, 4, 0) --draw first panel end main()
Error:
22: Attempt to perform arithmetic operation on 'panelHeight1' (a nil value)
Am I doing something wrong? Should line 16 be changed?
#7
Posted 30 May 2012 - 01:49 PM
for i = y + height - position, y, panelHeight do
with your values, height-position = 25,
then y + height-position > y
=> i>y, then you never define panelHeight1 (by default a value not defined is set to nil)
Moreover, since y + height-position > y and panelHeight>0, the for loop never executes
two reasons that explains why panelHeight1 is not defined
Moreover, I don't understant why you launch a for loop that will break when i <= y
#8
Posted 30 May 2012 - 02:41 PM
The reason I have a loop that breaks when i<=y is that it starts at a value larger than I want it to end at.
My program is supposed to draw a paneled garage door that can open and close.
x and y in the garage door function display the garage door at x, y.
width and height are the garage's width and height.
position is how much open space there is between the bottom panel and the bottom of the garage in pixels.
panelHeight is how large the panels should be.
So...
The way I am trying to get it to work is it draws all the panels that are fully visible. The top panel may not be fully visible because it is going up into the garage.
The for loop draws the visible panels.
I am trying to figure out how to draw the very top panel. I need to find out how tall it should be and I was using panelHeight1 to do that.
#9
Posted 30 May 2012 - 02:48 PM
for i = y + height - position, y, -panelHeight do
#10
Posted 30 May 2012 - 03:02 PM
#11
Posted 01 June 2012 - 02:48 PM
Code:
local rect = graydraw.rect local setColor = graydraw.setcolor local wait = misc.wait local line = graydraw.line screenWidth = 128 screenHeight = 64 key_left = 37 key_right = 40 key_exit = 36 gDoorPosition = {0,0,0} gDoorActive = 1 function main() setColor(1) menu() end function menu() while not key(key_exit) do if key(key_left) then gDoorActive = gDoorActive - 1 end if key(key_right) then gDoorActive = gDoorActive + 1 end if gDoorActive < 1 then gDoorActive = 1 end if gDoorActive > 3 then gDoorActive = 3 end for i = 1, 3, 1 do if i == gDoorActive and gDoorPosition[i] < 30 then gDoorPosition[i] = gDoorPosition[i] + 1 elseif gDoorPosition[i] > 0 then gDoorPosition[i] = gDoorPosition[i] - 1 end end for ix = 1, 3, 1 do garageDoor(ix * 20 + 5, y, 20, 30, gDoorPosition[ix], 5) end refresh end end function garageDoor(x, y, width, height, position, panelHeight) rect(x, y, x + width, y + height, 4, 4) --draw garage outine rect(x, y, x + width, y + height - position, 4, 0) --draw door --draw panels for iy = height - position, 0, -panelHeight do line(x, y + iy, x + width, y + iy, 4) end end main()
Error:
:42: Attempt to perform arithmetic on local 'y' (a nil value)
EDIT:
Never mind, fixed code.
#12
Posted 05 June 2012 - 12:39 PM
:151: attempt to perform operation on field '?' (a nil value)
Here is the code on line 151:
buffer = ai.y[i] - player.y
It was working just before I saved the file. Here is the whole file:
local rect = graydraw.rect local setColor = graydraw.setcolor local wait = misc.wait local line = graydraw.line local graytext = graydraw.text local fill = graydraw.fill local pixel = graydraw.pixel local random = misc.random car = {height = 8, width = 8, sprite = "\000\000<((f^fz(<V<(jvNnr8<V\000"} screenWidth = 128 screenHeight = 64 ai = {x = {}, y = {}, speed = {}, topspeed = {}, number = 5} continue = 0 done = 0 gDoorPosition = {0,0,0} gDoorText = {"Play", "Optn", "Help"} gDoorActive = 1 i = 0 invert = 0 Key = 0 key_alpha = 33 key_left = 37 key_right = 40 key_down = 38 key_up = 39 key_exit = 36 key_shift = 41 player = {x = 0, y = 0, speed = 0, topspeed = 6} function main() setColor(1) menu() end function menu() clear nil while done ~= 1 do if key(key_left) then gDoorActive = gDoorActive - 1 wait(3) end if key(key_right) then gDoorActive = gDoorActive + 1 wait(3) end if key(key_exit) then done = 1 end if key(key_shift) then selection = gDoorActive continue = 1 end if gDoorActive < 1 then gDoorActive = 1 end if gDoorActive > 3 then gDoorActive = 3 end if selection == 1 then play() elseif selection == 2 then optn() elseif selection == 3 then help() end selection = 0 for i = 1, 3, 1 do if i == gDoorActive and gDoorPosition[i] < 30 then gDoorPosition[i] = gDoorPosition[i] + 1 elseif gDoorPosition[i] > 0 then gDoorPosition[i] = gDoorPosition[i] - 1 end end for ix = 1, 3, 1 do garageDoor(ix * 35 - 20, 25, 30, 30, gDoorPosition[ix], 5, gDoorText[ix], 5) end refresh2() wait(1) end continue = 0 end function garageDoor(x, y, width, height, position, panelHeight, text, margin) buffer = height/2 graytext(x + margin, y + buffer, text) --display text rect(x, y, x + width, y + height, 5, 5) --draw garage rect(x, y, x + width, y + height - position, 4, 0) --draw door --draw panels for iy = height - position, 0, -panelHeight do line(x, y + iy, x + width, y + iy, 4) end end function play() clear nil var = 0 iy = 0 for i=1, ai.number, 1 do --if i * 8 + 1 < 32 then ai.y[i] = 0 else ai.y[i] = ai.y[i] + 1 end ai.x[i] = 9+i*8+1 ai.speed[i] = 5 ai.topspeed[i] = 6 end player.y = 0 --[[-- graytext(5, 5, "Please Wait...") refresh2() clear nil for iy=1, screenHeight, 1 do for ix = 1, screenWidth, 1 do if i == 1 then pixel(ix, iy, 4) i = 0 else i = i + 1 end end if i==0 then i = 1 else i = 0 end end --]]-- line(42, 0, 42, 64, 4) line(84, 0, 84, 64, 4) refresh2() --game loop while not key(key_exit) do rect(43, 0, 83, 64, 0, 0) --clears only the road if key(key_left) and player.x > 0 then player.x = player.x - 1 elseif key(key_right) and player.x < 40 - car.width + 1 then player.x = player.x + 1 elseif key(key_shift) then player.speed = player.speed + 1 elseif key(key_alpha) then player.speed = player.speed - 1 end if player.speed > player.topspeed then player.speed = player.topspeed elseif player.speed < 0 then player.speed = 0 end aiRace() spritexy player.x + 43, screenHeight - car.height, car.sprite player.y = player.y + player.speed refresh2() wait(3) end waitKey(key_exit) clear nil end function aiRace() for i=1, ai.number, 1 do buffer = ai.y[i] - player.y spritexy ai.x[i] + 43, screenHeight - car.height - buffer, car.sprite ai.y[i] = ai.y[i] + ai.speed[i] end end function optn() clear nil graytext(1, 1, "Options Menu") refresh2() waitKey(key_exit) clear nil end function help() clear nil graytext(1, 1, "How may I help you?") refresh2() waitKey(key_exit) clear nil end function bye() clear nil graytext(1, 1, "Bye!") refresh2() wait(100) end function waitKey(Key) while not key(Key) do wait(3) end wait(3) end function refresh2() --if invert == 1 then rect(0, 0, screenWidth, screenHeight) end if invert == 1 then fill(5) end refresh end main()
#13
Posted 05 June 2012 - 03:34 PM
#14
Posted 10 June 2012 - 12:42 AM
Error:
186: Attempt to index field speed (a number value)
Line 186:
ai.y[i] = ai.y[i] + ai.speed[i]
ai.speed[i] is given a value here (line 99):
if i == 1 then ai.speed[i] = ai.topspeed[i] else ai.speed = 1 + random(ai.topspeed[i]) end
Complete code:
Pastebin
Raw:
local rect = graydraw.rect local setColor = graydraw.setcolor local wait = misc.wait local line = graydraw.line local graytext = graydraw.text local fill = graydraw.fill local pixel = graydraw.pixel local random = misc.random car = {height = 8, width = 8, sprite = "\000\000<((f^fz(<V<(jvNnr8<V\000"} screenWidth = 128 screenHeight = 64 ai = {x = {}, y = {}, speed = {}, topspeed = {}, number = 3} continue = 0 done = 0 gDoorPosition = {0,0,0} gDoorText = {"Play", "Optn", "Help"} gDoorActive = 1 i = 0 invert = 0 Key = 0 key_alpha = 33 key_left = 37 key_right = 40 key_down = 38 key_up = 39 key_exit = 36 key_shift = 41 player = {x = 0, y = 0, speed = 0, topspeed = 6} function main() setColor(1) menu() end function menu() clear nil while done ~= 1 do if key(key_left) then gDoorActive = gDoorActive - 1 wait(3) end if key(key_right) then gDoorActive = gDoorActive + 1 wait(3) end if key(key_exit) then done = 1 end if key(key_shift) then selection = gDoorActive continue = 1 end if gDoorActive < 1 then gDoorActive = 1 end if gDoorActive > 3 then gDoorActive = 3 end if selection == 1 then play() elseif selection == 2 then optn() elseif selection == 3 then help() end selection = 0 for i = 1, 3, 1 do if i == gDoorActive and gDoorPosition[i] < 30 then gDoorPosition[i] = gDoorPosition[i] + 1 elseif gDoorPosition[i] > 0 then gDoorPosition[i] = gDoorPosition[i] - 1 end end for ix = 1, 3, 1 do garageDoor(ix * 35 - 20, 25, 30, 30, gDoorPosition[ix], 5, gDoorText[ix], 5) end refresh2() wait(1) end continue = 0 end function garageDoor(x, y, width, height, position, panelHeight, text, margin) buffer = height/2 graytext(x + margin, y + buffer, text) --display text rect(x, y, x + width, y + height, 5, 5) --draw garage rect(x, y, x + width, y + height - position, 4, 0) --draw door --draw panels for iy = height - position, 0, -panelHeight do line(x, y + iy, x + width, y + iy, 4) end end function play() clear nil var = 0 iy = 0 for i=1, ai.number, 1 do ai.y[i] = 0 ai.x[i] = i*8+1 ai.topspeed[i] = 6 if i == 1 then ai.speed[i] = ai.topspeed[i] else ai.speed = 1 + random(ai.topspeed[i]) end end player.y = 0 --[[-- graytext(5, 5, "Please Wait...") refresh2() clear nil for iy=1, screenHeight, 1 do for ix = 1, screenWidth, 1 do if i == 1 then pixel(ix, iy, 4) i = 0 else i = i + 1 end end if i==0 then i = 1 else i = 0 end end --]]-- line(42, 0, 42, 64, 4) line(84, 0, 84, 64, 4) refresh2() --game loop while not key(key_exit) do rect(43, 0, 83, 64, 0, 0) --clears only the road if key(key_left) and player.x > 0 then player.x = player.x - 1 elseif key(key_right) and player.x < 40 - car.width + 1 then player.x = player.x + 1 elseif key(key_shift) then player.speed = player.speed + 1 elseif key(key_alpha) then player.speed = player.speed - 1 end if player.speed > player.topspeed then player.speed = player.topspeed elseif player.speed < 0 then player.speed = 0 end aiRace() spritexy player.x + 43, screenHeight - car.height, car.sprite player.y = player.y + player.speed refresh2() end waitKey(key_exit) clear nil end function aiRace() for i=1, ai.number, 1 do --ai and collisions with ai for j=1, ai.number do --if car i is not the same as car j if i~=j then --if car j is in front or behind car i if ai.x[j] > ai.x[i] - 16 and ai.x[j] < ai.x[i] + 16 then --if car j is in front if ai.y[j] > ai.y[i] and ai.y[j] < ai.y[i] + 16 then if ai.speed[i] > 0 then ai.speed[i] = ai.speed[i] - 1 else ai.x[i] = ai.x[i] + 1 end end --if car j is behind if ai.y[j] < ai.y[i] and ai.y[j] > ai.y[i] - 16 then if ai.speed[i] < ai.topspeed[i] then ai.speed[i] = ai.speed[i] + 1 else ai.x[i] = ai.x - 1 end end end --if car j is left or right of car i if ai.y[j] > ai.y[i] - 16 and ai.y[j] < ai.y[i] + 16 then --if car j is to the right if ai.x[j] > ai.x[i] and ai.x[j] < ai.x[i] + 16 then --if the car i is not against the left wall if ai.x[i] > 0 then ai.x[i] = ai.x[i] - 1 elseif ai.speed > 0 then ai.speed[i] = ai.speed[i] - 1 end end --if car j is to the left if ai.x[j] < ai.x[i] and ai.x[j] > ai.x[i] - 16 then --if car i is not against right wall if ai.x[i] < 40 then ai.x[i] = ai.x[i] + 1 elseif ai.speed > 0 then ai.speed[i] = ai.speed[i] - 1 end end end end end --collisions with player if ai.y[i] > player.y and ai.y[i] < player.y + 8 and ai.x[i] > player.x and ai.x[i] < player.x + 8 then crash() end --display buffer = ai.y[i] - player.y spritexy ai.x[i] + 43, screenHeight - car.height - buffer, car.sprite ai.y[i] = ai.y[i] + ai.speed[i] end end function crash() clear nil graytext(1, 1, "You Died!") refresh2() wait(100) menu() end function optn() clear nil graytext(1, 1, "Options Menu") refresh2() waitKey(key_exit) clear nil end function help() clear nil graytext(1, 1, "How may I help you?") refresh2() waitKey(key_exit) clear nil end function bye() clear nil graytext(1, 1, "Bye!") refresh2() wait(100) end function waitKey(Key) while not key(Key) do wait(3) end wait(3) end function refresh2() --if invert == 1 then rect(0, 0, screenWidth, screenHeight) end if invert == 1 then fill(5) end refresh end main()
#15
Posted 10 June 2012 - 12:25 PM
In your line 99, there is a mistake in the 'else ...' : ai.speed is considerer not as a table, but as a number.
1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users