강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

컴퓨터님의 프로필 이미지
컴퓨터

작성한 질문수

파이썬 무료 강의 (활용편1) - 추억의 오락실 게임 만들기 (3시간)

충돌 처리

똑같이 따라 쳤는데 오류가 생겨요

작성

·

299

0

나도코딩님처럼 똑같이 쳤는데 NameError: name 'ball_to_remove' is not defined 이런 오류가 떠여 도와주세요 ㅠㅠ

import os
import pygame
#########################################################
# 기본 초기화 (반드시 해야 하는 것들)
pygame.init() # 초기화 (반드시 필요)

# 화면 크기 설정
screen_width = 640 # 가로 크기
screen_height = 480 # 세로 크기
screen = pygame.display.set_mode((screen_widthscreen_height))

# 화면 타이틀 설정
pygame.display.set_caption("서준이의 게임2"#게임 이름

# FPS
clock = pygame.time.Clock()
#########################################################

# 1. 사용자 게임 초기화 (배경 화면, 게임 이미지, 좌표, 속도, 폰트 등)
current_path = os.path.dirname(__file__) # 현재 파일의 위치 반환
image_path = os.path.join(current_path"images"# images 폴더 위치 반환

# 배경 만들기
background = pygame.image.load(os.path.join(image_path"background.png"))

# 스테이지 만들기
stage = pygame.image.load(os.path.join(image_path"stage.png"))
stage_size = stage.get_rect().size
stage_height = stage_size[1# 스테이지의 높이 위에 캐릭터를 두기 위해 사용

# 캐릭터 만들기
character = pygame.image.load(os.path.join(image_path"character.png"))
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos =(screen_width /2) - (character_width /2)
character_y_pos = screen_height - character_height - stage_height

# 캐릭터 이동 방향
character_to_x = 0

# 캐릭터 이동 속도
character_speed = 5

# 무기 만들기
weapon = pygame.image.load(os.path.join(image_path"weapon.png"))
weapon_size = weapon.get_rect().size
weapon_width = weapon_size[0]

# 무기는 한 번에 여러 발 발사 가능
weapons = []

# 무기 이동 속도
weapon_speed = 10

# 공 만들기 (4개 크기에 대해 따로 처리)
ball_images = [
    pygame.image.load(os.path.join(image_path"balloon1.png")),
    pygame.image.load(os.path.join(image_path"balloon2.png")),
    pygame.image.load(os.path.join(image_path"balloon3.png")),
    pygame.image.load(os.path.join(image_path"balloon4.png"))]

# 공 크기에 따른 최초 스피드
ball_speed_y = [-18, -15, -12, -9# index 0, 1, 2, 3 에 해당하는 값

# 공들
balls= []

# 최초 발생하는 큰 공 추가
balls.append({
    "pos_x" : 50# 공의 x 좌표
    "pos_y" : 50# 공의 y 좌표
    "img_idx" : 0# 공의 이미지 인덱스
    "to_x"3# x축 이동방향, -3 이면 왼쪽으로, 3 이면 오른쪽으로
    "to_y": -6# y축 이동방향,
    "init_spd_y"ball_speed_y[0]})# y 최초 속도

# 사라질 무기, 공 정보 저장 변수
weapon_to_remove = -1
ball_to_remvoe = -1

running = True
while running:
    dt = clock.tick(60

    # 2. 이벤트 처리 (키보드, 마우스 등)
    for event in pygame.event.get():
        if event.type == pygame.QUIT
            running = False 

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT# 캐릭터를 왼쪽으로
                character_to_x -= character_speed
            elif event.key == pygame.K_RIGHT# 캐릭터를 오른쪽으로
                character_to_x += character_speed
            elif event.key == pygame.K_SPACE# 무기 발사
                weapon_x_pos = character_x_pos + (character_width / 2) - (weapon_width / 2)
                weapon_y_pos = character_y_pos 
                weapons.append([weapon_x_posweapon_y_pos])

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                character_to_x = 0

    # 3. 게임 캐릭터 위치 정의
    character_x_pos += character_to_x

    if character_x_pos < 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width

    # 무기 위치 조정
    # 100, 200 -> 180, 160, 140, ...
    # 500, 200 -> 180, 160, 140, ...
    weapons = [ [w[0], w[1] - weapon_speedfor w in weapons# 무기 위치를 위로

    # 천장에 닿은 무기 없애기
    weapons = [ [w[0], w[1]] for w in weapons if w[1] > 0]

    # 공 위치 정의
    for ball_idxball_val in enumerate(balls):
        ball_pos_x = ball_val["pos_x"]
        ball_pos_y = ball_val["pos_y"]
        ball_img_idx = ball_val["img_idx"]

        ball_size = ball_images[ball_img_idx].get_rect().size
        ball_width = ball_size[0]
        ball_height = ball_size[1]

        # 가로벽에 닿았을 때 공 이동 위치 변경 (튕겨 나오는 효과)
        if ball_pos_x < 0 or ball_pos_x > screen_width - ball_width:
            ball_val["to_x"] = ball_val["to_x"] * -1

        # 세로 위치
        # 스테이지에 튕겨서 올라가는 처리
        if ball_pos_y >= screen_height - stage_height - ball_height:
            ball_val["to_y"] = ball_val["init_spd_y"]
        else# 그 외의 모든 경우에는 속도를 증가
            ball_val["to_y"] += 0.5

        ball_val["pos_x"] += ball_val["to_x"]
        ball_val["pos_y"] += ball_val["to_y"]

    # 4. 충돌 처리

    # 캐릭터 rect 정보 업데이트
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    for ball_idxball_val in enumerate(balls):
        ball_pos_x = ball_val["pos_x"]
        ball_pos_y = ball_val["pos_y"]
        ball_img_idx = ball_val["img_idx"]

        # 공 rect 정보 업데이트
        ball_rect = ball_images[ball_img_idx].get_rect()
        ball_rect.left = ball_pos_x
        ball_rect.top = ball_pos_y

        # 공과 캐릭터 충돌 처리
        if character_rect.colliderect(ball_rect):
            running = False
            break

        # 공과 무기들 충돌 처리
        for weapon_idxweapon_val in enumerate(weapons):
            weapon_pos_x = weapon_val[0]
            weapon_pos_y = weapon_val[1]

            # 무기 rect 정보 업데이트
            weapon_rect = weapon.get_rect()
            weapon_rect.left = weapon_pos_x
            weapon_rect.top = weapon_pos_y

            # 충돌 체크
            if weapon_rect.colliderect(ball_rect):
                weapon_to_remove = weapon_idx # 해당 무기 없애기 위한 값 설정
                ball_to_remove = ball_idx # 해당 공 없애기 위한 값 설정
                break

    # 충돌된 공 or 무기 없애기
    if ball_to_remove > -1:
        del balls[ball_to_remove]
        ball_to_remove = -1


    if weapon_to_remove > -1:
        del weapons[weapon_to_remove]
        weapon_to_remove = -1


    # 5. 화면에 그리기
    screen.blit(background, (00))

    for weapon_x_posweapon_y_pos in weapons:
        screen.blit(weapon, (weapon_x_posweapon_y_pos))

    for idx,val in enumerate(balls):
        ball_pos_x = val["pos_x"]
        ball_pos_y = val["pos_y"]
        ball_img_idx = val["img_idx"]
        screen.blit(ball_images[ball_img_idx], (ball_pos_xball_pos_y))

    screen.blit(stage, (0screen_height - stage_height))
    screen.blit(character, (character_x_poscharacter_y_pos))


    pygame.display.update() 

pygame.quit()

퀴즈

46%나 틀려요. 한번 도전해보세요!

이 게임의 패배 조건이 아닌 것은 무엇인가요?

캐릭터가 공에 닿는 경우

제한 시간(99초) 내에 모든 공을 모두 제거하지 못하는 경우

캐릭터가 화면 경계를 벗어나는 경우

무기가 공에 닿는 경우

답변

답변을 기다리고 있는 질문이에요
첫번째 답변을 남겨보세요!
컴퓨터님의 프로필 이미지
컴퓨터

작성한 질문수

질문하기