def runinstructs(samples,screen,leadsteps): # Welcome and let people just move the paddle around if display_instructions(ipinstruct.welcome,screen,keymove = False): safequit() table = PhysicsTable((1000,900)) table.addPaddle((50,450),paddlelen,'v',True) toffset = (int((screen.get_size()[0]-1000)/2),100 + int((screen.get_size()[1]-900-100)/2)) running = True while running: for event in pg.event.get(): if event.type == QUIT: safequit(outfile) elif event.type == KEYDOWN and quitevent(): safequit(outfile) elif event.type == MOUSEBUTTONDOWN: running = False if pg.mouse.get_focused(): mp = pg.mouse.get_pos() mpoff = (mp[0] - toffset[0], mp[1] - toffset[1]) r = table.step(1/frrate,True,mpoff) else: r = table.step(1/frrate,False,None) screen.fill(pg.Color('White')) prtexttop("Click to continue",screen,toffset[1],toffset[0],toffset[0]+1000,None) tscreen = table.draw() screen.blit(tscreen,toffset) pg.display.flip() # Give instructions and show examples building in complexity if display_instructions(ipinstruct.basictrial,screen,keymove=False): safequit() runtrial(samples[0],screen,leadsteps,None,None,noocclude = True) if display_instructions(ipinstruct.slanttrial,screen,keymove=False): safequit() runtrial(samples[1],screen,leadsteps,None,None,noocclude = True) if display_instructions(ipinstruct.bouncetrial,screen,keymove=False): safequit() runtrial(samples[2],screen,leadsteps,None,None,noocclude = True) if display_instructions(ipinstruct.smalltrial,screen,keymove=False): safequit() runtrial(samples[3],screen,leadsteps,None,None,noocclude = True) if display_instructions(ipinstruct.largetrial,screen,keymove=False): safequit() runtrial(samples[4],screen,leadsteps,None,None,noocclude = True) if display_instructions(ipinstruct.occludetrial,screen,keymove=False): safequit() runtrial(samples[5],screen,leadsteps,None,None) if display_instructions(ipinstruct.preexamples,screen,keymove=False): safequit() for i in range(6,12): runtrial(samples[i],screen,leadsteps,None,None) if display_instructions(ipinstruct.postinstruct,screen,keymove=False): safequit()
def runtrial(trial, screen, leads,score, sID,outfile = None, noocclude = False): its = 0 prebounce = 0 running = True catch = None failarea = pg.Rect((0,0),(55,trial.dim[1])) paddley = None toffset = (int((screen.get_size()[0]-trial.dim[0])/2),100 + int((screen.get_size()[1]-trial.dim[1]-100)/2)) table = PhysicsTable(trial.dim, ball_rad = ballsize, badzone = failarea) table.addPaddle((50,trial.dim[1]/2),paddlelen,'v',True) targx = 50 + ballsize clock = pg.time.Clock() # Let the subject get set up running = True while running: for event in pg.event.get(): if event.type == QUIT: safequit(outfile) elif event.type == KEYDOWN and quitevent(): safequit(outfile) elif event.type == MOUSEBUTTONDOWN: running = False if pg.mouse.get_focused(): mp = pg.mouse.get_pos() mpoff = (mp[0] - toffset[0], mp[1] - toffset[1]) r = table.step(1/frrate,True,mpoff,xtarg = targx) else: r = table.step(1/frrate,False,None,xtarg = targx) clock.tick(frrate) pg.display.set_caption('FPS: ' + str(clock.get_fps())) screen.fill(pg.Color('White')) prtexttop("Click to shoot the ball",screen,toffset[1],toffset[0],toffset[0]+trial.dim[0],score) tscreen = table.draw() screen.blit(tscreen,toffset) pg.display.flip() # Add the ball and start the trial table.addBall(trial.initpos,trial.vel) running = True while running: for event in pg.event.get(): if event.type == QUIT: safequit(outfile) elif event.type == KEYDOWN and quitevent(): safequit(outfile) if pg.mouse.get_focused(): mp = pg.mouse.get_pos() mpoff = (mp[0] - toffset[0], mp[1] - toffset[1]) r = table.step(1/frrate,True,mpoff,xtarg = targx) else: r = table.step(1/frrate,False,None,xtarg = targx) its += 1 if its == leads: prebounce = table.ball.bounces clock.tick(frrate) pg.display.set_caption('FPS: ' + str(clock.get_fps())) screen.fill(pg.Color('White')) prtexttop(None,screen,toffset[1],toffset[0],toffset[0]+trial.dim[0],score) tscreen = table.draw() if its > leadsteps and noocclude == False: pg.draw.rect(tscreen,pg.Color('Grey'),Rect((53,1),(trial.dim[0]-54,trial.dim[1]-2))) screen.blit(tscreen,toffset) pg.display.flip() catch = table.catches() if catch == True or catch == False: running = False paddley = table.padend if paddley is None: print table.paddle.getcenter()[1] print table.ball.getpos() raise Exception('DID NOT CAPTURE PADDLE LOCATION') # Show results of trial if catch == True: fintxt = 'Nice catch! Click for the next trial' if score is not None: score += 1 else: fintxt = 'You missed. Click for the next trial' running = True while running: for event in pg.event.get(): if event.type == QUIT: safequit(outfile) elif event.type == KEYDOWN and quitevent(): safequit(outfile) elif event.type == MOUSEBUTTONDOWN: running = False clock.tick(frrate) pg.display.set_caption('FPS: ' + str(clock.get_fps())) screen.fill(pg.Color('White')) prtexttop(fintxt,screen,toffset[1],toffset[0],toffset[0]+trial.dim[0],score) tscreen = table.draw() screen.blit(tscreen,toffset) pg.display.flip() # Write to output file if outfile: outfile.write(sID+','+str(trial.n)+','+trial.dimtxt+','+str(trial.dist)+','+str(trial.bounces)+','+str(catch)+','+str(trial.endpt[1])+','+str(paddley)+'\n') pixelsoff = abs(paddley - trial.endpt[1]) return catch, pixelsoff