Difference between revisions of "Robot gallery"
Watusimoto (Talk | contribs) (→OrbitBot) |
|||
Line 34: | Line 34: | ||
as the first line of your getMove() function will fix the problem. | as the first line of your getMove() function will fix the problem. | ||
− | |||
− | |||
− | |||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
-- | -- | ||
-- OrbitBot, a simple robot that finds the nearest TestItem and orbits it | -- OrbitBot, a simple robot that finds the nearest TestItem and orbits it | ||
− | -- Note that this relies on line-of-sight navigation, so only good for open | + | -- Note that this relies on line-of-sight navigation, so only good for open levels |
− | + | ||
-- | -- | ||
− | -- | + | -- !!! WILL ONLY WORK WITH RELEASE VERSION OF BITFIGHTER 011 AND ABOVE !!! |
-- | -- | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
Line 51: | Line 47: | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
− | -- This is called by the robot's idle routine each tick. | + | -- This is called by the robot's idle routine each tick. |
-- This function must be present for the robot to work! | -- This function must be present for the robot to work! | ||
function getMove() | function getMove() | ||
− | + | if(targetItem == nil) then | |
− | + | targetItem = findClosest(bot:findGlobalItems(TestItemType)) | |
+ | end | ||
− | + | if(targetItem == nil) then return end | |
− | + | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
local botLoc = bot:getLoc() | local botLoc = bot:getLoc() | ||
− | local itemLoc = | + | local itemLoc = targetItem:getLoc() |
− | dist = botLoc:distanceTo(itemLoc) | + | local dist = botLoc:distanceTo( itemLoc ) |
-- Here we use the getTime() function to make the motion look smooth. | -- Here we use the getTime() function to make the motion look smooth. | ||
Line 91: | Line 69: | ||
-- .0015 determined experimentally | -- .0015 determined experimentally | ||
+ | orbitAng = orbitAng + .0015 * bot:getTime() | ||
− | |||
local dest | local dest | ||
− | + | ||
− | if(dist <= orbitRadius * 1.1) then | + | if( dist <= orbitRadius * 1.1 ) then -- Close enough to enter orbit |
dest = itemLoc | dest = itemLoc | ||
− | dest:setxy(itemLoc:x() + orbitRadius * math.cos(orbitAng), | + | dest:setxy( itemLoc:x() + orbitRadius * math.cos (orbitAng), |
− | + | itemLoc:y() + orbitRadius * math.sin (orbitAng) ) | |
− | else | + | if( not isInOrbit ) then |
+ | orbitAng = botLoc:angleTo( dest ) - math.pi / 2 | ||
+ | end | ||
+ | |||
+ | isInOrbit = true | ||
+ | |||
+ | else -- Travel directly toward object | ||
dest = itemLoc | dest = itemLoc | ||
− | orbitAng = botLoc:angleTo(dest) | + | orbitAng = botLoc:angleTo( dest ) |
+ | isInOrbit = false | ||
end | end | ||
− | bot:setThrustToPt(dest) | + | bot:setThrustToPt( dest ) -- Travel towards calculated point |
− | + | bot:setAngle( botLoc:angleTo( itemLoc) ) -- Aim ship that way too | |
− | bot:setAngle(botLoc:angleTo(itemLoc)) | + | |
end | end | ||
Line 119: | Line 103: | ||
function getName() | function getName() | ||
− | return("OrbitBot") | + | return( "OrbitBot") |
end | end | ||
Line 128: | Line 112: | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
-- Setup code here: this is run once when the robot is initialized, and | -- Setup code here: this is run once when the robot is initialized, and | ||
− | -- any variables set here will persist throughout the robot's life. These | + | -- any variables set here will persist throughout the robot's life. These |
-- variables can be accessed from various functions defined in this file. | -- variables can be accessed from various functions defined in this file. | ||
------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||
− | -- Global variables | + | -- Global variables must be declared here before they can be used elsewhere |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
orbitAng = 0 | orbitAng = 0 | ||
− | + | orbitRadius = 300 | |
− | + | isInOrbit = false | |
+ | targetItem = nil |
Revision as of 05:55, 6 October 2009
For reference information on how these robots work, see the Programming Robots section.
IMPORTANT: In order for these bots to work with Bitfighter 011 alpha 2, you will need to update the file "robot_helper_functions.lua" in your Bitfighter install folder. Replace the file's contents with the following:
bot = LuaRobot(Robot) -- This is a reference to our bot. function getFiringSolution(item) if(item == nil) then return nil end type = item:getClassID() if(type == nil) then return nil end return bot:getFiringSolution(type, item) end function logprint(msg) bot:logprint(msg) end
JUST AS IMPORTANT In 011 alpha 2, there is a bug in setThrustToPt() that can cause Bitfighter to hang. It will be fixed in alpha 3. Inserting the line:
if(bot:getTime() == 0) then return end
as the first line of your getMove() function will fix the problem.
-- -- OrbitBot, a simple robot that finds the nearest TestItem and orbits it -- Note that this relies on line-of-sight navigation, so only good for open levels -- -- !!! WILL ONLY WORK WITH RELEASE VERSION OF BITFIGHTER 011 AND ABOVE !!! --
-- This is called by the robot's idle routine each tick. -- This function must be present for the robot to work!
function getMove()
if(targetItem == nil) then targetItem = findClosest(bot:findGlobalItems(TestItemType)) end
if(targetItem == nil) then return end
local botLoc = bot:getLoc() local itemLoc = targetItem:getLoc()
local dist = botLoc:distanceTo( itemLoc )
-- Here we use the getTime() function to make the motion look smooth. -- If we just advanced orbitAng by a fixed amount each frame, it would -- appear jerky, as each frame is a slightly different length.
-- .0015 determined experimentally orbitAng = orbitAng + .0015 * bot:getTime()
local dest
if( dist <= orbitRadius * 1.1 ) then -- Close enough to enter orbit dest = itemLoc dest:setxy( itemLoc:x() + orbitRadius * math.cos (orbitAng), itemLoc:y() + orbitRadius * math.sin (orbitAng) ) if( not isInOrbit ) then orbitAng = botLoc:angleTo( dest ) - math.pi / 2 end isInOrbit = true else -- Travel directly toward object dest = itemLoc orbitAng = botLoc:angleTo( dest ) isInOrbit = false end
bot:setThrustToPt( dest ) -- Travel towards calculated point bot:setAngle( botLoc:angleTo( itemLoc) ) -- Aim ship that way too
end
-- This function is called once and should return the robot's name
function getName()
return( "OrbitBot")
end
-- Setup code here: this is run once when the robot is initialized, and -- any variables set here will persist throughout the robot's life. These -- variables can be accessed from various functions defined in this file.
-- Global variables must be declared here before they can be used elsewhere orbitAng = 0 orbitRadius = 300 isInOrbit = false targetItem = nil