
-----------------------------------
ncmitchell
Thu Jan 12, 2012 6:34 pm

Help with Breakout Game
-----------------------------------
I'm making a Breakout game for my grade 11 computer science class, and my code isn't nearly finished, but I'm stuck on how to make it hit the paddle and bounce back up again. I've tried using whatdotcolour, but I haven't been able to make that work. All help is appreciated!! Thank you.

View.Set ("offscreenonly")

const PaddleColour := 102
const EscKey := chr (27)
const up := 0
const down := 1
const BallRad := 6
const BallColour := 26

setscreen ("graphics:800,800")

% DECLARE VARIABLES
var map : array 1 .. 20, 1 .. 20 of int
var NumRows, NumCols, font1, font2 : int
var mx, my, button : int
var x, y, Paddlex1, Paddlex2, Paddley1, Paddley2 : int
var Ballx, Bally, direction : int
var level, lives : int

level := 0

font1 := Font.New ("Arial:25:bold")
font2 := Font.New ("Arial:30:bold")

procedure ReadMap (filename : string, var map : array 1 .. *, 1 .. * of int, var NumRows, NumCols : int)
    var stream : int

    % OPEN FILE
    open : stream, filename, get
    if stream not= 0 then
        get : stream, NumRows
        get : stream, NumCols

        for row : 1 .. NumRows
            for col : 1 .. NumCols
                get : stream, map (row, col)
            end for
        end for

        % CLOSE THE FILE
        close : stream
    end if
end ReadMap

procedure DrawMap (map : array 1 .. *, 1 .. * of int, NumRows, NumCols : int)
    var x, y : int
    y := maxy - 40
    for row : 1 .. NumRows
        x := 0
        for col : 1 .. NumCols
            % BLUE BORDER
            if map (row, col) = 54 then
                drawfillbox (x, y, x + 40, y + 40, map (row, col))
                % BLACK BACKGROUND
            elsif map (row, col) = 7 then
                drawfillbox (x, y, x + 40, y + 40, map (row, col))
            end if
            x := x + 40
        end for
        y := y - 40
    end for
end DrawMap

procedure calculatexy (var x, y : real, angle, step : real)
    x := step * cosd (angle) + x
    y := step * sind (angle) + y
end calculatexy

ReadMap ("map.txt", map, NumRows, NumCols)

DrawMap (map, NumRows, NumCols)

% MAIN SCREEN
Font.Draw ("B", 40, maxy - 30, font2, 12)
Font.Draw ("R", 65, maxy - 30, font2, 52)
Font.Draw ("E", 90, maxy - 30, font2, 47)
Font.Draw ("A", 115, maxy - 30, font2, 42)
Font.Draw ("K", 140, maxy - 30, font2, 14)
Font.Draw ("O", 165, maxy - 30, font2, 35)
Font.Draw ("U", 190, maxy - 30, font2, 46)
Font.Draw ("T", 215, maxy - 30, font2, 80)

Font.Draw ("LEVEL:", 420, maxy - 25, font1, white)
Font.Draw ("LIVES:", 620, maxy - 25, font1, white)

% LEVEL 1 ---------------------------------------------------------------------
setscreen ("nocursor")

% PADDLE COORDINATES
Paddlex1 := 370
Paddley1 := 10
Paddlex2 := 430
Paddley2 := 20

% BALL COORDINATES
Ballx := 400
Bally := 26

% X AND Y COORDINATES
x := 87
y := maxy - 100

% LEVEL AND LIVES SETTING
level := 1
lives := 3

direction := 0

% SET LEVELS
if level = 1 then
    Font.Draw ("1", 540, maxy - 25, font1, 12)
elsif level = 2 then
    Font.Draw ("2", 540, maxy - 25, font1, 52)
elsif level = 3 then
    Font.Draw ("1", 540, maxy - 25, font1, 47)
elsif level = 4 then
    Font.Draw ("1", 540, maxy - 25, font1, 42)
elsif level = 5 then
    Font.Draw ("1", 540, maxy - 25, font1, 14)
elsif level = 6 then
    Font.Draw ("1", 540, maxy - 25, font1, 35)
elsif level = 7 then
    Font.Draw ("1", 540, maxy - 25, font1, 46)
elsif level = 8 then
    Font.Draw ("1", 540, maxy - 25, font1, 80)
end if

% LIVES SETTING
if lives = 3 then
    Font.Draw ("3", 730, maxy - 25, font1, 12)
elsif lives = 2 then
    Font.Draw ("2", 730, maxy - 25, font1, 12)
elsif lives = 1 then
    Font.Draw ("1", 730, maxy - 25, font1, 12)
end if

% BOXES
for row : 1 .. 13
    drawfillbox (x, y, x + 40, y + 15, 12)
    x := x + 45
    for col : 1 .. 14
        drawfillbox (x, y, x + 40, y + 15, 12)
    end for
    y := y - 20
end for

% DRAW PADDLE AND BALL
drawfillbox (Paddlex1, Paddley1, Paddlex2, Paddley2, PaddleColour)

drawfilloval (Ballx, Bally, BallRad, BallRad, BallColour)

loop
    View.Update
    % GET MOUSE SIGNAL
    mousewhere (mx, my, button)

    % ERASE THE PADDLE AND BALL
    drawfillbox (Paddlex1, Paddley1, Paddlex2, Paddley2, black)

    drawfilloval (Ballx, Bally, BallRad, BallRad, black)

    Paddlex1 := mx - 30
    Paddlex2 := mx + 30
    
    if direction = 0 then
        Ballx := mx
    end if
    
    % PADDLE BOUNDARIES
    if Paddlex1 = maxx - 140 then
        Paddlex1 := maxx - 140
    end if
    
    % BALL BOUNDARIES
    if Ballx = maxx - 110 and direction = 0 then
        Ballx := maxx - 110
    end if
    
    % DIRECTION SETTINGS
    if direction = 1 then
        Ballx := Ballx + 5
        Bally := Bally + 5
    elsif direction = 2 then
        Ballx := Ballx + 5
        Bally := Bally - 5
    elsif direction = 3 then
        Ballx := Ballx - 5
        Bally := Bally - 5
    elsif direction = 4 then
        Ballx := Ballx - 5
        Bally := Bally + 5
    end if

    % BLUE BOUNDARY SETTINGS
    if Ballx + BallRad >= maxx - 84 then
        if direction = 1 then
            direction := 4
        elsif direction = 2 then
            direction := 3
        end if
    elsif Ballx - BallRad = maxy - 83 then
        if direction = 1 then
            direction := 2
        elsif direction = 4 then
            direction := 3
        end if
    end if
    
    % BEGINNING SETTINGS
    if button = down and Ballx = mx then        
        direction := 1
    end if

    if whatdotcolour (Ballx, Bally) = 102 then
        if direction = 2 and Bally 