Difference between revisions of "Robot gallery"

From Bitfighter
(OrbitBot)
(OrbitBot)
Line 104: Line 104:
 
-- Other initialization code
 
-- Other initialization code
 
bot:logprint("Hello, I'm " .. getName()) -- Print a message to the game log
 
bot:logprint("Hello, I'm " .. getName()) -- Print a message to the game log
orbitRadius = 300   -- How far from object do we want to orbit?
+
orbitRadius = 300                       -- How far from object will we orbit?
 
orbitAng = 0
 
orbitAng = 0
  
 
</source>
 
</source>

Revision as of 22:37, 11 June 2009

For reference information on how these robots work, see the Programming Robots section.


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()
 
    local loc = bot:getLoc()
    local items = bot:findGlobalItems(TestItemType) -- Find a TestItem
 
    local minDist = 999999
    local closestItem = nil
    local 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
        local d = loc:distSquared(item:getLoc()) -- Dist btwn robot and item
 
        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
 
    local botLoc = bot:getLoc()
    local itemLoc = closestItem:getLoc()
 
    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 
        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
orbitRadius = 300                        -- How far from object will we orbit?
orbitAng = 0