Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tiny Golf
#10
TINY GOLF - DAY 4 

           
click the images to zoom in

 What's new ?
1. Something will interrupt you in the middle of the game :
  An alien / UFO will abduct you if the timer is below 25.
  It's weird if the UFO appears too soon or too many times...lol
2. Implement N7 features : json and image manipulation
3. Fixed bug :
  - flag position didn't follow the hole when restarting a new game.
  - you might see "a ghost ball" sometimes, when you dragged your mouse from point O while the ball was still flying   
4. Add some scenes : Disclaimer, Time Out             

 Controls :
 1. LEFT click and drag from O to aim
 2. ENTER to swing the golf club
 3. ESC to continue / quit

 Acknowledgements :
 - Libraries by Marcus :
  * polyline.n7, polyline path
  * sfx.n7, sound effects
  * json.n7, JSON manipulation
  * hiscore.n7, example in N7 by Marcus, original N6 by JSM
  * transform.n7 (collection of functions for image manipulation)
 - Some sound effects and draggable point on polyline By Kevin
  * hit_ball_sound, oh_no_sound are copied from the "Pool" game
  * https://naalaa.com/forum/thread-90-post-493.html#pid493
 - Discussion on text file, thanks to Tomaaz and Marcus
  * https://www.naalaa.com/forum/thread-109.html
 - Sprites :
  * UFO and alien sprites are copied from denaalaafender by Marcus
    https://naalaa.com/forum/thread-30.html
  * Mario https://www.spriters-resource.com/game_b...eet/12294/
  * Flag https://www.cleanpng.com/png-golf-golf-c...ur-7951521


Code:
'-----------------------------------
' TINY GOLF - DAY 4
' ==================
' Help Mario to make a hole-in-one
' and achieve The World Record
' of The Tiny Golf
'
' Made with N7_240310
'
' What's new ?
'1. Something will interrupt you in the middle of the game :
'   An alien / UFO will abduct you if the timer is below 25.
'   It's weird if the UFO appears too soon or too many times...lol
'2. Implement N7 features : json and image manipulation
'3. Fixed bug :
'   - flag position didn't follow the hole when restarting a new game.
'   - when you dragged your mouse from point O while the ball was still flying,
'     you might see "a ghost ball" sometimes.
'4. Add some scenes : Disclaimer, Time Out              
'
' Controls :
' 1. LEFT click and drag from O to aim
' 2. ENTER to swing the golf club
' 3. ESC to continue / quit
'
' Acknowledgements :
' - Libraries by Marcus :
'   * polyline.n7, polyline path
'   * sfx.n7, sound effects
'   * json.n7, JSON manipulation
'   * hiscore.n7, example in N7 by Marcus, original N6 by JSM
'   * transform.n7 (collection of functions for image manipulation)
' - Some sound effects and draggable point on polyline By Kevin
'   * hit_ball_sound, oh_no_sound are copied from the "Pool" game
'   * https://naalaa.com/forum/thread-90-post-493.html#pid493
' - Discussion on text file, thanks to Tomaaz and Marcus
'   * https://www.naalaa.com/forum/thread-109.html
' - Sprites :
'   * UFO and alien sprites are copied from denaalaafender by Marcus
'     https://naalaa.com/forum/thread-30.html
'   * Mario https://www.spriters-resource.com/game_boy_gbc/mariogolf/sheet/12294/
'   * Flag https://www.cleanpng.com/png-golf-golf-course-flag-pole-green-white-ball-pictur-7951521
'----------------------------------

'-----------------
' INITIALIZATION
'-----------------
#win32
include "assets/sound_effect.n7"
include "assets/transform.n7"
include "assets/highscore.n7"
include "polyline.n7"
include "json.n7"
set window "TINY GOLF",250,180,false,3
set redraw off
randomize clock()

'color definition
visible black_alpha = [0,0,0,70]
visible black       = [0,0,0]
visible white       = [255,255,255]
visible gray        = [150,150,150]
visible green_      = [0,80,0]
visible green       = [0,255,0,24]
visible yellow      = [200,200,0]

'Golf course
visible ox = 50,oy = 165     'origin point
axy = 360-45                 'angle between x and y-axis
length = 150                 'length of axis 
hole = [x:rnd(149,219),y:70] 'random x position of hole 

'Polygon
grass =
[
    ox,oy,
    length+ox,oy,
    ox+length*cos(rad(axy))+length-80 ,oy+length*sin(rad(axy)),
    ox+length*cos(rad(axy))          ,oy+length*sin(rad(axy))
]

'PolyLine Path
visible points = []
visible p10,p11,p20 = ox; p21=oy
ResetPoints()
path = PolyLine(points,0)'0 = opened path
distance = 0; speed = 5

'Player
visible Player = []
Player.x = ox -25
Player.y = oy -30
Player.standby = loadimage("assets/standby.png",2,1)
Player.face = loadimage("assets/say.png",3,1)
Player.swing = loadimage("assets/swing.png",3,1)
Player.timeout = loadimage("assets/timeout.png")
Player.abductedimg = loadimage("assets/abducted.png")
Player.abducted = false
Player.name = 0
Player.score = 50

'Sound effect (duration, pitch, fadeOut, sampleRate)
hit_ball_sound = CreateNoiseSfx(0.1, 1.05, 0, 14200)
visible oh_no_sound = CreateSineSfx(1.7,600,310,0.215,11600)

'highscore
visible hiFilename = "assets/highscore.txt"

'flag
flag = []
flag.img = loadimage("assets/flag.png",2,1)
flag.x = hole.x-width(flag.img)/2
flag.y = hole.y-height(flag.img) 
cell = 1 '1=left, 0=right
wind = 0

'other sprites : UFO, alien
visible UFO = []
UFO.img = Create(1,JSON_FromFile("assets/ufo.json"),3) 'image grid 4x1
UFO.state = true
UFO.cell = 0
UFO.x = 250
UFO.y = 50

visible alien = []
alien.img = Create(2,JSON_FromFile("assets/alien.json"),2) 'image grid 4x1
alien.state = false
alien.cell = 0
alien.x = UFO.x
alien.y = UFO.y+20

'Other initial values
hit = false
drawline = false
stay = false
visible title = true
visible timer = []; timer.Start = clock()
visible i=0,j=0 'counter
onjourney = false
ending = []; ending[1] = "I'll miss you..."; ending[2] = "Thanks"

'------------
' MAIN LOOP
'------------
while not keydown(KEY_ESCAPE,true)
   
    '----------------------
    '     title screen
    '----------------------
    if title=true then
        Action(7,0,0) 'opening screen
        Action(4,0,0) 'background story
        Action(5,0,0) 'wall of fame
        Action(6,0,0) 'input name
    endif
   
    '----------------------
    '   screen layout
    '----------------------
    '1. golf course
    set color green; draw poly grass,1
    set color white; draw poly grass
    set caret ox,oy;wln "O"
    set color black; draw ellipse hole.x,hole.y,3,2,1
    set color white; draw ellipse hole.x,hole.y,3,2
    set color white; draw image flag.img,flag.x,flag.y,cell
               
    'supporting lines
    'set color yellow; draw line 0,70,width(primary),70
    'set color yellow; draw line 144,0,144,height(primary)
    'set color yellow; draw line 224,0,224,height(primary)
    'set color yellow; draw line ox,oy,hole.x,hole.y
    'set color yellow; draw line 117,0,117,height(primary)

    '3. Score
    set color white; set caret 5,40; write round(Player.score)
    if round(Player.score) >= 1 then
        Player.score = Player.score - 0.05
    else
        timeout()
    endif
   
    '4. Draw other sprites             
    if Player.score <= 25 then AddUFO()
    if alien.state then AddAlien()
                                                              
    '----------
    ' Control
    '----------   
    'Left click mouse   
    if mousebutton(0) and not onjourney and Player.abducted = false then
        points[1][0] = mousex()
        points[1][1] = mousey()
       
        'use random number, wind blowing perhaps :-)
        wind = rnd(-10,10)
        p10 = points[1][0]+wind
        p11 = points[1][1]+wind
        drawline = true
    else
        drawline = false
    endif  

    'set how high your golf ball
    set color black_alpha; cls 'clear screen
    if drawline = true or stay then
        set color yellow
        draw line points[0][0],points[0][1],points[1][0],points[1][1]
        draw rect points[1][0] - 8, points[1][1] - 8,16,16 
        Say("ENTER to shoot")
        stay = true
    else
        Say("Drag point from O")       
    endif

    ' 2. ENTER to move ball along the PolyLine path
    if keydown(KEY_RETURN,true) and Player.abducted=false then

        'unpredictable wind ...lol
        if wind<0 then
            cell=0
        else
            cell=1
        endif
       
        Action(3,0,2)
        play sound hit_ball_sound
        hit = not hit 'toggle on/off
        stay = false
    endif   
    if hit then
        points[0]=[ox,oy]
        points[1]=[p10,p11]
        points[2]=[p20,p21]
       
        'points[2] coordinate
        p20 =  p10*2
        'p21 is on a line between (ox,oy) and (hole.x,hole.y)
        'the equation of the line is y = -0.71x + 200.45
        p21 = -0.71*p20 + 200.45       
       
        path = PolyLine(points,0)'0 = opened_path
        distance = (distance + speed)%path.GetLength()
        pos = path.GetPoint(distance, 1) '1=curved
       
        draw ellipse pos[0], pos[1], 2, 2, 1 '1 = filled ellipse
       
        set caret width(primary)/2, height(primary) - 25
        set color white;draw image Player.swing,Player.x,Player.y,2 'stay at the position during the shoot

        'stop the ball and clear the remaining path's distance
        if round(distance) > 0.95*path.GetLength()then
            free distance
            onjourney = false
            hit = false
            Say("Drag square from O")
        else
            onjourney = true
            Say("Wait for the ball")
        endif
                       
        'collision detection between the ball and the hole
        'cbh = distance between the center of the ball and the center of the hole
        cbh = sqr(pow(hole.x-pos[0],2)+pow(hole.y-pos[1],2))
        if cbh<(2+3) then
            Say("Hole-in-one,ENTER")
            PlayTune(1)
            free distance
            redraw
            hit = false
           
            'Renew variable values
            hole = [x:rnd(149,219),y:70]        'random x position of hole 
            ox = rnd(50,50+length);oy = 165     'random ox point
            Player.x = ox-25; Player.y = oy - 30'player's position
            ResetPoints()                       'polyline's path
            flag.x = hole.x-width(flag.img)/2   'flag position
            flag.y = hole.y-height(flag.img)    'flag position
            onjourney = false                   'ball back to golfer
                                               
            'Highscore
            if HS_AddEntry(Player.name, Player.score) then
                HS_Save(hiFilename)
            else
                Say("ESC to continue")
                redraw
                do;wait 1;until keydown(KEY_ESCAPE,true)
            endif   
            Action(5,0,0)
           
            Player.score = 50 'reset score               
        endif

    endif

    '-------------------------------
    ' Stand by
    '-------------------------------
    if hit=false then Action(0,0,1)
       
    redraw
    fwait 30
wend

'Ending
for i = 1 to 2
    Say(ending[i])
    redraw
    do;wait 1;until keydown(KEY_ESCAPE,true)
next

'-----------
' FUNCTIONS
'-----------
function Action(type,cell1,cell2)
    set color white
    select type
    case 0 'stand by position
        if Player.abducted = false then
            timer.Duration = (clock() - timer.Start)/1000
            if round(timer.Duration)%2 = 0 then
                i=cell2
            else
                i=cell1
            endif
            draw image Player.standby, Player.x, Player.y, i
        else
            draw image Player.abductedimg, Player.x+10, Player.y
        endif
    case 1 'Mario's face animation
        draw image Player.face, 20,5,j
        timer.Duration = (clock() - timer.Start)/1000
        if round(timer.Duration)%2 = 0 then
            if j <= 1 then
                j = j+1
            endif
        else
            j = 0
        endif
    case 3 'swing the golf club
        for k = cell1 to cell2
            'set color black
            '   draw rect Player.x,Player.y,width(Player.standby),height(Player.standby),1
            set color white
            draw image Player.swing, Player.x, Player.y,k
            redraw
            wait 250
        next
        'set color black; draw rect Player.x,Player.y,width(Player.standby),height(Player.standby),1
        redraw
    case 4'title screen
        title = false
        set color black;cls;set color white
        set caret width(primary)/2,0

        set justification center
        lines = split(system("type assets\story.txt"), chr(10))
        for k = 0 to sizeof(lines) - 1
            wln lines[k]
        next
        set justification left

        redraw
        PlayTune(1)
        do; wait 1; until keydown(KEY_ESCAPE,true)
    case 5'display wall of fame
        set color black;cls;set color white
        Say("Wall of Fame")
        HS_Load(hiFilename)
        Display_HiScore()    
        redraw
        PlayTune(1)
        do; wait 1; until keydown(KEY_ESCAPE,true)
    case 6'input name
        set color black;cls;set color white
        Say("Please Identify")
        set caret width(primary)/2-30,height(primary)/2; center "Your name:?  ";
        set caret width(primary)/2+20,height(primary)/2; Player.name = rln(10)       
        PlayTune(2)
        set caret width(primary)/2,height(primary)-20;center "Press ESC to continue"
        redraw
        do; wait 1; until keydown(KEY_ESCAPE,true)
    case 7'opening screen
        set color black;cls
        set color yellow; set caret width(primary)/2,10
        center "Disclaimer : "
        center
        center "This tiny game was made by"
        center "a hobbyist programmer."
        center "It's neither affliated with,"
        center "nor approved by Nintendo."
        center "All trademarks are"
        center "the property of "
        center "their respective owners"
        set color white;
        set caret width(primary)/2,height(primary)-20;center "Press ESC to continue"
        PlayTune(2)
        redraw
        do; wait 1; until keydown(KEY_ESCAPE,true)
    endsel
endfunc

'Reset draggable path points
function ResetPoints()
    points[0] = [ox,oy]
    points[1] = [ox,oy]
    points[2] = [ox,oy]
endfunc

'Say something on the screen
function Say(message)
    set color green_; draw rect 0,0,width(primary),35,1 '1 = filled rectangle
    set color white; set caret width(primary)/2,15; center message

    'Mario's face
    Action(1,0,2)
    draw line 0,35,width(primary),35
endfunc

function AddUFO()
    if UFO.x >=Player.x then
        UFO.x = UFO.x-1
    else
        UFO.x = Player.x
    endif
    if Player.x >=UFO.x and Player.x <=UFO.x+width(UFO.img) then
        UFO.state = false
        alien.state = true
        PlayTune(4)
    endif 
    if UFO.cell <=3 then
        UFO.cell = UFO.cell + 0.5
    else
        UFO.cell = 0
    endif
    set color white;draw image UFO.img,UFO.x,UFO.y,UFO.cell
endfunc

function AddAlien()
    alien.x = Player.x+10
    set color white; draw image alien.img,alien.x,alien.y,alien.cell       
    if alien.cell <=3 then
        alien.cell = alien.cell + 0.5
    else
        alien.cell = 0
    endif
    if alien.y<=Player.y-10 then
        alien.y = alien.y + 1   
    elseif alien.y < = Player.y then
        alien.y = alien.y - 1
        Player.y = Player.y - 1
        Player.abducted = true
        if alien.y <= UFO.y+20 then
            alien.state = false
            alien.y = -50
            Player.y = -50
            timeout()
        endif
    endif
endfunc

function timeout()
    free distance
    hit = false
    set color black;cls; set color white 'clear screen
    if alien.state = false Say("YOU'VE GONE :(")
    if round(Player.score) < 1 Say("TIME OUT..ESC")
    draw image Player.timeout,(width(primary)-width(Player.timeout))/2,40
    redraw
    play sound oh_no_sound       
    do;wait 1;until keydown(KEY_ESCAPE,true)
   
    ResetPoints()
    onjourney = false
    Player.score = 50
    Player.abducted = false
    Player.y = oy-30
    UFO.x = 250
    alien.y = UFO.y + 20
endfunc


Attached Files
.zip   golf_day4.zip (Size: 21.25 KB / Downloads: 4)
Reply


Messages In This Thread
Tiny Golf - by 1micha.elok - 03-21-2024, 01:31 PM
RE: Tiny Golf - by johnno56 - 03-21-2024, 06:02 PM
RE: Tiny Golf - by Marcus - 03-21-2024, 07:20 PM
RE: Tiny Golf - by johnno56 - 03-21-2024, 09:55 PM
RE: Tiny Golf - by 1micha.elok - 03-22-2024, 01:43 AM
RE: Tiny Golf - by johnno56 - 03-22-2024, 04:33 AM
RE: Tiny Golf - by 1micha.elok - 03-25-2024, 10:42 AM
RE: Tiny Golf - by Marcus - 03-25-2024, 07:09 PM
RE: Tiny Golf - by 1micha.elok - 03-26-2024, 02:42 AM
RE: Tiny Golf - by 1micha.elok - 03-28-2024, 02:17 AM
RE: Tiny Golf - by kevin - 03-28-2024, 10:21 AM
RE: Tiny Golf - by 1micha.elok - 03-28-2024, 10:28 AM
RE: Tiny Golf - by kevin - 03-28-2024, 02:12 PM

Forum Jump:


Users browsing this thread: 2 Guest(s)