Programming C, C++, Java, PHP, Ruby, Turing, VB
Computer Science Canada 
Programming C, C++, Java, PHP, Ruby, Turing, VB  

Username:   Password: 
 RegisterRegister   
 Object Avoidance newbie question
Index -> Programming, Turing -> Turing Help
View previous topic Printable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic
Author Message
metal Slug 2




PostPosted: Sun Oct 18, 2009 7:40 am   Post subject: Object Avoidance newbie question

What is it you are trying to achieve?
Hi, I am a first year programmer (ISC3U), so please bear with me. I've gone a little ahead and started playing with graphics in Turing. What I have done so far is created a program which (based on the Turing walk-through on this site, Thanks! =) ) creates two circles. One circle (the red one), you control with the D-pad on your keyboard. The other ball (the Blue one), moves in the opposite direction you are in, if you are also within an X distance from it. This will eventually be part of my final project (A Zelda RPG...FTW!)..as some sort of enemy maneuvering.

What is the problem you are having?
I would like to know how I can make the blue ball travel linearly in the opposite direction of the red ball based upon the slope between the red and blue ball. Essentially, if I am traveling diagonally right and up at the blue ball, I want the blue ball to travel right and up also, away from the ball I'm controlling...or have the ball move away at the same angle in which I am approaching it
I am also having problems with flickering, I cannot figure out how to get it to work...View.Update and "offscreenonly" do not work for me...
[EDIT] : i have solved the flickering problem. apparently, "View.Update" needs to be pasted AFTER any visual changes are made...which makes so much sense... Wink

Describe what you have tried to solve this problem
<I have tried what I described in the first paragraph. I tried plugging the blue balls x and y coordinates into y = mx + b, by incrementing the x-value of the blue ball by <any value> and then the y value into the linear equation. However, this wont work because no decimal places are allowed with these values...
I have also tried to stop flickering, but it did not work =(


Post any relevant code (You may choose to attach the file instead of posting the code if it is too long)
<Here's my code...updated>

Turing:


View.Set ("graphics:1000;600,position:center;center,offscreenonly")
var x, y, x2, y2 : int  % X and Y are the coordinates of the FIRST Ball (Red) , and X2 and Y2 are the coordinates of the SECOND BALL (Blue)
var y22 : real
var slope, distance_between_centres : real
x := 100
y := 100            %starting points for the two balls
x2 := maxx div 2
y2 := maxy div 2
const slope1 : real := 1.732   %the slope in quadrant one and three, where angle Theta is 60 degrees to the horizontal
const slope2 : real := 0.57735 %"" Theta = 30 degrees
const slope3 : real := -0.57735 %quadrants 2 and 4...the slope becomes negative
const slope4 : real := -1.732  %same thing..negative slope
const r : int := 4          %changes the radius of the balls...yea, yea, go ahead laugh...
const movedist : int := 150 %determines how close you need to get to the blue ball in order to to move it
const speed1 : int := 8     %the speed of your ball
const speed2 : int := 3     %the speed of ball 2 in horizontal or vertical - this vsalue determines how "fast" the blue ball runs away from the red ball
const speed3 : int := 2     
    %speed of the blue ball (ball2) in diagonals  - as does this value...i only wish it could be a decimal value...until then, the diagonal speed is a slight bit faster than the vertical/horizontal value

var chars : array char of boolean

%var line1x : real := (movedist * (cos (30))):0:2   %what i Would* put in place of 130 below on the "drawline"...but the value cannot be a decimal..nor can i seem to round it... :0:2...doesnt seem to work for me
%var liney1 : real := (movedist * (sin (30)))

procedure blueball % to keep the two balls' program apart...easier to read

    drawfilloval (x2, y2, r, r, blue) % draws the blue ball
    drawoval (x2, y2, movedist, movedist, black)

    % These values were derrived from finding the x and y values of a triangle whos hypotenuse was the "movedist" value..at the time these values were written the "movedist" value was 160
    drawline (x2 - 130, y2 - 75, x2 + 130, y2 + 75, black) %draws the "section" lines, which provides a visual aid in determining the direction the blue ball will travel
    drawline (x2 - 130, y2 + 75, x2 + 130, y2 - 75, black)
    drawline (x2 + 75, y2 + 130, x2 - 75, y2 - 130, black)
    drawline (x2 + 75, y2 - 130, x2 - 75, y2 + 130, black)

    if (x2 - x) = 0 then % Eliminated the possibility that x and x2 are the same number so that we dont accidentally DIVIDE BY ZERO!...which would crash the program of course...
        x := x2 + 1
    end if

    slope := ((y2 - y) / (x2 - x)) % finds the slope between the two balls
    distance_between_centres := (sqrt ((x2 - x) ** 2 + (y2 - y) ** 2)) %finds the distance between the first(red) and second(blue) circles

    put "Slope: ", slope : 9, " x: ", x : 3, " y: ", y : 3, " x2: ", x2 : 3, " y2: ", y2 : 3 %outputs the slope, x and y coordinates for the balls

    % Diagonal movements
    if slope < slope1 and slope > slope2 and distance_between_centres <= movedist and x > x2 and y > y2 then
        x2 -= speed3
        y2 -= speed3
    end if

    if slope < slope3 and slope > slope4 and distance_between_centres <= movedist and x > x2 and y < y2 then
        x2 -= speed3
        y2 += speed3
    end if

    if slope < slope1 and slope > slope2 and distance_between_centres <= movedist and x < x2 and y < y2 then
        x2 += speed3
        y2 += speed3
    end if

    if slope < slope3 and slope > slope4 and distance_between_centres <= movedist and x < x2 and y > y2 then
        x2 += speed3
        y2 -= speed3
    end if

    % X and Y movements
    if slope < slope2 and slope > slope3 and distance_between_centres <= movedist and x > x2 then
        x2 -= speed2
    elsif slope < slope2 and slope > slope3 and distance_between_centres <= movedist and x < x2 then
        x2 += speed2
    elsif /*slope > -340 and slope < 200 and slope not= slope1 and slope not= slope2 and slope not= slope3 and slope not= slope4 and*/ y < y2 and distance_between_centres <= movedist then
        y2 += speed2
    elsif /*slope > -340 and slope < 200 and slope not= slope1 and slope not= slope2 and slope not= slope3 and slope not= slope4 and*/ y > y2 and distance_between_centres <= movedist then
        y2 -= speed2
    end if
    /*
     if slope > -340 and slope < 200 and slope not= slope1 and slope not= slope2 and slope not= slope3 and slope not= slope4 and y > y2 and distance_between_centres <= movedist then
     y2 -= speed2
     end if
     */


    /*if distance_between_centres <= movedist and y < y2 then  %THIS WAS ROUGH WORK...didn't work
     y2 += speed2
     end if

     if distance_between_centres <= movedist and y > y2 then
     y2 -= speed2
     end if*/


    %restricts blue ball from exiting boundaries, and allows red ball to push it around more

    drawbox (40, 40, maxx - 40, maxy - 40, red) % comment this line if you DO NOT want to see the "restictions" box for the Blue Ball
    if y2 < 40 then
        y2 := y2 + speed2 % now, if the ball is moving diagonal, it can leave the screen...but that because i CANNOT let the speed be a decimal value...which would otherwise be: sqrt(x2**2 + y2**2)
    end if
    if y2 > maxy - 40 then
        y2 := y2 - speed2
    end if
    if x2 < 40 then
        x2 := x2 + speed2
    end if
    if x2 > maxx - 40 then
        x2 := x2 - speed2
    end if
    % for some reason, the blue ball likes to slowly creep past the maximum "y" values it was permitted...so i fixed that with this..or this with that? lol
    if y2 > maxy - 40 then
        y2 := maxy - 40
    elsif y2 < 40 then
        y2 := 40
    end if

end blueball


loop
    cls
    Draw.Box (20, 20, maxx - 20, maxy - 20, blue)
    drawfillbox (21, 21, maxx - 21, maxy - 21, green)
    Input.KeyDown (chars)
    % moved the red ball according to input
    if chars (KEY_UP_ARROW) then
        y := y + speed1
    end if
    if chars (KEY_RIGHT_ARROW) then
        x := x + speed1
    end if
    if chars (KEY_LEFT_ARROW) then
        x := x - speed1
    end if
    if chars (KEY_DOWN_ARROW) then
        y := y - speed1
    end if
    % restricts your ball from travelling off the screen
    if y < 20 then
        y := y + speed1
    end if
    if y > maxy - 20 then
        y := y - speed1
    end if
    if x < 20 then
        x := x + speed1
    end if
    if x > maxx - 20 then
        x := x - speed1
    end if

    drawfilloval (x, y, r, r, red) %draws the red ball

    blueball % runs the blueball code

    drawline (x, y, x2, y2, black) % draws a line between the two balls, so you know which section your ball will fall into

    View.Update

    delay (20) % wait a bit, so the program does not to superspeed

end loop



Please specify what version of Turing you are using
<v4.1.1>
Sponsor
Sponsor
Sponsor
sponsor
Zren




PostPosted: Sun Oct 18, 2009 12:26 pm   Post subject: RE:Object Avoidance newbie question

This tutorial ought to help you. It's essentially the same thing since you just want to polar opposite of following (running away!).

http://compsci.ca/v3/viewtopic.php?t=17607&highlight=trigonometry

The difference is that you want the angle the dude is moving to be the other side of the circle. Half the full angle of the circle (arc length). In other words, you want to add 180* to the angle between your player (Mouse in the tutorial, Red dot for you), and the AI (blue guy).

So you'd want to add this to the source code from the tutorial.
wrote:
eAngle := 180 + setAngle (xm - eX (eTaleLenght), ym - eY (eTaleLenght)) % gets the angle from enemy to mouse


Before hacking away at your code though, look at Saad's post in the same thread, he uses another method that achieves the same thing, however it might be a little more related to your code.

To do what your asking though, we want to go in the opposite direction:
enemy.x -= xDir
enemy.y -= yDir
Display posts from previous:   
   Index -> Programming, Turing -> Turing Help
View previous topic Tell A FriendPrintable versionDownload TopicSubscribe to this topicPrivate MessagesRefresh page View next topic

Page 1 of 1  [ 2 Posts ]
Jump to:   


Style:  
Search: