# 5.2 꽃잎 한 장으로 꽃송이를 만들어요 - 반복

이번 장에서는 엔트리 기초책의 두 번째 예제로 '반복' 이란 알고리즘의 개념을 익히기 위한 예제이다. 이전 장에서 우리는 파이게임제로가 제공하는 오브젝트를 활용한 코딩에 대한 기본적이면서 중요한 내용을 이미 섭렵했기 때문에, 앞으로의 남은 예제들에 대한 코딩의 이해는 크게 어렵지 않을 것을 예상할 수 있다. 따라서, 기존 내용을 다시 반복할 필요없이 기존 장에서 배우지 못한 새롭게 등장한 코드에 대해서만 집중적으로 다루도록 하겠다.

{% code lineNumbers="true" %}
```python
from pgzhelper import *

WIDTH = 480
HEIGHT = 270

leaf = Actor('pink_leaf', (WIDTH / 2, HEIGHT / 2), anchor=('middle', 'bottom'))
leaf.scale = 0.5

def draw():
    for _ in range(6):
        leaf.draw()
        leaf.angle += 60
```
{% endcode %}

새롭게 등장한 코드는 6번 라인에서 처음 등장하는데, 기존에 Actor 오브젝트를 생성서 사용해 보지 못한 **anchor** 라는 속성이 등장한다. anchor의 뜻은 배가 움직이지 않도록 위치 고정하기 위해내리는 '닻'이란 의미인데, 그 뜻으로부터 그 목적을 살짝 유추해 볼 수 있다. 정답을 바로 말하면, **우리가 엔트리 블록코딩에서 이미 사용해봤던 각 오브젝트마다 갖고 있는 중심점을 말하는 것으로, 파이게임제로에서는 이를 anchor라고 지칭**한다.&#x20;

엔트리 때도 그랬지만, **기본적으로 Actor 객체의 디폴트 anchor는 이미지의 한 가운데(center)가 중심이다.** 우리는 필요에 따라 오브젝트의 중심점을 아래 화면에서 보이는 것처럼 오브젝트의 하단중앙(middle-bottom 또는 bottom-middle)으로 옮길 수 있는데,  이 경우 Actor 오브젝트의 anchor 속성에 **anchor=('middle', 'bottom')** 이란 값을 설정하고 오브젝트를 생성하면 되는 것이다.&#x20;

이 예제에서 왜 중심점이 꽃잎의 한가운데가 아니라, 꽃잎의 하단 가장자리로 옮겨져야 하는지는 이미 엔트리 블록코딩으로 실습하면서 다 이해했을 것으로 믿지만, 간략히 다시 설명하면 꽃잎의 어느 부분을 중심으로 해서 꽃잎이 원모양으로 회전하면서 최종적인 온전한 꽃을 완성하는지에 따라 중심점의 재설정이 필요하다 하겠다.

<figure><img src="https://3827255905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd15BjHzo0klcYpoHnPr6%2Fuploads%2FYeeO5hwLgsV9I6osJDZy%2Fimage.png?alt=media&#x26;token=d54a043e-330f-4838-b176-5788c074ca88" alt="" width="563"><figcaption></figcaption></figure>

이제 이전에 사용해 보지 못한 Actor 오브젝트의 남은 속성은 하나 더 있는데, 바로 12번 라인의 **angle** 속성이다. 이건 그 이름에서 쉽게 유추할 수 있듯이, 오브젝트를 특정각도로 회전시켜 화면에 출력하기 위한 목적이다. 완전한 꽃송이 형태로 만들기 위해 개별 꽃잎들을 그리기 전 60도씩 회전시켜 총 6회 반복하며 6장의 꽃잎을 통해 최종 원형(360도)의 온전한 꽃을 완성하려는 목적이다. 다만, 유념해 두어야 할 내용은 아래의 그림에서 보는 바와 같이 Actor 오브젝트의 회전방향이 시계방향(CW: ClockWise)이냐 반시계반향(CCW: Counter CloockWise)이냐에 따라서 angle이 양수가 될 수도 있고, 음수가 될 수도 있다.&#x20;

<figure><img src="https://3827255905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd15BjHzo0klcYpoHnPr6%2Fuploads%2FWyWVXASuFlPmouKbMJiR%2Fimage.png?alt=media&#x26;token=8d3a3bf3-e2a8-47a0-88cb-6af28d157897" alt="" width="563"><figcaption></figcaption></figure>

이전 장은 지난 장의 기본 개념을 충분히 숙지했다라면, 이해에 특별히 어려운 점은 없었을 것이다. 마지막으로 최종 실행결과를 보는 것으로 본 장을 마무리 하고, 연이어 세 번째 예제로 넘어가도록 하자.

<figure><img src="https://3827255905-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fd15BjHzo0klcYpoHnPr6%2Fuploads%2FLK5zb4yxZJzSJ0iQHtju%2FKapture%202024-07-17%20at%2021.41.05.gif?alt=media&#x26;token=b39c85c5-76ac-4c75-b0b8-e785367e7b33" alt=""><figcaption></figcaption></figure>

참고로 여러분은 위 코드의 실행결과로써 위와 같이 단계적으로 한장씩 그려지는 결과를 보지는 못할 것이다. 이렇게 의도적으로 시간차를 두고 그리는 것에 관심을 있는 분들을 위해 참고 코드를 추가로 남겨놓겠다. 여기서 주의할 것은 파이게임제로의 draw 콜백함수(메소드)가 호출된다고 해도, 내부적으로는 즉시 화면에 그려지는 것은 아니므로 일부러**pygame.display.update()** 함수(메소드)를 통해 강제로 즉시 그리도록 하는 코드가 적용되어 있음을 알 수 있다. 다만, 해당 함수사용을 위해서는 pyagme 외부 라이브러리를 **import** 해와야 함을 기억하자.

```python
from pgzhelper import *
import pygame

WIDTH = 480
HEIGHT = 270

leaf = Actor('pink_leaf', (WIDTH / 2, HEIGHT / 2), anchor=('middle', 'bottom'))
leaf.scale = 0.5

def draw():
    for _ in range(6):
        leaf.draw()
        pygame.display.update()
        game.time.sleep(0.5)
        leaf.angle += 60
```
