title: psychopy polygon on top of image
body: <p>using psychopy ver 1.81.03 on a mac I want to draw a polygon (e.g. a triangle) on top of an image.
  So far, my image stays always on top and thus hides the polygon, no matter the order I put them in. This also stays true if I have the polygon start a frame later than the image.</p>
  
  <p>e.g. see inn the code below (created with the Builder before compiling) how both a blue square and a red triangle are supposed to start at frame 0, but when you run it the blue square always covers the red triangle!?</p>
  
  <p>Is there a way to have the polygon on top? Do I somehow need to merge the image and polygon before drawing them?</p>
  
  <p>Thank you so much for your help!!</p>
  
  <p>Sebastian</p>
  
  <pre><code>#!/usr/bin/env python2
  # -*- coding: utf-8 -*-
  """
  This experiment was created using PsychoPy2 Experiment Builder (v1.81.03), Sun Jan 18 20:44:26 2015
  If you publish work using this script please cite the relevant PsychoPy publications
    Peirce, JW (2007) PsychoPy - Psychophysics software in Python. Journal of Neuroscience Methods, 162(1-2), 8-13.
    Peirce, JW (2009) Generating stimuli for neuroscience using PsychoPy. Frontiers in Neuroinformatics, 2:10. doi: 10.3389/neuro.11.010.2008
  """
  
  from __future__ import division  # so that 1/3=0.333 instead of 1/3=0
  from psychopy import visual, core, data, event, logging, sound, gui
  from psychopy.constants import *  # things like STARTED, FINISHED
  import numpy as np  # whole numpy lib is available, prepend 'np.'
  from numpy import sin, cos, tan, log, log10, pi, average, sqrt, std, deg2rad, rad2deg, linspace, asarray
  from numpy.random import random, randint, normal, shuffle
  import os  # handy system and path functions
  
  # Ensure that relative paths start from the same directory as this script
  _thisDir = os.path.dirname(os.path.abspath(__file__))
  os.chdir(_thisDir)
  
  # Store info about the experiment session
  expName = u'test_triangle_over_square'  # from the Builder filename that created this script
  expInfo = {'participant':'', 'session':'001'}
  dlg = gui.DlgFromDict(dictionary=expInfo, title=expName)
  if dlg.OK == False: core.quit()  # user pressed cancel
  expInfo['date'] = data.getDateStr()  # add a simple timestamp
  expInfo['expName'] = expName
  
  # Data file name stem = absolute path + name; later add .psyexp, .csv, .log, etc
  filename = _thisDir + os.sep + 'data/%s_%s_%s' %(expInfo['participant'], expName, expInfo['date'])
  
  # An ExperimentHandler isn't essential but helps with data saving
  thisExp = data.ExperimentHandler(name=expName, version='',
      extraInfo=expInfo, runtimeInfo=None,
      originPath=None,
      savePickle=True, saveWideText=True,
      dataFileName=filename)
  #save a log file for detail verbose info
  logFile = logging.LogFile(filename+'.log', level=logging.EXP)
  logging.console.setLevel(logging.WARNING)  # this outputs to the screen, not a file
  
  endExpNow = False  # flag for 'escape' or other condition =&gt; quit the exp
  
  # Start Code - component code to be run before the window creation
  
  # Setup the Window
  win = visual.Window(size=(1280, 800), fullscr=True, screen=0, allowGUI=False, allowStencil=False,
      monitor='testMonitor', color=[0,0,0], colorSpace='rgb',
      blendMode='avg', useFBO=True,
      )
  # store frame rate of monitor if we can measure it successfully
  expInfo['frameRate']=win.getActualFrameRate()
  if expInfo['frameRate']!=None:
      frameDur = 1.0/round(expInfo['frameRate'])
  else:
      frameDur = 1.0/60.0 # couldn't get a reliable measure so guess
  
  # Initialize components for Routine "trial"
  trialClock = core.Clock()
  ISI = core.StaticPeriod(win=win, screenHz=expInfo['frameRate'], name='ISI')
  square = visual.ImageStim(win=win, name='square',units='pix', 
      image=None, mask=None,
      ori=0, pos=[0, 0], size=[200, 200],
      color=u'blue', colorSpace='rgb', opacity=1,
      flipHoriz=False, flipVert=False,
      texRes=128, interpolate=True, depth=-1.0)
  polygon = visual.ShapeStim(win=win, name='polygon',units='pix', 
      vertices = [[-[200, 300][0]/2.0,-[200, 300][1]/2.0], [+[200, 300][0]/2.0,-[200, 300][1]/2.0], [0,[200, 300][1]/2.0]],
      ori=0, pos=[0, 0],
      lineWidth=1, lineColor=[1,1,1], lineColorSpace='rgb',
      fillColor=u'red', fillColorSpace='rgb',
      opacity=1,interpolate=True)
  
  # Create some handy timers
  globalClock = core.Clock()  # to track the time since experiment started
  routineTimer = core.CountdownTimer()  # to track time remaining of each (non-slip) routine 
  
  #------Prepare to start Routine "trial"-------
  t = 0
  trialClock.reset()  # clock 
  frameN = -1
  # update component parameters for each repeat
  # keep track of which components have finished
  trialComponents = []
  trialComponents.append(ISI)
  trialComponents.append(square)
  trialComponents.append(polygon)
  for thisComponent in trialComponents:
      if hasattr(thisComponent, 'status'):
          thisComponent.status = NOT_STARTED
  
  #-------Start Routine "trial"-------
  continueRoutine = True
  while continueRoutine:
      # get current time
      t = trialClock.getTime()
      frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
      # update/draw components on each frame
  
      # *square* updates
      if frameN &gt;= 0 and square.status == NOT_STARTED:
          # keep track of start time/frame for later
          square.tStart = t  # underestimates by a little under one frame
          square.frameNStart = frameN  # exact frame index
          square.setAutoDraw(True)
  
      # *polygon* updates
      if frameN &gt;= 0 and polygon.status == NOT_STARTED:
          # keep track of start time/frame for later
          polygon.tStart = t  # underestimates by a little under one frame
          polygon.frameNStart = frameN  # exact frame index
          polygon.setAutoDraw(True)
      # *ISI* period
      if t &gt;= 0.0 and ISI.status == NOT_STARTED:
          # keep track of start time/frame for later
          ISI.tStart = t  # underestimates by a little under one frame
          ISI.frameNStart = frameN  # exact frame index
          ISI.start(0.5)
      elif ISI.status == STARTED: #one frame should pass before updating params and completing
          ISI.complete() #finish the static period
  
      # check if all components have finished
      if not continueRoutine:  # a component has requested a forced-end of Routine
          routineTimer.reset()  # if we abort early the non-slip timer needs reset
          break
      continueRoutine = False  # will revert to True if at least one component still running
      for thisComponent in trialComponents:
          if hasattr(thisComponent, "status") and thisComponent.status != FINISHED:
              continueRoutine = True
              break  # at least one component has not yet finished
  
      # check for quit (the Esc key)
      if endExpNow or event.getKeys(keyList=["escape"]):
          core.quit()
  
      # refresh the screen
      if continueRoutine:  # don't flip if this routine is over or we'll get a blank screen
          win.flip()
      else:  # this Routine was not non-slip safe so reset non-slip timer
          routineTimer.reset()
  
  #-------Ending Routine "trial"-------
  for thisComponent in trialComponents:
      if hasattr(thisComponent, "setAutoDraw"):
          thisComponent.setAutoDraw(False)
  win.close()
  core.quit()
  </code></pre>