Why that doesn’t work?
The hero spins around.
Why that doesn’t work?
The hero spins around.
What values do you get for vector x and y? You also seem to have a big gap there. You check for > 0.5 or < -0.5. If the values are between 0.5 and -0.5 then nothing happens.
Does it always spin in the same direction regardless of the joystick input?
If you can post the actual code it would be easier to investigate. We probably need to know more about the “vector” and “map” values as well.
So I need to post whole file?
When I walk left hero spins around.
Edit: It doesn’t let me upload whole lua file
I tried this. It works, but only once.
thats the same code as before, so no help. just post the code using code formatting tools here, <>. Like what is ”joystick.isActivated”? How can we know your custom code does if we dont see it?
[lua]
local composer = require “composer”
local joystickPlugin = require “plugin.joystick”
local scene = composer.newScene();
function scene:show(event)
local sceneGroup = self.view;
system.activate(“multitouch”)
local map = display.newImage(“Images/survivalModeMap.png”)
map.x = display.contentCenterX
map.y = display.contentCenterY
local hero = display.newImage(“Images/mehaHat.png”)
hero.x = display.contentCenterX
hero.y = display.contentCenterY
local AttackButton = display.newImage(“Images/mehaAttackButton.png”)
AttackButton.x = 480
AttackButton.y = 270
local rotation = “up”
local AttackAnimationSheetData = {
width = 400,
height = 400,
numFrames = 10,
sheetContentWidth = 800,
sheetContentHeight = 2000
}
local AttackAnimationSheet = graphics.newImageSheet(“Images/mehaAttackAnimation.png”, AttackAnimationSheetData)
local sequenceData = {
{ name = “Attack”, start = 1, count = 10, time = 500, loopCount = 1}
}
local props = {
x = 10,
y = 270,
backgroundRadius = 50,
movedStickRadius = 25,
}
local Joystick = joystickPlugin.newJoystick(props)
Joystick.background:setFillColor(0.5)
Joystick.movedStick:setFillColor(0.7)
local function enterFrame(event)
if Joystick.isActivated() then
local vector = Joystick.getVector()
if vector.x < -0.5 then
map.x = map.x + 2
if rotation == “up” then
hero:rotate(270)
rotation = “left”
elseif rotation == “right” then
hero:rotate(180)
rotation = “left”
elseif rotation == “down” then
hero:rotate(90)
rotation = “left”
end
elseif vector.x > 0.5 then
map.x = map.x - 2
if rotation == “up” then
hero:rotate(90)
rotation = “right”
elseif rotation == “left” then
hero:rotate(180)
rotation = “right”
elseif rotation == “down” then
hero:rotate(270)
rotation = “right”
end
end
if vector.y < -0.5 then
map.y = map.y + 2
rotation = down
elseif vector.y > 0.5 then
map.y = map.y - 2
rotation = up
end
end
end
local AttackCoolDown = 0
local function Attack(event)
if(event.phase == “began”) then
if AttackCoolDown == 0 then
hero.isVisible = false
local mehaAttackAnimation = display.newSprite( AttackAnimationSheet, sequenceData )
mehaAttackAnimation.x = display.contentCenterX
mehaAttackAnimation.y = display.contentCenterY
mehaAttackAnimation:play()
AttackCoolDown = 1
local function mehaAttackAnimationFinish ()
hero.isVisible = true
mehaAttackAnimation:removeSelf()
AttackCoolDown = 0
end
timer.performWithDelay( 500, mehaAttackAnimationFinish )
end
end
end
Runtime:addEventListener(“enterFrame”, enterFrame)
AttackButton:addEventListener(“touch”, Attack)
end
scene:addEventListener(“show”, scene);
return scene;
[/lua]
Better read that plugin’s documentation. Adding a few empty lines to make the code easier to read would help too.
Which joystick plugin are you using?
Can you tell us a little more about the input values and what you are doing with the joystick when the hero spins?
Generally when you are trying to debug your code, you’ll want to use a lot of print().
For instance, you said that your your function works, but it works only once. So, insert a print to the top of your function to see whether the issue is with Joystick.isActivated() or something else, i.e.
local function enterFrame(event) print( joystick.isActivated() ) if Joystick.isActivated() then ...
Since you run enterFrame every frame (you should consider renaming the function), you’ll see your console output be filled with true or false prints. If you get true once and then just false, then you know that your issue if with the first condition and you need to figure out what is causing it (probably by reading the documentation for the plugin).
If you don’t get false, then it means that the issue is further down, so you’d use print again:
local function enterFrame(event) if Joystick.isActivated() then local vector = Joystick.getVector() print( vector.x, vector.y ) ...
Again, you’ll be able to see if you get values that satisfy the conditions below. You then repeat this process until you find the culprit.
Now, in your case, I would wager a guess that the issue has something to do with rotation variable. Your conditions for when rotations are done are for if the rotation is a string “left”, “right”, “up” or “down”. However, the only values that you assign to them are “left” or “right” for x vector statements, or variables up and down for y vector, i.e. rotation is probably nil after that. How can we be sure? By using print()!
Welcome to Corona and game development, now it’s time to start learning how to debug your code!
I think I see the problem. The rotation is always clockwise.
Two problems.
First, using hero:rotate( ) adds to the hero’s rotation instead of setting the hero’s rotation.
[lua]
– instead of
hero:rotate( 270)
–use
hero.rotation = 270
– to set the absolute rotation instead of adding more rotation
[/lua]
Second,
I think using the variable “rotation” to track the direction of the rotation is confusing.
Perhaps you are confusing the direction of the joystick push with the direction of the rotation you want to implement?
Use “direction” instead of “rotation” to avoid confusion and then set “direction” to “up”, “down”, “left” or “right”.
After each joystick event you are setting “rotation” to either “left” or “right” so the enterFrame function will get stuck in a loop.
“left” sets “rotation” to “right” and rotates the hero 180 degrees
“right” sets “rotation” to “left” and rotates the hero 180 degrees
“left” sets “rotation” to “right” and rotates the hero 180 degrees
“right” sets “rotation” to “left” and rotates the hero 180 degrees
“up” and “down” are never activated and, thus the alternating cycle between “left” and “right” makes the hero spin in a full 360 degrees
[lua]
local vector = Joystick.getVector()
if vector.x < -0.5 then
map.x = map.x + 2
if rotation == “up” then ---------- never activated
hero:rotate(270)
rotation = “left” ---------- always left
elseif rotation == “right” then
hero:rotate(180)
rotation = “left”---------- always left
elseif rotation == “down” then ---------- never activated
hero:rotate(90)
rotation = “left” ---------- always left
end
elseif vector.x > 0.5 then
map.x = map.x - 2
if rotation == “up” then ---------- never activated
hero:rotate(90)
rotation = “right” ---------- always right
elseif rotation == “left” then
hero:rotate(180)
rotation = “right” ---------- always right
elseif rotation == “down” then ---------- never activated
hero:rotate(270)
rotation = “right” ---------- always right
end
end
[/lua]
I am using “Typler’s Joystick”
When I wrote rotation(direction) values without inverted commas and used joystick to go left hero spun.
Now I wrote rotation(direction) values with inverted commas and when I use joystick to go left hero turns left once even if I use joystick to go right it doesn’t turn.
You need to read what we’ve told you.
When you say that you removed the inverted commas, what you did is you turned u** p and down into variables. However, you haven’t defined such variables anywhere, so they are nil. So, like I told you, once you set rotation**, the variable, to nil once, then none of your if statements will ever work again because they are expecting strings and you are offering it nil.
Now, the second part about your hero just spinning around was explained by @sporkfin. You are using object:rotate(90) method. This method adds 90 degrees to the object’s existing rotation, which means that they will only ever spin in one direction with your code. If instead you were to use object.rotation = 90, then the object’s rotation will always be set to 90 degrees with it.
Finally, is whatever you are doing even necessary? What do you need the rotation variable for?
If all that you are doing is making your character face the direction of the joystick, then as your joystick seems to return vectors, you could use a little bit of trigonometry to manage all possible angles (see https://www.mathsisfun.com/geometry/unit-circle.html).
If you only want your character to face left, right, up or down, then you could still just monitor for the direction of the joystick. If it points left, set the character’s rotation to a specific angle, etc.