require "app/bounce.rb" BOUNCE_ACCL = 1.02 GRAVITY = 0.5 MIN_GRAVITY = 0.1 MAX_GRAVITY = 2.0 STEP_GRAVITY = 0.02 MIN_BOUNCE = 1.0 MAX_BOUNCE = 1.1 STEP_BOUNCE = 0.0011 CX = 636 CY = 399 CR = 205 def tick args # INIT # circle cx = CX cy = CY cr = CR # pause if args.state.paused.nil? args.state.paused = true args.state.ball = { x: 500, y: 500, } args.state.ball_vector = { x: 0, y: 0 } args.state.bounce = BOUNCE_ACCL args.state.gravity = GRAVITY end # INPUT if args.inputs.keyboard.key_up.space args.state.paused = !args.state.paused if !args.state.paused #REINIT with inputs args.state.ball = { x: 500+Math.rand(150), y: 400+Math.rand(50), } args.state.ball_vector = { x: 0, y: 0 } end end # MENU CONTROLS if args.inputs.right && args.state.paused args.state.gravity += STEP_GRAVITY if args.state.gravity < MAX_GRAVITY elsif args.inputs.left && args.state.paused args.state.gravity -= STEP_GRAVITY if args.state.gravity > MIN_GRAVITY end if args.inputs.up && args.state.paused args.state.bounce += STEP_BOUNCE if args.state.bounce < MAX_BOUNCE elsif args.inputs.down && args.state.paused args.state.bounce -= STEP_BOUNCE if args.state.bounce > MIN_BOUNCE end # LOOP if !args.state.paused #ball vector move_x = args.state.ball_vector[:x] move_y = args.state.ball_vector[:y] # apply gravity move_y = move_y - args.state.gravity args.state.ball_vector[:x] = move_x args.state.ball_vector[:y] = move_y # bounce x = args.state.ball[:x] y = args.state.ball[:y] new_x = x + move_x new_y = y + move_y if bouncing?(new_x,new_y,cx,cy,cr) new_move_x, new_move_y = reflection_vector(x,y,cx,cy,move_x,move_y) args.state.ball_vector[:x] = new_move_x * args.state.bounce args.state.ball_vector[:y] = new_move_y * args.state.bounce # play sound sound = Math.rand(3)+1 args.outputs.sounds << "sounds/bounce#{sound}.wav" end # move the ball move_x = args.state.ball_vector[:x] move_y = args.state.ball_vector[:y] args.state.ball[:x] = args.state.ball[:x] + move_x args.state.ball[:y] = args.state.ball[:y] + move_y end # END? if !args.state.paused if too_fast?(move_x, move_y, cr) #RESET state and pause args.state.ball = { x: 500, y: 500, } args.state.ball_vector = { x: 0, y: 0 } args.state.paused = true end end # RENDER # # BG bg = args.state.paused ? 'sprites/BG1_menu.png' : 'sprites/BG1.png' args.outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: bg } if args.state.paused # Render menu args.outputs.labels << [640, 40, "Press to start the game", 6, 1] # min_x = 440 # mid = 615 # max_x = 780 # l = 340 gravity_x = 440 + args.state.gravity * 179 args.outputs.sprites << { x: gravity_x, y: 445, w: 32, h: 32, path: 'sprites/slider.png' } bounce_x = 440 + (args.state.bounce - 1)*3400 args.outputs.sprites << { x: bounce_x, y: 325, w: 32, h: 32, path: 'sprites/slider.png' } end # BALL args.outputs.sprites << { x: args.state.ball[:x]-16, y: args.state.ball[:y]-16, w: 32, h: 32, path: 'sprites/ball.png' } if !args.state.paused end