Log In  
:: Unfold ::

Cart #happybirthdaygiorgiomoroder-1 | 2020-04-29 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

My humble and sub-par homage to the legendary musician Giorgio Moroder, because yesterday he turned 80 years old.
Quite cr*p and obviously not as good as his music by a LOOOOOONG shot, so it is a fortune that he will probably won't ever hear this rendition of his famous song "Chase", from the original soundtrack of the movie "Midnight express" ^_____^; (he won an oscar for that score, first time ever a synthesized song won an academy award, years before Vangelis)

P#75571 2020-04-28 19:54 ( Edited 2020-04-29 13:45)

:: Unfold ::

Hello, I'm trying to develop a game in which there will be some enemies chasing the player on a map, and on this map there will be some obstacles.

I know how to code a simple AI in order to have enemies follow the player, by using math trigonometry functions like sine, cosine and arctangent; but I ACTUALLY HAVE NO IDEA about how to code an enemy AI in order to make it avoiding some obstacles on the screen.

Basically I'd like to code a simple AI that could chase the player on the map, but at the right time when it's about to collide with an obstacle could forget for a moment that chase and dodge the obstacle.

Do you have an idea about what I should try to implement ?
At the moment I've tried something very simple that tries to rotate around an obstacles while the trajectory between the enemy and the obstacle and the trajectory between the enemy and the player is equal or greater than 90 degrees. It's a really simple trick but it doesn't work 100% of the time.

This is my code:

function _init()
    -- initialize

    -- enemy
    e = {}
    e.f = 1
    e.x = 0
    e.y = 0
    -- player
    p = {}
    p.found = false
    p.distance_b = 0
    p.f = 2
    p.x = 118
    p.y = 118

    -- columns
    bb = {}
    b1 = {}
    b1.f = 3
    b1.x = 40
    b1.y = 40
    b2 = {}
    b2.f = 3
    b2.x = 80
    b2.y = 80
    add(bb, b1)
    add(bb, b2)

function object_collide_with(x1, y1, x2, y2, gx, gy)
    -- checks if an object has collided 
    -- with another object, then calculated
    -- the angle between the ball and the other object

    -- gx = gravity horizontal center
    -- gy = gravity vertical center

    if (gx == nil) gx = 4  -- 8x8 --> 8/2 
    if (gy == nil) gy = 4

    --local bump = c1 and c2 and c3 and c4
    local distance = sqrt(((x2+gx)-(x1+gx))^2 + ((y2+gy)-(y1+gy))^2)
    local angle = atan2((x1 + gx) - (x2 + gx), (y1 + gy) - (y2 + gy))
    local direction = flr(angle * 8)
    return distance, angle, direction

function player_collide_with(x, y, w, h)
    -- checks if the player has collided 
    -- with another object, then calculated
    -- the angle between the ball and the other object

    return object_collide_with(p.x, p.y, x, y, w, h)

function distance_between(x1, y1, x2, y2)
    -- calculates the distance between two points

    return sqrt((x2-x1)^2 + (y2-y1)^2)

function check_player()
    if (btn(0)) p.x -= 1
    if (btn(1)) p.x += 1
    if (btn(2)) p.y -= 1
    if (btn(3)) p.y += 1

function _update()
    p.found = false
    local distance, angle, direction
    -- check the distance from the target
    distance, angle, direction = player_collide_with(e.x, e.y)    
    for i, b in pairs(bb) do
        local distance_b, angle_b, direction_b = object_collide_with(b.x, b.y, e.x, e.y)        
        if distance_b <= 10 and abs(angle-angle_b) < 1/6 then
            angle_b += 3.1415/240
            e.x = b.x - cos(angle_b) * distance_b
            e.y = b.y - sin(angle_b) * distance_b            
            p.found = true
    if not p.found then
        e.x += cos(angle) 
        e.y += sin(angle)
    if distance_between(e.x, e.y, p.x, p.y) < 8 then
        -- reset if the enemy touches the player
        e.x = 0
        e.y = 0

function _draw() 
    for i, b in pairs(bb) do
        spr(b.f, b.x, b.y)
    spr(p.f, p.x, p.y)
    spr(e.f, e.x, e.y)
P#47682 2017-12-26 07:45 ( Edited 2017-12-27 23:04)

:: Unfold ::

Cart #46052 | 2017-11-09 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Hello! Er... this is the first game i've ever made with Pico-8, so please forgive all the bugs you'll find in this little game.

This is my little homage to one of the games I used to play in my arcades back in the early eighties when I was a kid... a game with a trackball, many missiles and the almost impossible task to avoid a thermonuclear world war for as long as possible.

Yes, I know... that's not exactly a very cheerful theme, but it's also not worse than your average "zombie apocalypse" theme that you can find in many games today ;-)


In this game the final war that will annihilate the human race has just started. Your name is Dave Theurer, and unfortunately you're not a superhero. You can't stop all the missiles and you can't keep your loved ones and your city safe forever; but if you're brave and lucky enough you might be able to allow your fellow citizens to see the lights of another day.
Till the next night of bombings.


Use your mouse or the directional keys to move the gun target. Push the Z button or click the left mouse button to shoot a single rocket, Keep pressed the X button or keep clicking the right mouse button for rapid fire.
Shoot the enemy missiles and avoid them falling on the buildings. When your last building falls, it's game over.

P#46016 2017-11-08 16:17 ( Edited 2017-11-11 17:24)

Follow Lexaloffle:          
Generated 2023-10-03 14:07:21 | 0.081s | Q:15