How to repeat an image like css in lua? - lua

https://gyazo.com/d0d0bab65c0a7060972988a5e73c7959
That was achieved by the this:
local x = script.Parent.Smile
local y = script.Parent.Smile2
while true do
x:TweenPosition(UDim2.new(0, 0, 1, 0))
y:TweenPosition(UDim2.new(0, 0, 1, 0))
wait(.1)
x.Position = y.Position + UDim2.new(0, 0, -1, 0)
y.Position = UDim2.new(0, 0, 0, 0)
end
I was wondering if there was a better way to do it and make it smoother(slower)?

If you want it to look as if it endlessly descends, try adding a "Linear" parameter to your tweens. It will keep the tween constant in speed. For example:
local x = script.Parent.Smile
local y = script.Parent.Smile2
while true do
x:TweenPosition(UDim2.new(0, 0, 1, 0),"Out","Linear",0.1)
y:TweenPosition(UDim2.new(0, 0, 1, 0),"Out","Linear",0.1)
wait(.105) -- making sure to tween again after 0.1 seconds, the 0.105 safely accounts for any latency in the game
x.Position = y.Position + UDim2.new(0, 0, -1, 0)
y.Position = UDim2.new(0, 0, 0, 0)
end
Try that script above, if it doesn't work you can blame me for it

Related

keyboard keyisdown is not activating

I am trying to make my paddle move up and down when I press the d and a buttons.
When i press the d and a buttons nothing happens at all... they just sit there.....
anyway the code is below if you know please tell me. thanks
I am aware the indenting is wrong i had to change if for this post:)
window_width = 580
window_height = 420
playerScore = 0
enemyScore = 0
pSpeed = 200
player1Y = 100
player2Y = -20
function love.load()
love.window.setMode(window_width, window_height)
end
function love.draw()
love.graphics.printf('hello pong', 0, window_height / 2 - 6, window_width, 'center')
love.graphics.rectangle("fill", 500, player1Y , 10, 50)
love.graphics.rectangle("fill", 40, 220, 10, 50)
love.graphics.rectangle("fill", 100, 230, 7, 5)
end
function update(dt)
if love.keyboard.isDown('d') then
player1Y = player1Y + pSpeed * dt
elseif love.keyboard.isDown('a') then
player1Y = player1Y + -pSpeed * dt
end
end
Try pSpeed = 10 instead of 200, so your rectangles aren't jumping beyond window_height in 2 steps.
And change colors for each rectangle, so it's easier to see what's happening.
function love.draw()
love.graphics.setColor( 0, 0, 0 ) -- black
love.graphics.printf( 'hello pong', 0, window_height /2 -6, window_width, 'center' )
love.graphics.setColor( 1, 0, 0 ) -- red
love.graphics.rectangle( "fill", 500, player1Y, 10, 50 )
love.graphics.setColor( 0, 1, 0 ) -- green
love.graphics.rectangle( "fill", 40, 220, 10, 50 )
love.graphics.setColor( 0, 0, 1 ) -- blue
love.graphics.rectangle( "fill", 100, 230, 7, 5 )
end
I think you should write "love.update(dt)" instead of writing only "update(dt)". I tried changing that and it worked! Also, indenting does not affect the way your code works in Lua, but it does massively improve readability.

Love2d / LUA grid locked movement NO DIAGONAL

I thought this would be a common problem but after days of research I can't find a solution. Very new to programming in general and LUA specifically. I'm building a SUPAPLEX clone as a CS50 personal project: the character moves along the grid based map and there's a code that everyone seems to suggest (attached). On release of arrow buttons the movement is continued until the end of a tile, smoothly. But if 2 movement buttons are pushed, it causes brief diagonal movement and that's the problem I'm unsuccessfully trying to solve.
Basically I'm trying to either ignore any input until the movement of the sprite is finished at the end of the grid tile or prevent updating until movement in one direction is complete. Seems like a simple thing but I'm about to give up this whole thing. Frustrating. Any input is hiiiighly appreciated and I'm sure this would be a lot of help for very many people...
function love.load()
love.keyboard.setKeyRepeat(true)
player = {
grid_x = 256,
grid_y = 256,
act_x = 256,
act_y = 256,
speed = 5,
}
map = {
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
{ 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1 },
{ 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
}
function testMap(x, y)
if map[(player.grid_y / 32) + y][(player.grid_x / 32) + x] == 1 then
return false
end
return true
end
function love.keypressed(key)
if key == "up" then
player.grid_y = player.grid_y - 32
elseif key == "down" then
player.grid_y = player.grid_y + 32
elseif key == "left" then
player.grid_x = player.grid_x - 32
elseif key == "right" then
player.grid_x = player.grid_x + 32
end
end
end
function love.update(dt)
player.act_y = player.act_y - ((player.act_y - player.grid_y) * player.speed * dt)
player.act_x = player.act_x - ((player.act_x - player.grid_x) * player.speed * dt)
end
function love.draw()
love.graphics.rectangle("fill", player.act_x, player.act_y, 32, 32)
for y=1, #map do
for x=1, #map[y] do
if map[y][x] == 1 then
love.graphics.rectangle("line", x * 32, y * 32, 32, 32)
end
end
end
end
you're trying to get it to only walk along grid-lines?
take out love.keyboard.setKeyRepeat(true)
and don't use love.keypressed(key)
that's for one-at-a-time keypresses, and it would be hard to use that
with love.keyreleased() to see if all the other keys are released.
use isDown instead, and if one of them isDown, then none of the other dir keys allow input. (along with the couple player.act lines you already have in your update)
player = {
grid_x = 256,
grid_y = 256,
act_x = 256,
act_y = 256,
speed = 5,
dir = ''
}
function love.update(dt)
if love.keyboard.isDown("up", "down", "left", "right") then
if love.keyboard.isDown("up") and ( player.dir == 'up' or player.dir == '' ) then
player.dir = 'up' -- only go up if currently held, or no other dir key being pressed
player.grid_y = player.grid_y - 32
elseif love.keyboard.isDown("down") and ( player.dir == 'down' or player.dir == '' ) then
player.dir = 'down' -- only go down if currently held...
player.grid_y = player.grid_y + 32
elseif key == "left" and ( player.dir == 'left' or player.dir == '' ) then
player.dir = 'left'
player.grid_x = player.grid_x - 32
elseif key == "right" and ( player.dir == 'right' or player.dir == '' ) then
player.dir = 'right'
player.grid_x = player.grid_x + 32
end
else -- none of those keys are being pressed, so player is idle
player.dir = ''
end -- isDown()
player.act_y = player.act_y - ((player.act_y - player.grid_y) * player.speed * dt)
player.act_x = player.act_x - ((player.act_x - player.grid_x) * player.speed * dt)
end -- update()

Lua Error: Main.lua:131: attempt to index local ‘up’ (a nil value) stack traceback:

I've a game project due in the next month(simple maze game) but I keep running into this error. I'd really appreciate it if someone took a look at it. I'm new to Lua so it's probably very simple. The error seems to be originating around line 131. I've put line 131 between a load of stars (*****...). You'd make my day if you took a few minutes to look at it. :) The error is : Main.lua:131: attempt to index local ‘up’ (a nil value) stack traceback:
local screenWidth = display.contentWidth
local screenHeight = display.contentHeight
local controllerWidth = screenWidth / 6
local rightMargin = 30
local maze = {
{ 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1 },
{ 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1 },
{ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
}
maze.rows = table.getn(maze)
maze.columns = table.getn(maze[1])
maze.xStart, maze.yStart = 1, 1
maze.xFinish, maze.yFinish = 24, 7
local grid = {}
grid.xSquares = maze.columns
grid.ySquares = maze.rows
grid.totalWidth = screenWidth - controllerWidth - rightMargin
grid.squareSize = grid.totalWidth / grid.xSquares
grid.xStart = controllerWidth
grid.yStart = 60
grid.displayGroup = display.newGroup()
grid.displayGroup.x = grid.xStart
grid.displayGroup.y = grid.yStart
grid.functions = {
left = function(gridSquare)
if gridSquare.x == 0 then
return gridSquare
else
return grid[gridSquare.y][gridSquare.x - 1]
end
end,
right = function(gridSquare)
if gridSquare.x + 1 == grid.xSquares then
return gridSquare
else
return grid[gridSquare.y][gridSquare.x + 1]
end
end,
above = function(gridSquare)
if gridSquare.y == 0 then
return gridSquare
else
return grid[gridSquare.y - 1][gridSquare.x]
end
end,
below = function(gridSquare)
if gridSquare.y + 1 == grid.ySquares then
return gridSquare
else
return grid[gridSquare.y + 1][gridSquare.x]
end
end,
}
for y = 0, grid.ySquares - 1 do
grid[y] = {y = y}
for x = 0, grid.xSquares - 1 do
grid[y][x] = {x = x, y = y}
local rect = display.newRect(grid.displayGroup,
grid.squareSize * x, grid.squareSize * y,
grid.squareSize, grid.squareSize)
if maze[y + 1][x + 1] == 0 then
rect:setFillColor(245, 215, 98)
else
grid[y][x].wall = true
rect:setFillColor(32, 96, 32, 255)
end
grid[y][x].displayObject = rect
grid[y][x].left = grid.functions.left
grid[y][x].right = grid.functions.right
grid[y][x].above = grid.functions.above
grid[y][x].below = grid.functions.below
end
end
grid[maze.yStart - 1][maze.xStart - 1].start = true
grid[maze.yStart - 1][maze.xStart - 1].displayObject:setFillColor(192, 192, 255)
grid[maze.yFinish - 1][maze.xFinish - 1].displayObject:setFillColor(192, 128, 128)
grid[maze.yStart - 1][maze.xStart - 1].start = true
grid[maze.yFinish - 1][maze.xFinish - 1].finish = true
local runner = { image = "runner.png" }
function runner:enter(gridSquare)
if self.displayObject == nil then
self.displayObject = display.newImageRect(grid.displayGroup,
self.image, grid.squareSize, grid.squareSize)
self.displayObject:setFillColor(92, 92, 92)
end
self.displayObject.x = gridSquare.displayObject.x
self.displayObject.y = gridSquare.displayObject.y
self.gridSquare = gridSquare
self.x = gridSquare.x
self.y = gridSquare.y
if self.gridSquare.finish then
finish()
end
end
function runner:canEnter(gridSquare)
return gridSquare.wall == nil
end
local controlCenterX = controllerWidth / 2
local controlCenterY = screenHeight - screenHeight / 5
local controlCenterRadius = controllerWidth / 2 - rightMargin
local upDownWidth = 27
local upDownHeight = 60
local leftRightWidth = 60
local leftRightHeight = 27
local controls = {
up = {},
down = {},
right = {},
left = {},
}
controls.displayGroup = display.newGroup()
local circlePad = display.newCircle(controls.displayGroup,
controlCenterX, controlCenterY, controlCenterRadius)
circlePad:setFillColor(128, 128, 128)
******
local up = display.newImageRect(controls.displayGroup, "arrow_up.png",
upDownWidth, upDownHeight)
up.x = controlCenterX
up.y = controlCenterY - upDownHeight / 2
controls.up.displayObject = up
******
local down = display.newImageRect(controls.displayGroup, "arrow_down.png",
upDownWidth, upDownHeight)
down.x = controlCenterX
down.y = controlCenterY + upDownHeight / 2
controls.down.displayObject = down
local right = display.newImageRect(controls.displayGroup, "arrow_right.png",
leftRightWidth, leftRightHeight)
right.x = controlCenterX + leftRightWidth / 2
right.y = controlCenterY
controls.right.displayObject = right
local left = display.newImageRect(controls.displayGroup, "arrow_left.png",
leftRightWidth, leftRightHeight)
left.x = controlCenterX - leftRightWidth / 2
left.y = controlCenterY
controls.left.displayObject = left
controls.hide = function(controls)
controls.displayGroup.isVisible = false
end
controls.show = function(controls)
controls.displayGroup.isVisible = true
end
local function pressLeft(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:left()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
local function pressRight(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:right()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
local function pressUp(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:above()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
local function pressDown(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:below()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
controls.left.displayObject:addEventListener("touch", pressLeft)
controls.right.displayObject:addEventListener("touch", pressRight)
controls.up.displayObject:addEventListener("touch", pressUp)
controls.down.displayObject:addEventListener("touch", pressDown)
local startButton = {}
startButton.displayGroup = display.newGroup()
startButton.displayObject = display.newCircle(startButton.displayGroup,
controlCenterX, controlCenterY, controlCenterRadius)
startButton.displayObject.strokeWidth = 6
startButton.displayObject:setStrokeColor(244, 244, 64)
startButton.text = display.newText(startButton.displayGroup,
"Start", controlCenterX - controlCenterRadius + 20, controlCenterY - 18,
native.systemFont, 24)
startButton.text:setTextColor(0, 0, 0)
startButton.touch = function(event)
if event.phase == "began" then
startButton:hide()
start()
end
end
startButton.displayGroup:addEventListener("touch", startButton.touch)
startButton.show = function(button)
button.displayGroup.isVisible = true
end
startButton.hide = function(button)
button.displayGroup.isVisible = false
end
local playAgainButton = {}
playAgainButton.displayGroup = display.newGroup()
playAgainButton.displayObject = display.newCircle(playAgainButton.displayGroup,
controlCenterX, controlCenterY, controlCenterRadius)
playAgainButton.displayObject.strokeWidth = 6
playAgainButton.displayObject:setStrokeColor(244, 244, 64)
playAgainButton.text = display.newText(playAgainButton.displayGroup,
"Again", controlCenterX - controlCenterRadius + 20, controlCenterY - 18,
native.systemFont, 24)
playAgainButton.text:setTextColor(0, 0, 0)
playAgainButton.touch = function(event)
if event.phase == "began" then
playAgainButton:hide()
play()
end
end
playAgainButton.displayGroup:addEventListener("touch", playAgainButton.touch)
playAgainButton.show = startButton.show
playAgainButton.hide = startButton.hide
function play()
runner:enter(grid[maze.yStart - 1][maze.xStart - 1])
playAgainButton:hide()
controls:hide()
startButton:show()
end
function start()
controls:show()
end
function finish()
controls:hide()
playAgainButton:show()
end
play()

Attempt to index local ‘up’ (a nil value) (LUA)

Main.lua:131 attempt to index local ‘up’ (a nil value)
Hi Guys,
Hope you’re having a good day.
I appologise if the error I’ve made is really simple. I’m new to lua and am still figuring it out. If you have a few minutes to spare I’d really appreciate if you took a look at the code.
The error I’m getting is: Main.lua:131 attempt to index local ‘up’ (a nil value)
I’ve put line 131 and the line I believe to be causing the error in stars so you don’t have to count every line.
I don’t think controls.displayGroup has been initialized correctly but I’m not sure how to fix it.
local screenWidth = display.contentWidth
local screenHeight = display.contentHeight
local controllerWidth = screenWidth / 6
local rightMargin = 30
local maze = {
{ 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1 },
{ 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1 },
{ 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 },
{ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1 },
{ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 },
{ 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
}
maze.rows = table.getn(maze)
maze.columns = table.getn(maze[1])
maze.xStart, maze.yStart = 1, 1
maze.xFinish, maze.yFinish = 24, 7
local grid = {}
grid.xSquares = maze.columns
grid.ySquares = maze.rows
grid.totalWidth = screenWidth - controllerWidth - rightMargin
grid.squareSize = grid.totalWidth / grid.xSquares
grid.xStart = controllerWidth
grid.yStart = 60
grid.displayGroup = display.newGroup()
grid.displayGroup.x = grid.xStart
grid.displayGroup.y = grid.yStart
grid.functions = {
left = function(gridSquare)
if gridSquare.x == 0 then
return gridSquare
else
return grid[gridSquare.y][gridSquare.x - 1]
end
end,
right = function(gridSquare)
if gridSquare.x + 1 == grid.xSquares then
return gridSquare
else
return grid[gridSquare.y][gridSquare.x + 1]
end
end,
above = function(gridSquare)
if gridSquare.y == 0 then
return gridSquare
else
return grid[gridSquare.y - 1][gridSquare.x]
end
end,
below = function(gridSquare)
if gridSquare.y + 1 == grid.ySquares then
return gridSquare
else
return grid[gridSquare.y + 1][gridSquare.x]
end
end,
}
for y = 0, grid.ySquares - 1 do
grid[y] = {y = y}
for x = 0, grid.xSquares - 1 do
grid[y][x] = {x = x, y = y}
local rect = display.newRect(grid.displayGroup,
grid.squareSize * x, grid.squareSize * y,
grid.squareSize, grid.squareSize)
if maze[y + 1][x + 1] == 0 then
rect:setFillColor(245, 215, 98)
else
grid[y][x].wall = true
rect:setFillColor(32, 96, 32, 255)
end
grid[y][x].displayObject = rect
grid[y][x].left = grid.functions.left
grid[y][x].right = grid.functions.right
grid[y][x].above = grid.functions.above
grid[y][x].below = grid.functions.below
end
end
grid[maze.yStart - 1][maze.xStart - 1].start = true
grid[maze.yStart - 1][maze.xStart - 1].displayObject:setFillColor(192, 192, 255)
grid[maze.yFinish - 1][maze.xFinish - 1].displayObject:setFillColor(192, 128, 128)
grid[maze.yStart - 1][maze.xStart - 1].start = true
grid[maze.yFinish - 1][maze.xFinish - 1].finish = true
local runner = { image = "runner.png" }
function runner:enter(gridSquare)
if self.displayObject == nil then
self.displayObject = display.newImageRect(grid.displayGroup,
self.image, grid.squareSize, grid.squareSize)
self.displayObject:setFillColor(92, 92, 92)
end
self.displayObject.x = gridSquare.displayObject.x
self.displayObject.y = gridSquare.displayObject.y
self.gridSquare = gridSquare
self.x = gridSquare.x
self.y = gridSquare.y
if self.gridSquare.finish then
finish()
end
end
function runner:canEnter(gridSquare)
return gridSquare.wall == nil
end
local controlCenterX = controllerWidth / 2
local controlCenterY = screenHeight - screenHeight / 5
local controlCenterRadius = controllerWidth / 2 - rightMargin
local upDownWidth = 27
local upDownHeight = 60
local leftRightWidth = 60
local leftRightHeight = 27
local controls = {
up = {},
down = {},
right = {},
left = {},
}
****
controls.displayGroup = display.newGroup()
****
local circlePad = display.newCircle(controls.displayGroup,
controlCenterX, controlCenterY, controlCenterRadius)
circlePad:setFillColor(128, 128, 128)
*****
local up = display.newImageRect(controls.displayGroup, "arrow_up.png",
upDownWidth, upDownHeight)
up.x = controlCenterX
up.y = controlCenterY - upDownHeight / 2
controls.up.displayObject = up
*****
local down = display.newImageRect(controls.displayGroup, "arrow_down.png",
upDownWidth, upDownHeight)
down.x = controlCenterX
down.y = controlCenterY + upDownHeight / 2
controls.down.displayObject = down
local right = display.newImageRect(controls.displayGroup, "arrow_right.png",
leftRightWidth, leftRightHeight)
right.x = controlCenterX + leftRightWidth / 2
right.y = controlCenterY
controls.right.displayObject = right
local left = display.newImageRect(controls.displayGroup, "arrow_left.png",
leftRightWidth, leftRightHeight)
left.x = controlCenterX - leftRightWidth / 2
left.y = controlCenterY
controls.left.displayObject = left
controls.hide = function(controls)
controls.displayGroup.isVisible = false
end
controls.show = function(controls)
controls.displayGroup.isVisible = true
end
local function pressLeft(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:left()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
local function pressRight(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:right()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
local function pressUp(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:above()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
local function pressDown(event)
if event.phase == "began" then
local nextSquare = runner.gridSquare:below()
if runner:canEnter(nextSquare) then
runner:enter(nextSquare)
end
end
end
controls.left.displayObject:addEventListener("touch", pressLeft)
controls.right.displayObject:addEventListener("touch", pressRight)
controls.up.displayObject:addEventListener("touch", pressUp)
controls.down.displayObject:addEventListener("touch", pressDown)
local startButton = {}
startButton.displayGroup = display.newGroup()
startButton.displayObject = display.newCircle(startButton.displayGroup,
controlCenterX, controlCenterY, controlCenterRadius)
startButton.displayObject.strokeWidth = 6
startButton.displayObject:setStrokeColor(244, 244, 64)
startButton.text = display.newText(startButton.displayGroup,
"Start", controlCenterX - controlCenterRadius + 20, controlCenterY - 18,
native.systemFont, 24)
startButton.text:setTextColor(0, 0, 0)
startButton.touch = function(event)
if event.phase == "began" then
startButton:hide()
start()
end
end
startButton.displayGroup:addEventListener("touch", startButton.touch)
startButton.show = function(button)
button.displayGroup.isVisible = true
end
startButton.hide = function(button)
button.displayGroup.isVisible = false
end
local playAgainButton = {}
playAgainButton.displayGroup = display.newGroup()
playAgainButton.displayObject = display.newCircle(playAgainButton.displayGroup,
controlCenterX, controlCenterY, controlCenterRadius)
playAgainButton.displayObject.strokeWidth = 6
playAgainButton.displayObject:setStrokeColor(244, 244, 64)
playAgainButton.text = display.newText(playAgainButton.displayGroup,
"Again", controlCenterX - controlCenterRadius + 20, controlCenterY - 18,
native.systemFont, 24)
playAgainButton.text:setTextColor(0, 0, 0)
playAgainButton.touch = function(event)
if event.phase == "began" then
playAgainButton:hide()
play()
end
end
playAgainButton.displayGroup:addEventListener("touch", playAgainButton.touch)
playAgainButton.show = startButton.show
playAgainButton.hide = startButton.hide
function play()
runner:enter(grid[maze.yStart - 1][maze.xStart - 1])
playAgainButton:hide()
controls:hide()
startButton:show()
end
function start()
controls:show()
end
function finish()
controls:hide()
playAgainButton:show()
end
play()
display.newImageRect will return nothing, being the variable nil, if the image file doesn't exist, you might have noticed this already by checking the console, to fix this issue it's as easy as adding the missing assets to the project folder!

Detect all occurrences of same image

My script recognizes the given image, but if two of the same images are present it will ignore the second one. I want to count it as found 2 times at different locations. There are five rows where the same text-image can appear:
Screen
Image
Output from line 113
[Results found]: Additional Damage of Critical Hits +1% found.
Source code (excerpt)
Func Awakes_adoch()
ToolTip('Scanning for adoch awakes', 0, 0)
$adoch1 = _ImageSearchArea("images/adoch/adoch1.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch1 = 1) Then
$awake_adoch_attribute_count += 1
EndIf
$adoch3 = _ImageSearchArea("images/adoch/adoch3.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch3 = 1) Then
$awake_adoch_attribute_count += 3
EndIf
$adoch5 = _ImageSearchArea("images/adoch/adoch5.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch5 = 1) Then
$awake_adoch_attribute_count += 5
EndIf
$adoch7 = _ImageSearchArea("images/adoch/adoch7.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch7 = 1) Then
$awake_adoch_attribute_count += 7
EndIf
$adoch9 = _ImageSearchArea("images/adoch/adoch9.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch9 = 1) Then
$awake_adoch_attribute_count += 9
EndIf
$adoch11 = _ImageSearchArea("images/adoch/adoch11.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch11 = 1) Then
$awake_adoch_attribute_count += 11
EndIf
$adoch13 = _ImageSearchArea("images/adoch/adoch13.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch13 = 1) Then
$awake_adoch_attribute_count += 13
EndIf
$adoch15 = _ImageSearchArea("images/adoch/adoch15.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch15 = 1) Then
$awake_adoch_attribute_count += 15
EndIf
$adoch17 = _ImageSearchArea("images/adoch/adoch17.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch17 = 1) Then
$awake_adoch_attribute_count += 17
EndIf
$adoch19 = _ImageSearchArea("images/adoch/adoch19.png", 1, 0, 0, 400, 390, $x, $y, 0)
If ($adoch19 = 1) Then
$awake_adoch_attribute_count += 19
EndIf
Sleep(50)
ToolTip('[Scan]: Additional Damage of Critical Hits +' & $awake_adoch_attribute_count & '% found.', 0, 0)
EndFunc
Source code (full)
If the output window shows like below, it should be able to add up to 25:
Additional Damage of Critical Hits +3%
DEF + 40
Additional Damage of Critical Hits +3%
DEF + 4
Additional Damage of Critical Hits +19%
Another example:
I’m looking for a solution that doesn’t skip numbers or adds them from a previous shot to the next.
Source code (new)
relatively easy, as all searched images are below each other (would be much more difficult, when searched images were at random locations):
#include "ImageSearch64.au3"
$searchpath = "c:\users\50022505\Downloads\" ; where are my images?
$x = 0 ; dummy parameter for coordinates
$y = 0 ; dummy parameter for coordinates
$Damage = 100
ConsoleWrite("Initial Damage: " & $Damage & #CRLF)
AddDamage()
ConsoleWrite("Resulting Damage: " & $Damage & #CRLF)
Func AddDamage()
$Damage += GetLocations($searchpath & "adoch1.png")
$Damage += GetLocations($searchpath & "adoch5.png") * 5
$Damage += GetLocations($searchpath & "adoch9.png") * 9
$Damage += GetLocations($searchpath & "adoch11.png") * 11
Return $Damage
EndFunc ;==>AddDamage
Func GetLocations($search)
Local $Findings = 0, $found = 0
Local $dx = 0, $dy = 0 ;sub coordinates
While 1
Local $found = _ImageSearchArea($search, 1, $dx, $dy, 400, 390, $x, $y, 0)
If $found = 0 Then Return $Findings ; no more findings
$Findings += 1
$dy = $y ; set new coordinate window to search (excluding last finding)
WEnd
EndFunc ;==>GetLocations

Resources