   (update [this] (update-sprite this))
   (update [this scene] (update-sprite this scene)))
 
-(defrecord SpritesheetSprite [spritesheet width height cell x y]
+(defn image-sprite
+  "Creates a sprite represented by the given image with the specified values"
+  ([{:keys [image] :as data}]
+   (let [{:keys [width height]} image]
+     (merge (ImageSprite. image width height 0 0 0 0)
+            data)))
+  ([{:keys [width height] :as image} x y]
+   (image-sprite image width image x y 0 0))
+  ([image width height x y]
+   (image-sprite image width height x y 0 0))
+  ([image width height x y velocity-x velocity-y]
+   (ImageSprite. image width height x y velocity-x velocity-y)))
+
+(defrecord SpritesheetSprite [spritesheet cell width height x y velocity-x velocity-y]
   TypeInfo
   (get-type [this] :spritesheet-sprite)
   SpriteActions

  (render [this context])
  (update [this] [this scene]))

(defrecord ImageSprite [image width height x y]
  TypeInfo
  (get-type [this] :image-sprite)
  SpriteActions

  (update [this] (update-animated-sprite this))
  (update [this scene] (update-animated-sprite this scene)))

(defn animated-sprite
  ([{:keys [animation] :as data}]
   (let [{:keys [cell-width cell-height]} (:spritesheet animation)]
     (merge (AnimatedSprite. animation cell-width cell-height 0 0 0 0)
            data)))
  ([{:keys [spritesheet] :as animation} x y]
   (let [{:keys [cell-width cell-height]} spritesheet]
     (animated-sprite animation cell-width cell-height x y 0 0)))
  ([animation width height x y]
   (animated-sprite animation width height x y 0 0))
  ([animation width height x y velocity-x velocity-y]
   (AnimatedSprite. animation width height x y velocity-x velocity-y)))

(defn ^:export new
  "Creates a sprite record based on graphics resource"
  [& args]
  (let [arg-1 (first args)
