Difference between revisions of "Robot gallery"
From Bitfighter
(New page: =Coming soon... A gallery of working bots!=) |
(→Coming soon... A gallery of working bots!) |
||
Line 1: | Line 1: | ||
− | = | + | ==OrbitBot== |
+ | |||
+ | <source lang="lua"> | ||
+ | ------------------------------------------------------------------------------- | ||
+ | ------------------------------------------------------------------------------- | ||
+ | -- | ||
+ | -- 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 | ||
+ | -- | ||
+ | -- Works with Bitfighter 011 alpha 2 | ||
+ | -- | ||
+ | ------------------------------------------------------------------------------- | ||
+ | ------------------------------------------------------------------------------- | ||
+ | ------------------------------------------------------------------------------- | ||
+ | ------------------------------------------------------------------------------- | ||
+ | ------------------------------------------------------------------------------- | ||
+ | -- This is called by the robot's idle routine each tick. | ||
+ | -- This function must be present for the robot to work! | ||
+ | |||
+ | function getMove() | ||
+ | |||
+ | loc = bot:getLoc() | ||
+ | items = bot:findGlobalItems( TestItemType ) -- Find a TestItem | ||
+ | |||
+ | minDist = 999999 | ||
+ | closestItem = nil | ||
+ | found = false | ||
+ | |||
+ | for indx, item in ipairs( items ) do -- Iterate over our list | ||
+ | -- Use distSquared because it is less computationally expensive | ||
+ | -- and works great for comparing distances | ||
+ | d = loc:distSquared( item:getLoc() ) -- Dist btwn robot and TestItem | ||
+ | |||
+ | if( d < minDist ) then -- Is it the closest yet? | ||
+ | closestItem = item | ||
+ | minDist = d | ||
+ | end | ||
+ | end | ||
+ | |||
+ | -- closestItem will be nil if the bot can't find any. This may happen | ||
+ | -- if the level has no TestItems, or if they are beyond the robot's | ||
+ | -- range to know about them. | ||
+ | if( closestItem == nil) then | ||
+ | return | ||
+ | end | ||
+ | |||
+ | |||
+ | botLoc = bot:getLoc() | ||
+ | itemLoc = closestItem:getLoc() | ||
+ | |||
+ | dist = botLoc:distanceTo( itemLoc ) | ||
+ | orbitRadius = 300 | ||
+ | |||
+ | -- 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() | ||
+ | |||
+ | if( dist <= orbitRadius * 1.1 ) then | ||
+ | dest = itemLoc | ||
+ | dest:setxy( itemLoc:x() + orbitRadius * math.cos (orbitAng), | ||
+ | itemLoc:y() + orbitRadius * math.sin (orbitAng) ) | ||
+ | else | ||
+ | dest = itemLoc | ||
+ | orbitAng = botLoc:angleTo( dest ) | ||
+ | end | ||
+ | |||
+ | bot:setThrustToPt( dest ) -- travel towards calculated point | ||
+ | |||
+ | bot:setAngle( botLoc:angleTo( itemLoc) ) | ||
+ | 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 | ||
+ | |||
+ | |||
+ | -- Other initialization code | ||
+ | bot:logprint( "Hello, I'm "..getName() ) -- Print a message to the game log | ||
+ | orbitAng = 0 | ||
+ | </source> |
Revision as of 20:57, 10 June 2009
OrbitBot
------------------------------------------------------------------------------- ------------------------------------------------------------------------------- -- -- 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 -- -- Works with Bitfighter 011 alpha 2 -- ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- -- This is called by the robot's idle routine each tick. -- This function must be present for the robot to work! function getMove() loc = bot:getLoc() items = bot:findGlobalItems( TestItemType ) -- Find a TestItem minDist = 999999 closestItem = nil found = false for indx, item in ipairs( items ) do -- Iterate over our list -- Use distSquared because it is less computationally expensive -- and works great for comparing distances d = loc:distSquared( item:getLoc() ) -- Dist btwn robot and TestItem if( d < minDist ) then -- Is it the closest yet? closestItem = item minDist = d end end -- closestItem will be nil if the bot can't find any. This may happen -- if the level has no TestItems, or if they are beyond the robot's -- range to know about them. if( closestItem == nil) then return end botLoc = bot:getLoc() itemLoc = closestItem:getLoc() dist = botLoc:distanceTo( itemLoc ) orbitRadius = 300 -- 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() if( dist <= orbitRadius * 1.1 ) then dest = itemLoc dest:setxy( itemLoc:x() + orbitRadius * math.cos (orbitAng), itemLoc:y() + orbitRadius * math.sin (orbitAng) ) else dest = itemLoc orbitAng = botLoc:angleTo( dest ) end bot:setThrustToPt( dest ) -- travel towards calculated point bot:setAngle( botLoc:angleTo( itemLoc) ) 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 -- Other initialization code bot:logprint( "Hello, I'm "..getName() ) -- Print a message to the game log orbitAng = 0