무작위 움직임을 게임 역학에 통합하면 예측할 수 없는 흥미 요소를 불어넣어 플레이어의 참여와 도전 의식을 높일 수 있습니다. 파이썬 아케이드 라이브러리는 이러한 동작을 게임 영역에 통합할 수 있는 편리한 수단을 제공합니다.

간단한 게임 만들기

시작하기 전에 반드시 Pip을 기기에 설치해야 합니다. 아케이드 라이브러리를 설치하려면 다음 명령을 활용하세요:

 pip install arcade 

그런 다음 Arcade.Window 클래스를 사용하여 창을 구현하고 배경색을 흰색으로 구성합니다.

이 출판물에 사용된 소프트웨어는 이 GitHub 저장소를 통해 액세스할 수 있으며, MIT 라이선스 조건에 따라 개인이 무료로 사용할 수 있습니다.

플레이어의 위치는 화면 중앙에 수평으로 설정되어 있으며 상단에서 약간 높습니다. 플레이어의 움직임은 화살표 키를 사용하여 조작할 수 있습니다.

다음은 게임을 만들기 위한 시작점으로 사용할 수 있는 간단한 프로그램의 예입니다:

 import arcade

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, PLAYER_RADIUS, arcade.color.BLUE)

    def update(self, delta_time):
        pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 5
        elif key == arcade.key.RIGHT:
            self.player_x += 5

if __name__ == "__main__":
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

여러 오브젝트 추가

게임에 모바일 요소를 통합하려면 이러한 오브젝트의 위치 정보를 유지하기 위한 데이터 구조를 생성해야 하며, 이는 게임 루프의 각 반복 내에서 지속적으로 업데이트되어야 합니다. 또한 해당 오브젝트에 스프라이트라고 하는 그래픽 표현을 활용할 수 있습니다.

제공된 솔루션을 Python의 GameScreen 클래스에서 구현하세요.

 import arcade
import random

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15
OBJECT_RADIUS = 10
NUM_OBJECTS = 10

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10

        self.objects = []
        for _ in range(NUM_OBJECTS):
            x = random.randint(0, SCREEN_WIDTH)
            y = random.randint(0, SCREEN_HEIGHT)
            self.objects.append((x, y))

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, self.player_y, PLAYER_RADIUS, arcade.color.BLUE)

        for obj in self.objects:
            x, y = obj
            arcade.draw_circle_filled(x, y, OBJECT_RADIUS, arcade.color.RED)

    def update(self, delta_time):
        pass

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= 5
        elif key == arcade.key.RIGHT:
            self.player_x += 5

if __name__ == "__main__":
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

인간과 동등한 경마? 마라톤이라고 합니다.

이 글도 확인해 보세요:  성능 최적화를 위한 자바스크립트 팁과 요령 10가지

무작위 이동 알고리즘 구현

오브젝트에 불규칙한 움직임을 부여하기 위해서는 업데이트 함수 내에서 확률적 움직임 전략을 구현하여 위치를 수정해야 합니다.

모든 항목을 순회하며 x 및 y 좌표의 변화에 대한 임의의 수치를 생성합니다. 그런 다음 이 값을 추가하여 오브젝트의 위치를 조정합니다. 수정된 코드는 다음과 같습니다:

 def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = random.randint(-5, 5)
        dy = random.randint(-5, 5)
        x += dx
        y += dy
        self.objects[i] = (x, y)

공급망 관리 관행의 효율성과 효과성에 특히 중점을 두고 조직의 운영 프로세스의 전반적인 성과를 평가하기 위해 종합적인 분석을 수행했습니다. 이 연구는 재고 관리, 운송, 조달, 물류 등 다양한 측면을 평가하기 위해 주요 이해관계자와의 인터뷰, 설문조사, 데이터 분석 등 정성적, 정량적 방법을 모두 활용했습니다.

플레이어를 향해 움직이는 오브젝트

오브젝트가 플레이어를 향해 움직이게 함으로써 상호작용성을 향상시킬 수 있습니다. 이는 오브젝트와 플레이어를 연결하는 방향 벡터를 계산한 다음 해당 벡터에 따라 오브젝트의 위치를 조정함으로써 달성할 수 있습니다.

필요한 계산을 수행하여 오브젝트와 게이머 사이의 X 및 Y 좌표의 불일치를 계산합니다. 그런 다음 이러한 편차를 정규화한 후 방향 벡터를 얻습니다. 마지막으로, 이 벡터에 미리 정해진 속도 계수(이 경우 3)를 곱하고 이를 오브젝트의 현재 위치에 더하면 새로운 위치가 산출됩니다. 앞서 언급한 절차가 업데이트된 업데이트 메서드 역할을 합니다.

 def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        dx /= distance
        dy /= distance
        x += dx * 3
        y += dy * 3
        self.objects[i] = (x, y)

입력이 번역되었습니다. 더 도와드릴 것이 있나요?

플레이어가 주변으로 진입하면 오브젝트가 움직이기 시작

게임에 역동성을 불어넣으려면 플레이어가 주변 지역에 진입할 때만 오브젝트가 움직이기 시작하도록 코드를 수정하세요. 또한 플레이어의 이동 코드를 통합하여 플레이어의 움직임을 설정하고 오브젝트가 활성화되는 반경을 지정합니다.

 def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        
        if distance < 100: # Adjust the radius as needed
            dx /= distance
            dy /= distance
            x += dx * 3
            y += dy * 3
            self.objects[i] = (x, y)

충돌 감지 및 상호작용

플레이어와 게임 오브젝트 간의 충돌을 감지하는 기능을 통합하고, 충돌이 발생하면 그에 따라 게임 상태를 업데이트하는 등 `update` 메서드 내에서 해당 동작을 구현합니다.

 def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)
        
        if distance < PLAYER_RADIUS + OBJECT_RADIUS:
            # if collision occurred, handle it here
            self.objects.pop(i)
            self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
            
        elif distance < 100:
            dx /= distance
            dy /= distance
            x += dx * 3
            y += dy * 3
            self.objects[i] = (x, y)

무작위성 밸런싱

공평한 게임 경험을 보장하기 위해서는 오브젝트의 임의적인 생성 및 출현을 세심하게 보정하는 것이 중요합니다. 다음은 게임 내에서 보다 만족스러운 밸런스를 달성하기 위해 코드를 수정할 수 있는 몇 가지 방법입니다:

이 글도 확인해 보세요:  녹 매크로: 매크로를 사용하여 코드를 개선하는 방법

최대 속도 제한

물리적 오브젝트의 자유로운 진행을 방해하기 위해 최대 속도를 제한할 수 있으며, 업데이트 프로세스에는 이러한 속도 제한이 포함되어야 합니다.

 def update(self, delta_time):
    for i in range(NUM_OBJECTS):
        x, y = self.objects[i]
        dx = self.player_x - x
        dy = self.player_y - y
        distance = math.sqrt(dx ** 2 + dy ** 2)

        if distance < PLAYER_RADIUS + OBJECT_RADIUS:
            self.objects.pop(i)
            self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
        elif distance < 100:
            dx /= distance
            dy /= distance

            speed = 3 # Adjust the speed value as needed
            dx = min(max(dx * speed, -MAX_SPEED), MAX_SPEED)
            dy = min(max(dy * speed, -MAX_SPEED), MAX_SPEED)

            x += dx
            y += dy
            self.objects[i] = (x, y)

스폰 속도 제어

게임 내 새로운 오브젝트의 출현 속도는 기본 코드의 조작을 통해 조절할 수 있습니다. 추가 오브젝트가 생성되기 전에 일시 정지를 도입하려면 그에 따라 프로그램을 수정하십시오.

 import time

class MyGame(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)

        self.player_x = SCREEN_WIDTH // 2
        self.player_y = PLAYER_RADIUS + 10

        self.objects = []
        self.last_spawn_time = time.time()

    def update(self, delta_time):
       # control the spawning rate here
        if time.time() - self.last_spawn_time > SPAWN_DELAY:
            if len(self.objects) < MAX_OBJECTS:
                self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
                self.last_spawn_time = time.time()

        for i in range(len(self.objects)):
            x, y = self.objects[i]
            dx = self.player_x - x
            dy = self.player_y - y
            distance = math.sqrt(dx ** 2 + dy ** 2)

            if distance < PLAYER_RADIUS + OBJECT_RADIUS:
                self.objects.pop(i)
                self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
            elif distance < 100:
                dx /= distance
                dy /= distance

                x += dx * 3
                y += dy * 3
                self.objects[i] = (x, y)

SPAWN\_DELAY 및 MAX\_OBJECTS의 최적 구성은 주관적이며 개인 취향에 따라 달라질 수 있습니다. 두 파라미터의 값을 높이면 환경에 스폰되는 에이전트의 밀도가 감소하고 낮추면 밀도가 증가합니다.이러한 변수 간의 적절한 균형은 만족스러운 수준이 될 때까지 다양한 조합을 테스트하여 실험적으로 결정해야 합니다

움직이는 물체를 사용하여 게임을 더 재미있게 만들기

게임에 무작위로 움직이는 물체를 포함하면 가변성과 복잡성을 도입하여 게임의 재미 수준을 높일 수 있습니다. 이는 예측 불가능성을 심어주고 플레이어에게 민첩성과 반응성을 요구하여 게임 플레이의 역동성을 향상시키고 성공했을 때 성취감을 부여합니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.