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
stt = time.time() its = 0 times = [] while running: for event in pg.event.get(): if event.type == QUIT: running = False elif event.type == KEYDOWN and event.key == K_ESCAPE: running = False tscreen = table.draw() pg.draw.circle(tscreen,pg.Color('Green'),(90,200),10) screen.blit(tscreen,(0,100)) pg.display.flip() if pg.mouse.get_focused(): table.step(1/frrate,True,pg.mouse.get_pos()) else: table.step(1/frrate,False,None) table.cleanballs() ''' ca = table.catches(None) try: if (len(ca) != 0) & (ca[0] == True): print (time.time() - stt), its table.balls[0].remove(table.phys) table.balls.remove(table.balls[0]) except: print (time.time() - stt), its running = False clock.tick(frrate) times.append(clock.get_time())
epos = (xend,random.randint(int(dm[1]*.2),int(dm[1]*.8))) thend = ((random.random()-0.5) * 0.9 * math.pi) % (2*math.pi) spos, etht, bn, runup = trback(epos,dist,thend,dm, extrad,failer) # Test whether it fits the number of bounces & run up distance if spos is not None and bn == bounce and runup > 200: # Then make sure it simulates out correctly fwdtbl = PhysicsTable(dm, badzone = pg.Rect((0,0),(xend,dm[1]))) bvel = (v*math.cos(etht),v*math.sin(etht)) fwdtbl.addBall(spos,bvel) running = True its = 0 prebounce = 0 while running: fwdtbl.step(1/frrate,False) its += 1 if its == leadsteps: prebounce = fwdtbl.ball.bounces pball = fwdtbl.ball.getpos() if pball[0] <= epos[0]: running = False dx = pball[0]-epos[0] dy = pball[1]-epos[1] mvdst = math.sqrt(dx*dx + dy*dy) if mvdst <=1 and fwdtbl.ball.bounces == (bn+prebounce): needsfinding = False oline = str(tn)+','+dmwrt + ','+str(dist)+','+str(bounce)+','+str(spos[0])+','+str(spos[1])+','+str(etht)+','+str(epos[0])+','+str(epos[1])+','+str(thend)+'\n' print oline ofl.write(oline)