Reputation: 73
Hello guys I want to make an animation using Drracket with 4 different objects going different ways like "left right up and down" but on-tick part I'm having a problem. So the problem is I'm giving the function a list and I want to take another made up new list and call the function with this "new" list again so it will automatically be recursion and shapes will move without stopping
My program is like this
(define R 300)
(define L (* 2 R))
(define U (* 2.5 R))
(define MYSCN (empty-scene L U))
;Structure:
(define-struct SHAPE (type posn direction color size))
;type is a shape of the object and it can only be circle or square (Image)
;posn is the initial point of the shape is drawn (Number)
;direction can be "left right up down" and represents the direction of the shape moves (String)
;color and size are the color and size of the object (String)
;Contructors
(define pos1 (make-posn 450 50))
(define pos3 (make-posn 200 540))
(define shape1 (make-SHAPE "circle" pos1 "down" "red" 50))
(define shape2 (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170))
(define shape3 (make-SHAPE "circle" pos3 "up" "green" 100))
(define shape4 (make-SHAPE "square" (make-posn 500 450) "left" "orange" 155))
(define shapelist1 (list shape1 shape2 shape3 shape4))
;Selectors
(posn-x pos1) ;400 (Number)
(posn-y (SHAPE-posn shape2)) ;200 (Number)
(SHAPE-type shape3) ;"circle" (Image)
(SHAPE-direction shape4) ;"left" (String)
(SHAPE-color shape1) ;"red" (String)
;Predicators
(SHAPE? shape1) ;true
(posn? shape2) ;false
(posn? pos1) ;true
;Purpose: Transferring all the shapes to the scene
;alltheshapes shapelist1-->image
(define (alltheshapes f)
(place-image (circle (SHAPE-size (first shapelist1)) "solid" (SHAPE-color (first shapelist1)))
(posn-x (SHAPE-posn (first shapelist1))) (posn-y (SHAPE-posn (first shapelist1)))
(place-image
(square (SHAPE-size (first(rest shapelist1))) "solid" (SHAPE-color (first (rest shapelist1))))
(posn-x (SHAPE-posn (first(rest shapelist1)))) (posn-y (SHAPE-posn (first(rest shapelist1))))
(place-image
(circle (SHAPE-size (first (rest (rest shapelist1)))) "solid" (SHAPE-color (first (rest (rest shapelist1)))))
(posn-x (SHAPE-posn (first (rest (rest shapelist1))))) (posn-y (SHAPE-posn (first (rest (rest shapelist1)))))
(place-image
(square (SHAPE-size(first(rest(rest(rest shapelist1))))) "solid" (SHAPE-color(first(rest(rest(rest shapelist1))))))
(posn-x (SHAPE-posn (first(rest(rest(rest shapelist1)))))) (posn-y (SHAPE-posn (first(rest(rest(rest shapelist1))))))
MYSCN)))))
I couldn't figure out the recursive part here
;Purpose: Change the position of the shape according to the current word
;Contract: moveshapes shapelist1-->creates a new shape
(define (moveshapes shapelist1)
(cond
((string=? (SHAPE-direction (first shapelist1)) "down") (append (list (make-SHAPE "circle" (make-posn 450 (+ 1 (posn-y pos1))) "down" "red" 50)) (moveshape (rest shapelist1))))
((string=? (SHAPE-direction (first shapelist1)) "right") (append (list (make-SHAPE "square" (make-posn (+ 1 (posn-x (SHAPE-posn shape2))) 230) "right" "purple" 170)) (moveshape (rest shapelist1))))
((string=? (SHAPE-direction (first shapelist1)) "up") (append (list(make-SHAPE "circle" (make-posn 200 (- (posn-y (SHAPE-posn shape3)) 1)) "up" "green" 100)) (moveshape (rest shapelist1))))
((string=? (SHAPE-direction (first shapelist1)) "left") (append (list(make-SHAPE "square" (make-posn (- (posn-x (SHAPE-posn shape4)) 1) 450) "left" "orange" 155))))
(define (Project super)
(big-bang super
(to-draw alltheshapes) ;Takes the current word and produce an image
(on-tick moveshapes))) ;It will take the shapes and create a new shape while moving them
(Project shapelist1)
Upvotes: 2
Views: 159
Reputation: 73
(define R 300)
(define L (* 2 R))
(define U (* 2.5 R))
(define MYSCN (empty-scene L U))
;Structure:
(define-struct SHAPE (type posn direction color size))
;type is a shape of the object and it can only be circle or square (Image)
;posn is the initial point of the shape that drawn (Number)
;direction can be "left right up down" and represents the direction of the shape that moves (String)
;color and size are the color and size of the object (String)
;Contructors
(define pos1 (make-posn 450 60))
(define pos3 (make-posn 160 620))
(define shape1 (make-SHAPE "circle" pos1 "down" "red" 50))
(define shape2 (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170))
(define shape3 (make-SHAPE "circle" pos3 "up" "green" 100))
(define shape4 (make-SHAPE "square" (make-posn 500 450) "left" "orange" 155))
(define shapelist1 (list shape1 shape2 shape3 shape4))
;Selectors
(posn-x pos1) ;450 (Number)
(posn-y (SHAPE-posn shape2)) ;230 (Number)
(SHAPE-type shape3) ;"circle" (String)
(SHAPE-direction shape4) ;"left" (String)
(SHAPE-color shape1) ;"red" (String)
;Predicators
(SHAPE? shape1) ;true
(posn? shape2) ;false
(posn? pos1) ;true
;*****************************************************************************************************************************************************************************************************
;Purpose: add all the image inside of the given list to a scene
;Contract: to-draw (alltheshapes LOS -> Images)
;Example
(check-expect (alltheshapes (list shape1)) (place-image (circle 50 "solid" "red") 450 60 MYSCN))
(check-expect (alltheshapes (list shape3)) (place-image (circle 100 "solid" "green") 160 620 MYSCN))
(check-expect (alltheshapes (list shape4)) (place-image (square 155 "solid" "orange") 500 450 MYSCN))
;Function
(define (alltheshapes a-list)
(cond
((empty? a-list) MYSCN)
((string=? (SHAPE-type (first a-list)) "circle")
(place-image
(circle (SHAPE-size (first a-list)) "solid" (SHAPE-color (first a-list)))
(posn-x (SHAPE-posn (first a-list))) (posn-y (SHAPE-posn (first a-list)))
(alltheshapes (rest a-list))))
((string=? (SHAPE-type (first a-list)) "square")
(place-image
(square (SHAPE-size (first a-list)) "solid" (SHAPE-color (first a-list)))
(posn-x (SHAPE-posn (first a-list))) (posn-y (SHAPE-posn (first a-list)))
(alltheshapes (rest a-list))))))
;Test
(alltheshapes (list shape2 shape3))
(alltheshapes (list shape1 shape3 shape4))
;*****************************************************************************************************************************************************************************************************
;Purpose: Moves the shapes every tick
;Contract: on-tick (moveshapes LOS->LOS)
;Example
(check-expect (moveshapes (list shape2)) (cons (make-SHAPE "square" (make-posn 101 230) "right" "purple" 170) '()))
(check-expect (moveshapes (list shape1)) (cons (make-SHAPE "circle" (make-posn 450 61) "down" "red" 50) '()))
(check-expect (moveshapes (list shape4)) (cons (make-SHAPE "square" (make-posn 499 450) "left" "orange" 155) '()))
;Function
(define (moveshapes a-list)
(cond
((empty? a-list) empty)
((string=? (SHAPE-direction (first a-list)) "down") (cons (make-SHAPE (SHAPE-type (first a-list)) (make-posn (posn-x (SHAPE-posn (first a-list))) (+ (posn-y (SHAPE-posn (first a-list))) 1))
"down" (SHAPE-color (first a-list)) (SHAPE-size (first a-list))) (moveshapes (rest a-list))))
((string=? (SHAPE-direction (first a-list)) "right")(cons (make-SHAPE (SHAPE-type (first a-list)) (make-posn (+ 1 (posn-x (SHAPE-posn (first a-list)))) (posn-y (SHAPE-posn (first a-list))))
"right" (SHAPE-color (first a-list)) (SHAPE-size (first a-list))) (moveshapes (rest a-list))))
((string=? (SHAPE-direction (first a-list)) "up") (cons (make-SHAPE (SHAPE-type (first a-list)) (make-posn (posn-x (SHAPE-posn (first a-list))) (- (posn-y (SHAPE-posn (first a-list))) 1))
"up" (SHAPE-color (first a-list)) (SHAPE-size (first a-list))) (moveshapes (rest a-list))))
((string=? (SHAPE-direction (first a-list)) "left") (cons (make-SHAPE (SHAPE-type (first a-list)) (make-posn (- (posn-x (SHAPE-posn (first a-list))) 1) (posn-y (SHAPE-posn (first a-list))))
"left" (SHAPE-color (first a-list)) (SHAPE-size (first a-list))) (moveshapes (rest a-list))))
(else a-list)))
;Test
(moveshapes (list shape2 shape1))
;*****************************************************************************************************************************************************************************************************
;----------------------------------------------------------------------------
;Purpose: Help to on-mouse command with creating all the shapes again as a list
;Contract: LOS-> (creates the original forms of the shapes)
;Examples
(check-expect (helperonmouse (list shape2 shape3)) (cons (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170)
(cons (make-SHAPE "circle" (make-posn 160 620) "up" "green" 100) '())))
(define (helperonmouse shapelist1)
(cond
((empty? shapelist1) empty)
(else (cons (make-SHAPE (SHAPE-type (first shapelist1)) (make-posn (posn-x (SHAPE-posn (first shapelist1))) (posn-y (SHAPE-posn (first shapelist1))))
(SHAPE-direction (first shapelist1)) (SHAPE-color (first shapelist1)) (SHAPE-size (first shapelist1))) (helperonmouse (rest shapelist1))))))
;Test
(helperonmouse (list shape1 shape4))
;----------------------------------------------------------------------------
;Purpose: Every time when you hit mouse1, the animation will restart
;Contract: on-mouse LOS -> LOS
;Examples
(check-expect (restart (list shape2) 3 5 "button-down") (cons(make-SHAPE"circle"(make-posn 450 60) "down" "red" 50) (cons (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170)
(cons (make-SHAPE "circle" (make-posn 160 620) "up" "green" 100) (cons (make-SHAPE "square" (make-posn 500 450) "left" "orange" 155)'())))))
(check-expect (restart (list shape4) 6 1 "button-down") (cons (make-SHAPE "circle" (make-posn 450 60) "down" "red" 50) (cons (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170)
(cons (make-SHAPE "circle" (make-posn 160 620) "up" "green" 100) (cons (make-SHAPE "square" (make-posn 500 450) "left" "orange" 155) '())))))
(check-expect (restart (list shape1) 4 2 "button-down") (cons (make-SHAPE "circle" (make-posn 450 60) "down" "red" 50) (cons (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170)
(cons (make-SHAPE "circle" (make-posn 160 620) "up" "green" 100) (cons (make-SHAPE "square" (make-posn 500 450) "left" "orange" 155) '())))))
;Function
(define (restart a-list x y clack)
(cond
((empty? a-list) empty)
((mouse=? clack "button-down") (helperonmouse shapelist1))
(else a-list)))
;Test
(restart (list shape1) 3 4 "button-down")
;*****************************************************************************************************************************************************************************************************
;Purpose: When you press the "d" button in your keyboard, one of the images will be deleted
;Contract: on-key LOS-> (- LOS 1)
;Examples
(check-expect (delete (list shape1 shape2) "d") (cons (make-SHAPE "square" (make-posn 100 230) "right" "purple" 170) '()))
(check-expect (delete (list shape2 shape3 shape4) "d") (cons (make-SHAPE "circle" (make-posn 160 620) "up" "green" 100) (cons (make-SHAPE "square" (make-posn 500 450) "left" "orange" 155) '())))
(check-expect (delete (list shape1) "d") '())
;Function
(define (delete a-list a-key)
(cond
((empty? a-list) empty)
((key=? a-key "d") (rest a-list))
(else a-list)))
;Test
(delete (list shape2 shape1) "d")
;*****************************************************************************************************************************************************************************************************
(define (Project super)
(big-bang super
(to-draw alltheshapes) ;Takes the current word and produce an image
(on-tick moveshapes) ;Takes the current word and everytick changes the coordinates of the shapes
(on-mouse restart) ;Takes the current word and create the original current word again
(on-key delete))) ;Takes the current word and remove one element inside of it
(Project shapelist1)
Upvotes: 0
Reputation: 135207
Before you move onto the animation part, I'd like to help you remove some of the pain points from your program above -
(require 2htdp/image)
; setup my scene
(define my-scene (empty-scene 600 750))
; define structure for scene elements
(define-struct element (image posn direction))
; define my elements
(define e1 (make-element (circle 50 "solid" "red") (make-posn 450 50) "down"))
(define e2 (make-element (square 170 "solid" "purple") (make-posn 100 230) "right"))
(define e3 (make-element (circle 100 "solid" "green") (make-posn 200 540) "up"))
(define e4 (make-element (square 155 "solid" "orange") (make-posn 500 450) "left"))
(define my-elements (list e1 e2 e3 e4))
; place elements into scene
(define (place-elements scene elements)
(if (null? elements)
scene
(place-image (element-image (car elements))
(posn-x (element-posn (car elements)))
(posn-y (element-posn (car elements)))
(place-elements scene (cdr elements)))))
(place-elements my-scene my-elements)
This renders the following scene -
If you're still stuck on the animation after reading this post, please let me know and I'll help you further.
Upvotes: 1