📣 나도코딩의 【ChatGPT 풀코스 강의】가 신규 출시되었습니다. ChatGPT의 기초부터 프롬프트 엔지니어링, OpenAI API 까지 쉽고 재미있게 알려드립니다. 👉 bit.ly/naco_chatgpt (얼리버드 33% 할인 이벤트 중) --- 잠깐! 질문이 있으신가요? 아래 영상의 설명을 참고하셔서 질문게시판을 이용해보세요 ^^ 이미 답변이 되었을 수도 있답니다. - 자주 묻는 질문 게시판 : nadocoding.tistory.com/17 - 사용방법 : ruclips.net/video/LZQC9mEzdtk/видео.html [목차] 파란색 링크를 눌러주세요 (건너뛰기) [기본기] (0:00:00) 0.Intro (0:00:16) 1.소개 (0:02:02) 2.활용편1 소개 (0:02:59) 3.환경설정 & 프레임 (0:11:52) 4.배경 (0:18:36) 5.캐릭터 (0:28:26) 6.키보드 이벤트 (0:39:54) 7.FPS (0:46:54) 8.충돌 처리 (0:54:42) 9.텍스트 (1:02:46) 10.게임 개발 프레임 [퀴즈] (1:07:03) 11.퀴즈 전반전 (1:14:53) 12.퀴즈 후반전 [프로젝트] (1:22:16) 13.프로젝트 (1:25:17) 14.배경과 캐릭터 (1:35:40) 15.무기와 키보드 이벤트 (1:50:43) 16.공 만들기 (1:57:37) 17.공 튕기기 (2:10:22) 18.충돌 처리 (2:19:46) 19.공 쪼개기 (2:27:38) 20.게임 오버 (2:38:47) 21.버그 수정 (2:52:24) 22.Outro [소스코드] 아래 블로그에서 소스코드를 받으실 수 있습니다. nadocoding.tistory.com/8 [퀴즈 게임 이미지] 1. 똥 www.freepik.com/free-vector/funny-poop-sticker-collection_1318153.htm#page=1&query=shit&position=0 2. 멍멍이 캐릭터 www.freepik.com/free-vector/pack-pugs-with-lovely-style_1353886.htm#page=1&query=shit&position=6 3. 종이 배경 www.freepik.com/free-photo/design-space-paper-textured-background_3220799.htm#page=1&query=paper&position=0 [프로젝트 게임 이미지] 1. 배경 www.freepik.com/free-vector/arcade-game-world-pixel-scene_4815143.htm#query=arcade-game-world-pixel-scene&position=8 2. 스테이지 www.freepik.com/free-vector/urban-city-day-time-background_4708004.htm#page=5&query=brick&position=47 3. 캐릭터 opengameart.org/content/custom-sprites-for-the-crystal-palace-0 4. 무기 머리 부분 www.freepik.com/free-vector/weapon-icons-set_3924829.htm#page=1&query=arrow%20weapon&position=7 5. 무기 몸체 부분 (와이어) www.freepik.com/free-vector/barbed-wire-realistic-illustration-separate-elements-barbed-wire_3586280.htm#page=1&query=wire&position=37 6. 공 www.freepik.com/free-vector/colored-bubbles_808278.htm#page=2&query=bubble&position=18
(다른 댓글에도 있지만 중요한 내용이라서 고정 댓글에 다시 추가합니다) 키 이벤트를 통한 캐릭터 이동 시 방향키를 빠르게 누르면 캐릭터가 아예 멈춰버리는 현상이 생깁니다. 프로젝트 코드 기준으로 아래와 같이 4군데를 수정하면 위 현상을 해결할 수 있습니다. x 좌표 이동 방향 처리를 왼쪽, 오른쪽으로 나누어서 key down / key up 에서 각각 처리하여 더해주는 방식입니다. ★ 아이디어를 주신 '실로폰'님 감사합니다 ^^ [개선된 코드] # 수정1 : 기존의 character_to_x 를 왼쪽 방향, 오른쪽 방향 변수 2개로 나눔 character_to_x_LEFT=0 character_to_x_RIGHT=0 ... for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 수정2 : 키를 누를 때 LEFT, RIGHT 에 따라 서로 다른 변수의 값 조정 if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: character_to_x_LEFT -= character_speed # 바뀐 부분 elif event.key == pygame.K_RIGHT: character_to_x_RIGHT += character_speed # 바뀐 부분 elif event.key == pygame.K_SPACE: ... # 수정3 : 키에서 손을 뗄 때 LEFT, RIGHT 를 각각 처리 if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: # 이 부분은 모두 다 바뀜 character_to_x_LEFT = 0 elif event.key == pygame.K_RIGHT: character_to_x_RIGHT = 0 # 수정4 : 두 변수의 값을 모두 더함 character_x_pos += character_to_x_LEFT + character_to_x_RIGHT ...
영상 시작 부분에서 pygame 설치 오류가 뜨는 분들이 많으실 텐데, 22년 12월 기준으로 python 3.11 이상 최신 버전은 pip install pygame 실행 시 설치가 안 되는 오류가 있습니다. 낮은 버전을 다시 설치하셔야 하는데, 3.7 이전 버전은 VS code에서 디버깅 툴이 지원되지 않으므로 3.7~3.10 사이의 버전 설치를 권장합니다. 저는 3.10.9 버전으로 해결했습니다.
linting 이라는 설정이 안 나오면... (2024년 2월 12일) 제 생각에는 vscode가 업데이트가 되서 사라진것 같습니다 그냥 결론 예기 하면 8:20 부터 이벤트루프 만들어 보세요. (그냥 코드부터 보고 싶다면 11:08 ) 이게 왜 이러냐면 vscode가 업데이트 되서 그 설정이 사라졌지만 나도코딩님의 영상을 보면 linting 어쩌구가 체크 되있고, 체크 해제 해야 하는데, 없어지면서 체크 해제가 기본 값이 된것 같습니다. 그러니까 그 설정을 할 필요가 없어졌다는 소리에요
이번에도 어찌저찌 해보겠습니다 선생님 파이썬이 익숙해지는 그날까지...★ 1:41:35 무기 발사 처리 1:45:12 공격 시 무기 위로 올라가게 조정 1:54:00 공격당한 공 쪼개지고 늘어나고 하는거 1:58:33 enumerate 2:05:48 공 튕김처리 그림판 설명
키 이벤트를 통한 캐릭터 이동 시 방향키를 빠르게 누르면 캐릭터가 아예 멈춰버리는 현상이 생깁니다. 프로젝트 코드 기준으로 아래와 같이 4군데를 수정하면 위 현상을 해결할 수 있습니다. x 좌표 이동 방향 처리를 왼쪽, 오른쪽으로 나누어서 key down / key up 에서 각각 처리하여 더해주는 방식입니다. ★ 아이디어를 주신 '실로폰'님 감사합니다 ^^ [개선된 코드] # 수정1 : 기존의 character_to_x 를 왼쪽 방향, 오른쪽 방향 변수 2개로 나눔 character_to_x_LEFT=0 character_to_x_RIGHT=0 ... for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 수정2 : 키를 누를 때 LEFT, RIGHT 에 따라 서로 다른 변수의 값 조정 if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: character_to_x_LEFT -= character_speed # 바뀐 부분 elif event.key == pygame.K_RIGHT: character_to_x_RIGHT += character_speed # 바뀐 부분 elif event.key == pygame.K_SPACE: ... # 수정3 : 키에서 손을 뗄 때 LEFT, RIGHT 를 각각 처리 if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT: # 이 부분은 모두 다 바뀜 character_to_x_LEFT = 0 elif event.key == pygame.K_RIGHT: character_to_x_RIGHT = 0 # 수정4 : 두 변수의 값을 모두 더함 character_x_pos += character_to_x_LEFT + character_to_x_RIGHT ...
바다 건너 사는데요... 시작할까말까 고민만 1년 하다가... 까먹고 있다가 우연한 기회에 다시 접하게 되서 정말 기쁩니다. 퇴근후에 30분 정도라도 강의 듣고 있으면 그래도 머리가 약간은 돌아가는 느낌이 드네요.ㅋㅋㅋ 소걸음으로 시작한지 그래도 몇주 되어갑니다. 잘듣고 잘보고 잘흉내 내서 나도한번 코딩을 제대로 해보는 시간이 오기를 간절히 기다려봅니다.. 직장에서도 잘 써먹어서 좋은 프로모션이 있으면 더 좋구요..늘 감사 합니다.
저도 나름 코딩강사랍시고 여기저기 강의 하며 다녔었고, 파이게임의 주제로도 강의한 적 있었는데, 이 영상을 보니 제가 했던건 강의 축에도 못낀다는걸 느꼈습니다. 가지고 계시는 지식도 훌륭하시지만, 그걸 전달하고 설명하시는 실력도 대단하시네요 앞으로도 좋은 영상 기대하겠습니다.
2:13:40초에서요 for ball_idx, ball_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 ball_idx, ball_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 정보 업데이트 해도 되지 않나요?
38:40초 질문입니다. 항상 강의 잘 보고 있습니다. 감사합니다. 키보드 이벤트에서 경계값 처리하는 부분 질문인데요. 강의에서는 while문 바깥에 # 가로 경계값 처리 if character_x_pos < 0: character_x_pos = 0 elif character_x_pos > screen_width - character_width: character_x_pos = screen_width - character_width 이런식으로 처리를 해주셨는데요. 저는 왼쪽방향 경계처리만 생각해 보자면 if event.type == pygame.KEYDOWN: # 키보드를 눌렀을 때(아래키 입력 아님) if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로 이동 if character_x_pos >= 5: # 왼쪽 경계에 닿을때 까지만 빼줄수 있다. to_x -= 5 else: # 아니라면 다시 반복문 처음으로 가서 이벤트를 기다리자. continue 이런식으로 while문 안에서 x_pos 위치가 5보다 크거나 같을때만(X 좌표 왼쪽 경계위치가 0이니까 그 밑의 값으로는 가지 못하게) 빼주고 아닌경우에는 continue해서 돌려 보내는 방식으로 구현할 수 있지않을까 생각해봤는데요.(continue대신에 'character_x_pos = 0'을 넣어서 멈추게 하려 했는데도 안되더라고요 ㅠ) 제 방법이 조건문이 더 겹겹이 있어서 시간적인 면에서 비효율적이긴 해도 논리상 구현은 돼야 할 것같은데, 이대로 실행을 하면 캐릭터가 계속 왼쪽 경계밖으로 벗어나네요 ㅠ 제 코드에 어떤 논리상 오류가 있는건가요??
나도 코딩님 (0:16:59) 듣고 있었는데요 while (running): for event in pygame.event.get(): # 어떤 이벤트가 발생하였는지 체크 if event.type == pygame.QUIT: # 창닫기 누르면 QUIT 됨 running = False # 게임이 진행중이 아님 screen.blit(background, (0, 0)) # 배경 그리기 screen 을 찾을수 없다고 떠서 댓글좀 찾아봤는데 변수를 선언하라고 하셔서 답변 부탁드리곘습니다..ㅠㅠ
기본편 끝내고 현재 활용편1까지 다 따라했습니다! (이제는 선생님이라고 불러야 할 것 같습니다 ^^) 그냥 보고 따라하니 조금씩 이해가 가고 퀴즈를 통해서 더욱 이해가 잘가네요. 진짜 아무것도 모르고 시작해서 금방 포기 할 줄 알았는데 너무 재밌게 배우고 있습니다! 영상 만드시는데 수고가 많으시겠지만 꾸준히 올려주세요! 감사합니다
1:50:11 # 천장에 닿은 무기 없애기 weapons = [ [w[0], w[1]] for w in weapons if w[1] > 0] 여기서 weapon_y_pos 가 0보다 작으면 weapons 에 저장이 안된다는 건 알겠는데, 그렇다고 하더라도 왜 화면에서 사라지게 되는지 잘 이해가 안갑니다. 저장이 안된다고 화면에 출력?하는 것까지 왜 안되는건가요??? 그리고 추가로 # 5. 화면에 그리기 screen.blit(background, (0, 0)) for weapon_x_pos, weapon_y_pos in weapons: screen.blit(weapon, (weapon_x_pos, weapon_y_pos)) 여기서 for weapon_x_pos, weapon_y_pos in weapons: for a, b in c 구조가 어떻게 가능한지도 잘 이해가 안갑니다. 기초편에서 안배운거같은데 리스트 안에 리스트 쓰고 이렇게 하는 게 가능한건지 잘 이해가 안갑니다. 2차원 리스트 찾아보니까 A = [[a, b]] 라고 하고, print(A) 라고 하면 [a, b] 라고 나오잖아요? 그럼 for a, b in A: 구조가 어떻게 가능한건가요? A라는 리스트안에 [a, b]라는 하나의 item?만 있기에 a, b 각각 쓰면 오류가 나야할거 같은데 이게 실행되니까 어떤 원리인지 궁금합니다! 아니면 리스트 안의 리스트에 있는 항목?이라 가능한건지...
나도코딩님 안녕하세요 강의 정말 잘 보고있습니다. 한 가지 질문이 있는데요. 2:18:50초쯤 공과 무기 충돌 처리 부분에서 아래 코드가 #충돌체크 if문 안으로 들어가야 하는거 아닌가요. 밖에 나와있으면 혹시라도 충돌이 중복해서 일어날 경우 ball_to_remove가 가장 최근의 값으로만 처리될 것 같아서요 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
댓글을 안달래야 안달 수가 없습니다. 너무나도 완벽합니다. 이제 파이썬 책 한바퀴 돌리고 두바퀴째 돌리기 직전에 한번 무작정 따라했는데 뭔가 광명을 찾은 느낌입니다. 전체 큰 틀이 느껴지고 큰 깨달음을 얻어갑니다. 결국 for, if문을 활용해서 이 게임이란걸 만들어내다니....ㄷㄷㄷ 재미가 붙습니다. 감사합니다. 최고(굿)(굿)(굿)
elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000 이 부분에서 start_ticks를 따로 정의해서 빼주는 이유가 무엇인가요? pygame.time.get_ticks() / 1000 을 해준 후에 total에서 빼면 안되는 건가요?
pygame.time.get_ticks() 를 하게 되면 프로그램 시작 시점부터 이 문장이 실행될 때까지의 시간을 알 수 있는데요, 이렇게 설명해볼게요. import pygame ... 소스코드 ... start_ticks 정의 -> 프로그램 시작 시점부터 이 때까지 2초 소요 (★) ...소스 코드... while ... ... 소스 코드... elapsed_time 계산 -> 프로그램 시작 시점부터 이 때까지 3초 소요 (●) 프로그램을 시작하고부터 ★ 지점까지는 2초가 소요 되었습니다. 프로그램을 시작하고부터 ● 지점까지는 3초가 소요 되었습니다. 그러면 ★ 와 ● 까지는 1초가 소요된 것이죠. total_time 이 100초이며, 100초부터 99, 98, 이렇게 줄어들어야 하므로 elapsed_time 은 1초, 2초, .. 이렇게 증가해야 합니다. 하지만 pygame.time.get_ticks() 는 프로그램 시작 시점부터 그 문장이 실행될때가지의 시간이라 했으므로, 앞에 ★ 부분까지 소요된 2초를 포함한 전체 시간이 나오겠지요? 그러면 준혁님께서 말씀하신 코드대로 하면 elapsed_time 의 처음 값은 최소한 3초 이상일겁니다. 그러면 total_time 에서 3초를 뺀 97 초가 처음값이 되는 문제가 생길 수 있는거죠. start_ticks 를 빼면, ● 까지 3초 소요된 시간 중 ★ 까지 2초 소요된 시간을 빼기 때문에 1초가 될 것이고, total_time 에서 1초를 뺀 99초가 될겁니다. 정리하면, 게임 루프 (while 부분) 에 진입하기 전까지의 소스코드가 수행되기 위해 소요되는 시간은 빼기 위해 start_ticks 를 따로 빼준답니다. ^^ 감사합니다.
안녕하세요? 올려주신 강의 너무나도 유익하게 보면서 배우고 있습니다. 다름이 아니오라, 제가 강의를 따라서 타이핑하다 보니, 에러가 나는 부분이 있어서요. 어디냐면 영상 15:46 부분의 "screen.blit" 부분에서 오류가 생깁니다. 오류 메시지는 "NameError : name 'screen' is not defined" 입니다. 그런데 아무리 살펴도 선생님의 코드와 제 코드에는 아무 차이(오타나 띄어쓰기, tab 등등)가 없더라구요... 왜 이런 일이 생기는 걸까요? 이것때문에 따라해보질 못하고 그냥 강의만 보고 있습니다... 귀찮으시더라도 답변 달아주시면 영광이겠습니다. 너무나도 감사드립니다!!!
1:48:19초 입니다 weapons = [ [w[0], w[1] - weapon_speed] for w in weapons] # 천장에 닿을 무기 없애기 weapons = [ [w[0], w[1] - weapon_speed] for w in weapons if w[1] > 0] 여기서 무기 위치 조정이랑 천장에 닿을 무기 없애기를 했습니다. 근데 여기서 for 문이 w[1] 좌표에서 weapons speed를 빼게 계속 반복해주는 건데 for 문을 앞에 안 쓰고 뒤에 써도 되나요? 한줄 for 문이어서 그런건가요?
18:32 배경 부분에서요 아래 코드에서 아래와 같이 오류가 나네요. 조치 방안이 있을까요? 참고로 m1 맥북이며 pygame은 "python3 -m pip install pygame==2.0.0.dev6 --user" 이렇게 설치 했읍니다. backgroud = pygame.image.load\ ("/Users/dukeh/Downloads/PythonWorkSpace/pygame_basic/background.png") --> pygame.error: File is not a Windows BMP file
나도코딩 님 1:33:21 에서 이렇게 일일이 빼는것도 좋지만 이렇게 변수를 만들어서 하면 어때요? stage = py.image.load(os.path.join(image_path, 'stage.png')) stage_size = stage.get_rect().size stage_height = stage_size[1] stage_y_pos = HEIGHT - stage_height #바뀐 부분 이렇게 stage_y_pos도 캐릭터처럼 만들고 쭉 가서 screen.blit(background, (0, 0)) screen.blit(stage, (0, stage_y_pos)) #여기서 쓰는거에요 screen.blit(charather, (charather_x_pos, charather_y_pos)) 제가 초딩이여서 인지 아니면 그냥 저 방법이 편하든 간에, 이 방법이 편하면 이 방법을 쓰세요.
230102 ~54:42 수강시작 230103 54:42~1:50:42 퀴즈 완료, 프로젝트 이벤트 처리까지 완료(+코드 수정하여 무기 최대 2개 발사 가능하도록 설정) 230104 1:50:42~2:27:38 공 튀기기 및 작은 공으로 쪼개기 구현 완료 230105 2:27:38~ 수강 끝 나코님의 코드를 일부 다르게 작성해서 그런 것인지는 모르겠지만 저는 다른 부분에서 버그가 나오는 것 같네요... 동일한 위치에서 무기 2개를 발사한 경우 무기에 맞지 않은 공이 사라지는 버그가 발견되는 것 같은데 저도 한 번 다시 코드를 검토해야 할 것 같습니다... 역시 코드 작성보다도 코드 리뷰, 에러 체크가 어렵게 느껴지네요.
인프런에서 강의 듣고 왔습니다. 활용편1 완강했습니다. 너무 좋은 강의 감사합니다.^^ 게임 완성도를 높이고 싶은 욕심에 링크해 주신 이미지 파일 찾아서 이미지 만들고 이미지 바깥 부분은 투명처리하고... ㅎㅎ 이것 저것 하다보니 시간이 금방 가네요. 이것 저것 찾아서 공부하다 보니 공 이미지 부분은 공 사이즈만 조정한다면 변경 전... 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 = pygame.image.load(os.path.join(image_path,"balloon1.png")).convert_alpha() ball2 = pygame.transform.scale(ball,(80,80)) ball3 = pygame.transform.scale(ball,(40,40)) ball4 = pygame.transform.scale(ball,(20,20)) ball_images = [ball, ball2, ball3, ball4] 이렇게 처리하는게 나머지 공 이미지를 그리지 않아도 되니 조금 더 효율적인 듯 했습니다. 지금은 완성도를 조금 더 높이고 싶어서 충돌 부분을 지금보다 조금 더 정밀하게 처리하는 방법을 찾아 보고 있습니다. 다시 한번 강의 감사 드립니다. ^^
@@nadocoding 나도코딩님의 강의에 비할바가 아닙니다. 과찬이십니다.^^ 그리고 나도코딩님~ 제가 공과 캐릭터 충돌 부분을 조금 개선해 봤습니다. 충돌 관련해서 주말 동안 이것저것 검색해본 결과 sprite 클래스를 이용해서 group 으로 충돌처리를 하면 아주 좋았구요. 지금 현재 소스에서 수정을 최소화해서 충돌 부분을 개선할 수 있는 방법을 고민한 결과.... 1. 수정부분 첫번째 변경 전 # 캐릭터 만들기 character = pygame.image.load(os.path.join(image_path,"character.png")) 변경 후 # 캐릭터 만들기 character = pygame.image.load(os.path.join(image_path,"character.png")).convert_alpha() character_mask = pygame.mask.from_surface(character) 2. 수정부분 두번째 변경 전 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 = pygame.image.load(os.path.join(image_path,"balloon1.png")).convert_alpha() ball2 = pygame.transform.scale(ball,(80,80)) ball3 = pygame.transform.scale(ball,(40,40)) ball4 = pygame.transform.scale(ball,(20,20)) ball_images = [ball, ball2, ball3, ball4] 3. 수정부분 세번째 변경 전 # 공과 캐릭터 충돌 처리 if character_rect.colliderect(ball_rect): running = False break 변경 후 # 공과 캐릭터 충돌 처리 ball_mask = pygame.mask.from_surface(ball_images[ball_img_idx]) offset = (int(ball_pos_x - character_x_pos) , int(ball_pos_y - character_y_pos)) if character_mask.overlap(ball_mask,offset): running = False break 이렇게 세부분만 수정하면 공과 캐릭터 충돌처리 부분이 정말 많이 개선 되었습니다. 특히 공의 모서리 부분에서의 충돌은 엄청난 차이가 있었구요. 혹시라도 나중에 강의 UPDATE 하실 일이 생기면 이 부분 반영해도 좋을 듯 합니다. 그럼 수고하세요. 전 나도코딩님의 다른 강의 들으러 갑니다.^^
마스킹 처리를 해주셨네요 ^^ 강의를 제작하면서 어느 정도 범위까지 할까, 어느 정도 난이도까지 할까, 보다 많은 분들이 보다 쉽게 배우려면 어디까지 해야할까를 참 많이 고민했는데, 스스로 이렇게 응용을 잘 하시니 대단하시네요! ^^ 단편 게임 프로젝트 강좌 제작 시에는 알려주신 내용 참고해서 해볼게요~ 감사합니다.
1:57:37 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"] 이렇게 썼을때 실행해보면 공이 화면 밖으로 올라가는 장면을 볼 수 있는데 왜 그런건가요? 그리고 ball_val["to_y"]= ball_val["init_spd_y"] 를 해서 to_y에 값을 넣게 되고 ball_val["pos_y"] += ball_val["to_y"] 을 통해서 to_y값을 pos_y에 더하게 되는데 pos_y는 바뀐 좌표로 즉시 이동되지 않고 움직이는 과정이 보이면서 가지는 건가요? (말 표현이 미숙한 점 죄송합니다..)
선생님 강의 잘보고 있습니다. 감사합니다. 다름이 아니고 38:00쯤에 이해가 잘 안되는 부분이 있어서 여쭤보려 하는데요, if character_x_pos < 0: character_x_pos = 0 이게 'x좌표가 0보다 작으면 0으로 되돌린다' 라는 의미 아닌가요? 그러면 사실 화면 밖으로 삐져나갔다가 다시 돌아오는 식으로 작동하는거로 저는 이해를 했는데요, 근데 실행시켜보면 화면 밖으로 애초에 안나가는 것처럼 보여서 지금 혼란스럽네요. 제가 어느부분을 놓친건가요?
1:02:30초입니다. # 잠시 대기 pygame.time.delay(2000) # 2초 정도 대기 (ms) 이 소스코드를 while 구문에도 적용 안 시켜놨는데 2초 대기 되는 이유가 뭔가요? 끝날 때 2초 대기가 된다는 식으로 적용 시켜야 하는거 아닌가요? 그냥 소스코드 마지막 부분에 해도 끝날 때 2초 딜레이로 적용 되나요? 만약 그렇다면 if 조건문중에 running = False 가 되는 경우도 있었는데 거기서 꺼지면 저 2초 딜레이는 적용이 안되는 거 아닌가요?
17:28부분에 배경그리기 부분에서 screen = pygame.display.set_mode((screen_width, screen_height)) 코드를 적어두 screen변수가 none이라고 뜹니다 그래서 screen.blit(background,(0,0)) 코드를 적어도 'NoneType' object has no attribute 'blit' 라고 오류가 발생하는데 어떻게 해결해야 할까요?
1:13:42 파이썬 초보라 보고 잘 따라하고 있는데 이벤트 처리 해당 부분에서 움직임이 부드럽지 않은 느낌이 있어서 to_x = 0 변수 추가 부분에 to_xL = 0 to_xR = 0 변수 추가 하고 이벤트 처리 부분에서 if event.type == pygame.KEYDOWN: #키가 눌러졌는지 확인 if event.key == pygame.K_LEFT: # 캐릭터를왼쪽으로 to_xL -= character_speed elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로 to_xR += character_speed if event.type == pygame.KEYUP: #방향키를 떼면 멈춤 if event.key == pygame.K_LEFT: to_xL = 0 elif event.key == pygame.K_RIGHT: to_xR = 0 to_x = to_xL + to_xR 이런식으로 처리하는게 캐릭터 움직임이 더 부드러웠어요
📣 나도코딩의 【ChatGPT 풀코스 강의】가 신규 출시되었습니다.
ChatGPT의 기초부터 프롬프트 엔지니어링, OpenAI API 까지 쉽고 재미있게 알려드립니다.
👉 bit.ly/naco_chatgpt (얼리버드 33% 할인 이벤트 중)
---
잠깐! 질문이 있으신가요? 아래 영상의 설명을 참고하셔서 질문게시판을 이용해보세요 ^^ 이미 답변이 되었을 수도 있답니다.
- 자주 묻는 질문 게시판 : nadocoding.tistory.com/17
- 사용방법 : ruclips.net/video/LZQC9mEzdtk/видео.html
[목차]
파란색 링크를 눌러주세요 (건너뛰기)
[기본기]
(0:00:00) 0.Intro
(0:00:16) 1.소개
(0:02:02) 2.활용편1 소개
(0:02:59) 3.환경설정 & 프레임
(0:11:52) 4.배경
(0:18:36) 5.캐릭터
(0:28:26) 6.키보드 이벤트
(0:39:54) 7.FPS
(0:46:54) 8.충돌 처리
(0:54:42) 9.텍스트
(1:02:46) 10.게임 개발 프레임
[퀴즈]
(1:07:03) 11.퀴즈 전반전
(1:14:53) 12.퀴즈 후반전
[프로젝트]
(1:22:16) 13.프로젝트
(1:25:17) 14.배경과 캐릭터
(1:35:40) 15.무기와 키보드 이벤트
(1:50:43) 16.공 만들기
(1:57:37) 17.공 튕기기
(2:10:22) 18.충돌 처리
(2:19:46) 19.공 쪼개기
(2:27:38) 20.게임 오버
(2:38:47) 21.버그 수정
(2:52:24) 22.Outro
[소스코드]
아래 블로그에서 소스코드를 받으실 수 있습니다.
nadocoding.tistory.com/8
[퀴즈 게임 이미지]
1. 똥
www.freepik.com/free-vector/funny-poop-sticker-collection_1318153.htm#page=1&query=shit&position=0
2. 멍멍이 캐릭터
www.freepik.com/free-vector/pack-pugs-with-lovely-style_1353886.htm#page=1&query=shit&position=6
3. 종이 배경
www.freepik.com/free-photo/design-space-paper-textured-background_3220799.htm#page=1&query=paper&position=0
[프로젝트 게임 이미지]
1. 배경
www.freepik.com/free-vector/arcade-game-world-pixel-scene_4815143.htm#query=arcade-game-world-pixel-scene&position=8
2. 스테이지
www.freepik.com/free-vector/urban-city-day-time-background_4708004.htm#page=5&query=brick&position=47
3. 캐릭터
opengameart.org/content/custom-sprites-for-the-crystal-palace-0
4. 무기 머리 부분
www.freepik.com/free-vector/weapon-icons-set_3924829.htm#page=1&query=arrow%20weapon&position=7
5. 무기 몸체 부분 (와이어)
www.freepik.com/free-vector/barbed-wire-realistic-illustration-separate-elements-barbed-wire_3586280.htm#page=1&query=wire&position=37
6. 공
www.freepik.com/free-vector/colored-bubbles_808278.htm#page=2&query=bubble&position=18
(다른 댓글에도 있지만 중요한 내용이라서 고정 댓글에 다시 추가합니다)
키 이벤트를 통한 캐릭터 이동 시 방향키를 빠르게 누르면 캐릭터가 아예 멈춰버리는 현상이 생깁니다.
프로젝트 코드 기준으로 아래와 같이 4군데를 수정하면 위 현상을 해결할 수 있습니다.
x 좌표 이동 방향 처리를 왼쪽, 오른쪽으로 나누어서 key down / key up 에서 각각 처리하여 더해주는 방식입니다.
★ 아이디어를 주신 '실로폰'님 감사합니다 ^^
[개선된 코드]
# 수정1 : 기존의 character_to_x 를 왼쪽 방향, 오른쪽 방향 변수 2개로 나눔
character_to_x_LEFT=0
character_to_x_RIGHT=0
...
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 수정2 : 키를 누를 때 LEFT, RIGHT 에 따라 서로 다른 변수의 값 조정
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
character_to_x_LEFT -= character_speed # 바뀐 부분
elif event.key == pygame.K_RIGHT:
character_to_x_RIGHT += character_speed # 바뀐 부분
elif event.key == pygame.K_SPACE:
...
# 수정3 : 키에서 손을 뗄 때 LEFT, RIGHT 를 각각 처리
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT: # 이 부분은 모두 다 바뀜
character_to_x_LEFT = 0
elif event.key == pygame.K_RIGHT:
character_to_x_RIGHT = 0
# 수정4 : 두 변수의 값을 모두 더함
character_x_pos += character_to_x_LEFT + character_to_x_RIGHT
...
@@nadocoding 그러면 charcater를 player로 전부 바꿔야 하나요?
이해가 안가내요...
@@tatenen4132 죄송합니다. 다른 PC 에서 작업하던 소스코드를 수정해서 character 가 player 로, 우리 강의 내용과 다르게 돼 있었네요
댓글 내용 수정하였으니 다시 확인 부탁드려요 ^^
@@nadocoding 혹시 IDLE로 해도 바뀌는건 없나요?
@@siwoncool 코드 분량이 꽤 되어서 IDLE 에서 하시게 되면 많이 불편하실거라 생각합니다 ^^
맨날 흑백화면에 print나 쳐대는 게 코딩인가 싶었는데 실용편 따라하니 진짜 코딩의 참맛을 알 것 같습니다.
말 잘하시네요 ㅋㅋㅋㅋㅋㅋㅋ
ㅇㅈ
@@hoya0690 '인정'을 초성으로만 따서 'ㅇㅈ'이라고 써요
@@bingcong2907 이 사람은 뭐가 그렇게 시비가 걸고 싶어서 이러는 거지
솔직히 이런 강의가 한국어 영상으로
나와준다는게 너무나
감사할 따름이네요. 감동입니다11
대한민국에 많은 훌륭한 강의들이 있지만 사교육비 절감에 조금이나마 일조하고 싶었는데 많은 분들이 호응해 주셔서 얼마나 감사한지 모릅니다. 계속 좋은 영상을 만들도록 꾸준히 노력하겠습니다 ^^
@@nadocoding 계속 좋은 영상 빨리 올려주세요...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ (좋은 강의 잘보고 있습니다. ^^)
@@nadocoding 대기업 부품으로써 자괴감 많이 느끼고 있었는데, 나도코딩님 강의로 늦었지만 프로그래머라는 꿈을 갖게 되었어요.
앞으로 2년 열심히 공부해서 프로그래머로 새 삶을 시작하려 합니다. 너무 감사합니다.
영상 시작 부분에서 pygame 설치 오류가 뜨는 분들이 많으실 텐데, 22년 12월 기준으로 python 3.11 이상 최신 버전은 pip install pygame 실행 시 설치가 안 되는 오류가 있습니다. 낮은 버전을 다시 설치하셔야 하는데, 3.7 이전 버전은 VS code에서 디버깅 툴이 지원되지 않으므로 3.7~3.10 사이의 버전 설치를 권장합니다. 저는 3.10.9 버전으로 해결했습니다.
댓글정말안다는편인데 바로 해결됬네요~^^
감사합니당
사랑해요
@user-cb7vf5fm3j python 홈페이지에서 다운 받을 수 있습니다!
감사합니다 :)
내가본 파이선 강의중에 최고다... 이만한거 없다.. 그냥 여기서 1달만 미친척하고 하면 파이썬 쌉고수.. 강의 정말 최곱니다요
처음 댓글을 달아봐요...파이썬 독학중입니다. 이렇게 고컬리티 강의를 무료로 올려주셔서 ..너무 감사 드립니다.. 어떤 강의도 이런 퀄은 없었네요..더하기 빼기 강의만 수두룩했는데,, 이런 실전 강의를 올려주셔서 다시 한번 감사드립니다.
linting 이라는 설정이 안 나오면...
(2024년 2월 12일)
제 생각에는 vscode가 업데이트가 되서 사라진것 같습니다
그냥 결론 예기 하면 8:20
부터 이벤트루프 만들어 보세요.
(그냥 코드부터 보고 싶다면 11:08 )
이게 왜 이러냐면 vscode가 업데이트 되서 그 설정이 사라졌지만 나도코딩님의 영상을 보면 linting 어쩌구가 체크 되있고, 체크 해제 해야 하는데, 없어지면서 체크 해제가 기본 값이 된것 같습니다.
그러니까 그 설정을 할 필요가 없어졌다는 소리에요
20:59 책갈피✨
이번에도 어찌저찌 해보겠습니다 선생님 파이썬이 익숙해지는 그날까지...★
1:41:35 무기 발사 처리
1:45:12 공격 시 무기 위로 올라가게 조정
1:54:00 공격당한 공 쪼개지고 늘어나고 하는거
1:58:33 enumerate
2:05:48 공 튕김처리 그림판 설명
감사합니다. 너무, 훌륭한 강의 .. 그리고, 광고도 없구오... 최고의 영상.. 감동X1000만배 입니다.
나만 어려운가.. 무슨말은 하는지는 알아듣는것 같아도 막상
안보고 똑같이 해보라면 시작부터 막막하네요 공 액션 나오기 시작할때부터
한계를 느끼네요. 다들 잘 하시는것 보니 대단합니다.
키 이벤트를 통한 캐릭터 이동 시 방향키를 빠르게 누르면 캐릭터가 아예 멈춰버리는 현상이 생깁니다.
프로젝트 코드 기준으로 아래와 같이 4군데를 수정하면 위 현상을 해결할 수 있습니다.
x 좌표 이동 방향 처리를 왼쪽, 오른쪽으로 나누어서 key down / key up 에서 각각 처리하여 더해주는 방식입니다.
★ 아이디어를 주신 '실로폰'님 감사합니다 ^^
[개선된 코드]
# 수정1 : 기존의 character_to_x 를 왼쪽 방향, 오른쪽 방향 변수 2개로 나눔
character_to_x_LEFT=0
character_to_x_RIGHT=0
...
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 수정2 : 키를 누를 때 LEFT, RIGHT 에 따라 서로 다른 변수의 값 조정
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
character_to_x_LEFT -= character_speed # 바뀐 부분
elif event.key == pygame.K_RIGHT:
character_to_x_RIGHT += character_speed # 바뀐 부분
elif event.key == pygame.K_SPACE:
...
# 수정3 : 키에서 손을 뗄 때 LEFT, RIGHT 를 각각 처리
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT: # 이 부분은 모두 다 바뀜
character_to_x_LEFT = 0
elif event.key == pygame.K_RIGHT:
character_to_x_RIGHT = 0
# 수정4 : 두 변수의 값을 모두 더함
character_x_pos += character_to_x_LEFT + character_to_x_RIGHT
...
자주 좌측에서 우측으로 방향을 (반대 방향도 마찬가지) 바로 이동하는 것이 아닌 잠시 멈췄다가 한번더 키를 누르면 실행되고있습니다.
원래 그런건가요?
@@영혼-o2o 강의 코드에서는 그런데 위 댓글 보충설명의 코드로 하면 개선될거에요! 댓글대로 하셨는데도 그러면 작성하신 코드 모두를 올려주시면 도움드리겠습니다^^
@@nadocoding 감사합니다.
x 위치랑 -x 위치를 두개로 나눈건가요
@@ky_1108 네, x 좌표만 있었는데 x_left 와 x_right 로 둘로 나눈거 맞습니다 ^^
진짜재밋다ㅋㅋㅋㅋㅋㅋ 파이썬 파짜도 모르고 아직 기초도 안듣고 있는데 이해가 되면 얼마나 잘 가르쳐주시는 거징ㅎㅎ 이거 보고 기초편보면 정말 재밋게 배울 수 있을 것 같아요ㅎㅎ 감사합니당ㅎㅎ
똑똑혜
@@이기섭섭하다 7
@@이기섭섭하다
저분 동생이라서 형 선전해주는 거 아닐까요?
@@kimjunsik540
안 똑똑해!
PC언어는 내것은 아니라고 생각하며 지내왔는데..."나도코딩님" 의 기본편(약2주간) 보고 더할나위 없는 실력과 강의에 감탄 금할 수 없네요.. 멋지고 최곱니다. 한걸음 한걸음 나아가고 많이 배우겠습니다.
갑니다
와 ... 뒤늦게 이 강의 따라 해 보고 있는데, 챕터 하나 하나 풀어 나가고 결과가 제대로 나올때마다 희열이 느껴지네요 ^^ 댓글이 왜 많이 달렸는지 이해가 갑니다. 감사합니다.
바다 건너 사는데요... 시작할까말까 고민만 1년 하다가... 까먹고 있다가 우연한 기회에 다시 접하게 되서 정말 기쁩니다. 퇴근후에 30분 정도라도 강의 듣고 있으면 그래도 머리가 약간은 돌아가는 느낌이 드네요.ㅋㅋㅋ 소걸음으로 시작한지 그래도 몇주 되어갑니다. 잘듣고 잘보고 잘흉내 내서 나도한번 코딩을 제대로 해보는 시간이 오기를 간절히 기다려봅니다.. 직장에서도 잘 써먹어서 좋은 프로모션이 있으면 더 좋구요..늘 감사 합니다.
목소리도 너무 듣기 좋고요, 설명도 너무 친절하시고, 강의 퀄리티도 높고요, 너무 최고에요!
자꾸 이러시면 진짜인 줄 알고 혼자 헤벌레... 합니다.
3000 만큼 감사합니다♥
강의 하시는데 목소리가 너무 차분하고 귀에 잘 들어옵니다. 가르치는데 천부적인 목소리를 소유하신 것 같아요. 감사합니다!
칭찬 정말 감사드립니다. ^^ 제게는 늘 어색한 제 목소리지만 전달이 잘 된다고 하시니 진짜 다행이에요 ㅋㅋㅋ
저도 나름 코딩강사랍시고 여기저기 강의 하며 다녔었고, 파이게임의 주제로도 강의한 적 있었는데,
이 영상을 보니 제가 했던건 강의 축에도 못낀다는걸 느꼈습니다.
가지고 계시는 지식도 훌륭하시지만, 그걸 전달하고 설명하시는 실력도 대단하시네요
앞으로도 좋은 영상 기대하겠습니다.
책갈피 1:07:47
이런영상 많이 올려주셔서 감사합니다, 공부 잘 하고 있어요.
미친듯이 거의 하루 만에 7시간 때려 붓고 영상대로 다만들고 추가로 나만의 방식으로도 만들어보고 이영상에서 흡수 할 수 있는 정보란 정보는 머리에 다 때려박았네요
정말 최고의 강의입니다. 전 초딩,중딩,고딩은 알아도 코딩은 전혀 모릅니다. 그런 제가 강의하시는대로 따라 하니 조금씩 알게 되더라구여. 진심으로 감사드립니다. 목소리 최고, 강의 이끌어 가시는 스킬도 최고입니다. 복 받으실 거예요.
코하하하
가격이 부담스러워서 코딩 배우고 싶었지만 못 배우고 있었는데 나도코딩님 덕분에 재밌게 배우고있어요 ㅠㅠ 감사합니다
파이썬을 아예 모르는 상태에서 봤는데도 전체적인 내용이 잘 이해되네요!! 세부적인 문법만 익힌다면 저도 충분히 게임을 만들 수 있다는 자신감을 얻었습니다. 좋은 강의 감사해요~~!
2:13:40초에서요
for ball_idx, ball_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 ball_idx, ball_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 정보 업데이트 해도 되지 않나요?
선생님 39:24 에요
# 가로 경계값 처리 / ctr = characters
if ctr_x_pos < 0:
ctr_x_pos = 0
elif ctr_x_pos > screen_width - ctr_width:
ctr_x_pos = screen_width - ctr_width
# 세로 경계값 처리
if ctr_y_pos < 0:
ctr_y_pos = 0
elif ctr_y_pos > screen_height - ctr_height:
ctr_y_pos = screen_height - ctr_height
이렇게 썼는데요
ctr_y_pos = screen_height - ctr_height
IndentationError: expected an indented block
이런 에러가 떠요 도와주세요..
이번에도 다 듣고 따라해 보았어요!! 와우~~ 같이 따라 할때는 귀에 쏙쏙 잘 들어와요 ㅎㅎㅎ^^ 대박ㅎㅎㅎ 넘넘 재밌어요!!! 감사합니다.~~~^^
ㅠㅠ 감동입니다. 이렇게 열심히 하시는 분이 계시니... 다음 강의도 열심히 준비하겠습니다!!!^^
28:27 이번에도 잘 따라가 보겠습니다~ 감사합니다.
선생님 기초 6시간 듣고 왔어요 너무 재밋어요 활용편에선 또 어떤 수업으로 저한테 흥미를 주실지 기대되네용 좋은 강의 감사합니다.
2:10:26
38:40초 질문입니다. 항상 강의 잘 보고 있습니다. 감사합니다.
키보드 이벤트에서 경계값 처리하는 부분 질문인데요. 강의에서는 while문 바깥에
# 가로 경계값 처리
if character_x_pos < 0:
character_x_pos = 0
elif character_x_pos > screen_width - character_width:
character_x_pos = screen_width - character_width
이런식으로 처리를 해주셨는데요.
저는 왼쪽방향 경계처리만 생각해 보자면
if event.type == pygame.KEYDOWN: # 키보드를 눌렀을 때(아래키 입력 아님)
if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로 이동
if character_x_pos >= 5:
# 왼쪽 경계에 닿을때 까지만 빼줄수 있다.
to_x -= 5
else:
# 아니라면 다시 반복문 처음으로 가서 이벤트를 기다리자.
continue
이런식으로 while문 안에서 x_pos 위치가 5보다 크거나 같을때만(X 좌표 왼쪽 경계위치가 0이니까 그 밑의 값으로는 가지 못하게) 빼주고 아닌경우에는 continue해서 돌려 보내는 방식으로 구현할 수 있지않을까 생각해봤는데요.(continue대신에 'character_x_pos = 0'을 넣어서 멈추게 하려 했는데도 안되더라고요 ㅠ) 제 방법이 조건문이 더 겹겹이 있어서 시간적인 면에서 비효율적이긴 해도 논리상 구현은 돼야 할 것같은데, 이대로 실행을 하면 캐릭터가 계속 왼쪽 경계밖으로 벗어나네요 ㅠ 제 코드에 어떤 논리상 오류가 있는건가요??
나도 코딩님 (0:16:59) 듣고 있었는데요
while (running):
for event in pygame.event.get(): # 어떤 이벤트가 발생하였는지 체크
if event.type == pygame.QUIT: # 창닫기 누르면 QUIT 됨
running = False # 게임이 진행중이 아님
screen.blit(background, (0, 0)) # 배경 그리기
screen 을 찾을수 없다고 떠서 댓글좀 찾아봤는데
변수를 선언하라고 하셔서 답변 부탁드리곘습니다..ㅠㅠ
저 윗쪽에
screen = pygame.display.set_mode(...)
이렇게 고쳐보세요 ^^
@@nadocoding 오 해결했습니다 매번 감사합니다^^
기본편 끝내고 현재 활용편1까지 다 따라했습니다! (이제는 선생님이라고 불러야 할 것 같습니다 ^^)
그냥 보고 따라하니 조금씩 이해가 가고 퀴즈를 통해서 더욱 이해가 잘가네요.
진짜 아무것도 모르고 시작해서 금방 포기 할 줄 알았는데 너무 재밌게 배우고 있습니다!
영상 만드시는데 수고가 많으시겠지만 꾸준히 올려주세요! 감사합니다
책 한권 본 느낌, 아니 다른 책(파이썬 완벽가이드)에서는 언급되지 않은것도 볼 수 있어 좋았습니다. 추천입니다. ^^
1:04:00
누가 대신 코드 짜줘서 그런가 개재밌네요... ㅎㅎㅎㅎ 감사히 잘 볼게요!
나도코딩님 코딩하시다가 중간에 대부분 for문으로 실행처리를 하시는데 왜 for문을 사용하시는지 궁금합니다
점점 어려워 지기는 하는데 그냥 무작정 따라하고 있어요 좋은 강의 주셔서 감사합니다.
거의 3시간 가까이 되는 영상인데, 시간가는 줄 모르고 보았네요. 파이썬을 혼자 공부하시는 분들께 정말 좋은 강의네요! 코딩하는 걸 어려워하는 어려워하고 활용을 못하는 경우가 많은데 게임을 직접 만들어보며 재미있게 코딩하기 좋아요!
활용편 완강 가즈아
54:44
1:22:16 퀴즈 해결 완료
2:10:23 무기, 공 이해중
끝!
프로젝트 도입부에 게임 직접 해보는 거 피지컬 ㄷㄷ
77
아니 ㄹㅇ 개잘하긴 하네 ㅋㅋㅋ
1:50:11
# 천장에 닿은 무기 없애기
weapons = [ [w[0], w[1]] for w in weapons if w[1] > 0]
여기서 weapon_y_pos 가 0보다 작으면 weapons 에 저장이 안된다는 건 알겠는데, 그렇다고 하더라도 왜 화면에서 사라지게 되는지 잘 이해가 안갑니다.
저장이 안된다고 화면에 출력?하는 것까지 왜 안되는건가요???
그리고 추가로
# 5. 화면에 그리기
screen.blit(background, (0, 0))
for weapon_x_pos, weapon_y_pos in weapons:
screen.blit(weapon, (weapon_x_pos, weapon_y_pos))
여기서 for weapon_x_pos, weapon_y_pos in weapons:
for a, b in c 구조가 어떻게 가능한지도 잘 이해가 안갑니다. 기초편에서 안배운거같은데 리스트 안에 리스트 쓰고 이렇게 하는 게 가능한건지 잘 이해가 안갑니다.
2차원 리스트 찾아보니까 A = [[a, b]] 라고 하고, print(A) 라고 하면 [a, b] 라고 나오잖아요? 그럼 for a, b in A: 구조가 어떻게 가능한건가요? A라는 리스트안에 [a, b]라는 하나의 item?만 있기에 a, b 각각 쓰면 오류가 나야할거 같은데 이게 실행되니까 어떤 원리인지 궁금합니다! 아니면 리스트 안의 리스트에 있는 항목?이라 가능한건지...
나도코딩님 안녕하세요 강의 정말 잘 보고있습니다.
한 가지 질문이 있는데요. 2:18:50초쯤 공과 무기 충돌 처리 부분에서 아래 코드가 #충돌체크 if문 안으로 들어가야 하는거 아닌가요.
밖에 나와있으면 혹시라도 충돌이 중복해서 일어날 경우 ball_to_remove가 가장 최근의 값으로만 처리될 것 같아서요
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
선생님 사랑합니다 강의진짜 잘보고있습니다 나중에 시간되시면 웹코딩도 올려주실수잇나요 이미 나도코딩님한테 중독되서 다른강의를 못보겟네요
따뜻한 댓글 감사합니다 ^^ 파이썬 강의 이후 커리큘럼 구상 시 참고하겠습니다.
18:31 여기서 배경 적용했는데 왜 화면이 잠깐 뜨다가 다시 들어갈까요...?(스크린이 정의 되지 못했다는데요..)
저도 여기서 헤맸는데
이분 강의목록에 '소스코드 비교방법' 영상보시면 해결방법 나옵니다!
재밌게 강의 잘 보고있습니다 선생님. 꾸준히 흥미를 가지고 코딩 공부에 임하게 해줄 수 있는 강의는 이 강의가 처음이에요. 감사합니다♥
댓글을 안달래야 안달 수가 없습니다. 너무나도 완벽합니다. 이제 파이썬 책 한바퀴 돌리고 두바퀴째 돌리기 직전에 한번 무작정 따라했는데 뭔가 광명을 찾은 느낌입니다. 전체 큰 틀이 느껴지고 큰 깨달음을 얻어갑니다. 결국 for, if문을 활용해서 이 게임이란걸 만들어내다니....ㄷㄷㄷ 재미가 붙습니다. 감사합니다. 최고(굿)(굿)(굿)
좋은 강의 만들어주셔서 감사해요! 그런데 53:35 너무 귀여우신거 아닙니까?
이 채널을 이제라도 알아서 다행이다. 감사합니다 8ㅅ8
초 5학년 입니다. 코딩이 재밌어서 이분 보고 시작했는데 제가 게임을 만들수 있을줄은 몰랐어요. ㅋㅋㅋ 친구한테 제가 만들었다 하니까 안믿더라고여.. 어쨋든 강의 정말 좋아요!!!
고인물 ㄷㄷ
저도 초5인데 C언어 파이썬 열심히 공부중입니다 만들어보니까 재밋더라구요 ㅎ
중1 인데 내일 파이썬 함수 배워요
+ 현재는 코틀린으로 넘어가 앱개발 중
난 중1인데.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ
자바로 역전하겠습니다.
저도 저번달 돌잔치 했는데요 코딩 정말 쉽네요ㅎㅎ
진짜 대박... 지금 6시간 파이썬 기초 강의 듣는데 이 게임 목표로 꼭 완강할 겁니다 대박...
^^ 꼭 기초 강의 완주하시고 기억이 남아있을때 게임 프로젝트까지 완주 해버리세요 !! 감사합니다.
난 이제다봄
사실 기초편 1시간안봄
기초 파이썬 끝내고 활용편 넘어왔습니다. ^^ 또 열심히 배워볼게요^^
[책갈피]
1:07:04
좋은 강의 올려주셔서 감사합니다!
말을 엄청 안정적으로 잘하시네요 짧은 시간도 아닌데 ㄷㄷ 앞쪽 설명 들으면서 똥피하기 생각났는데 퀴즈로 나와서 반갑네요 ㅋㅋㅋ
헛 ㅋㅋㅋ 똥피하기를 먼저 떠올리시다니!! 통했네요 ^^ 강의 뒤로 갈수록.. 말을 많이 해서 그런지 목소리가 조금 허스키해집니다 ㅠㅠ 미리 양해 부탁드립니다 ㅋㅋ
저도 해볼게유
elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000
이 부분에서 start_ticks를 따로 정의해서 빼주는 이유가 무엇인가요?
pygame.time.get_ticks() / 1000 을 해준 후에 total에서 빼면 안되는 건가요?
pygame.time.get_ticks() 를 하게 되면 프로그램 시작 시점부터 이 문장이 실행될 때까지의 시간을 알 수 있는데요, 이렇게 설명해볼게요.
import pygame
... 소스코드 ...
start_ticks 정의 -> 프로그램 시작 시점부터 이 때까지 2초 소요 (★)
...소스 코드...
while ...
... 소스 코드...
elapsed_time 계산 -> 프로그램 시작 시점부터 이 때까지 3초 소요 (●)
프로그램을 시작하고부터 ★ 지점까지는 2초가 소요 되었습니다.
프로그램을 시작하고부터 ● 지점까지는 3초가 소요 되었습니다.
그러면 ★ 와 ● 까지는 1초가 소요된 것이죠.
total_time 이 100초이며, 100초부터 99, 98, 이렇게 줄어들어야 하므로 elapsed_time 은 1초, 2초, .. 이렇게 증가해야 합니다.
하지만 pygame.time.get_ticks() 는 프로그램 시작 시점부터 그 문장이 실행될때가지의 시간이라 했으므로, 앞에 ★ 부분까지 소요된 2초를 포함한 전체 시간이 나오겠지요? 그러면 준혁님께서 말씀하신 코드대로 하면 elapsed_time 의 처음 값은 최소한 3초 이상일겁니다. 그러면 total_time 에서 3초를 뺀 97 초가 처음값이 되는 문제가 생길 수 있는거죠.
start_ticks 를 빼면, ● 까지 3초 소요된 시간 중 ★ 까지 2초 소요된 시간을 빼기 때문에 1초가 될 것이고, total_time 에서 1초를 뺀 99초가 될겁니다.
정리하면, 게임 루프 (while 부분) 에 진입하기 전까지의 소스코드가 수행되기 위해 소요되는 시간은 빼기 위해 start_ticks 를 따로 빼준답니다. ^^ 감사합니다.
@@nadocoding 설명이 너무 친절하셔서 바로 이해가 됐습니다^^ 바쁘신 와중에 이렇게 답변을 해주시니 감사합니다ㅠㅠ
@@최준혁-l7i 자 그럼 진짜 이해하셨는지 퀴즈를... ㅋㅋ
@@nadocoding ㅋㅋㅋㅋㅋ혼자 쫌 더 공부해 볼께요....
53:29 실수는 누구나 합니다. 저도 해요 ㅎㅎㅎ
@@설윤사랑해 ㅇㅇ
안녕하세요?
올려주신 강의 너무나도 유익하게 보면서 배우고 있습니다.
다름이 아니오라,
제가 강의를 따라서 타이핑하다 보니, 에러가 나는 부분이 있어서요.
어디냐면
영상 15:46 부분의 "screen.blit" 부분에서 오류가 생깁니다.
오류 메시지는 "NameError : name 'screen' is not defined" 입니다.
그런데 아무리 살펴도 선생님의 코드와 제 코드에는 아무 차이(오타나 띄어쓰기, tab 등등)가 없더라구요...
왜 이런 일이 생기는 걸까요?
이것때문에 따라해보질 못하고 그냥 강의만 보고 있습니다...
귀찮으시더라도 답변 달아주시면 영광이겠습니다.
너무나도 감사드립니다!!!
강의 잘들었습니다. 머릿속에 쏙쏙 들어오네요. 키보드 소리도 듣기 좋네요 사각사각 거리는게 키보드는 어떤 키보드를 쓰시는지 물어봐도 될까요?
처음에 pygame 다운로드 할 때
pip install pygame 을 쳐도 다운로드가 되질 않네요...
54:43 텍스트) 책갈피
그 와중에 나는 저 사람 게임 잘하는거만 보이지..
1:48:19초 입니다
weapons = [ [w[0], w[1] - weapon_speed] for w in weapons]
# 천장에 닿을 무기 없애기
weapons = [ [w[0], w[1] - weapon_speed] for w in weapons if w[1] > 0]
여기서 무기 위치 조정이랑 천장에 닿을 무기 없애기를 했습니다. 근데 여기서 for 문이 w[1] 좌표에서 weapons speed를 빼게 계속 반복해주는 건데 for 문을 앞에 안 쓰고 뒤에 써도 되나요? 한줄 for 문이어서 그런건가요?
파이썬 game강의도 잘 보았습니다. 알림 설정하고 다른 동영상도 쭉 가겠습니다.
배우다 보니까....
컴퓨터 게임들 움직이는거 레알 어떻게 만든거야...
유니티, 또는 다른 프레임 웤을 사용해 더 편리하게 만들죠 퍼이게임으로 만드는 사람은 많이 없는것 같아요 ㅎㅎ
어디서 어떻게 몇 년이나 노력하며 배우셨길래
이렇게 설명하며 코딩을 자연스레 하시는 거죠..?
초보자 입장으로 너무 감사하고 신기할 따름이예요
나도코딩처럼 되고 싶습니다!! 하트하트
1:02:46 내가 볼려고!!
저는 영상을 보면서 무엇을 할 것이다~ 를 말해주시면 파이썬으로 구현을 해보고 어떻게 하셨는지 참고를 했습니다... 시간은 영상의 두 배 이상 걸리지만 확실히 배울 수가 있었네요~
좋은 강의 감사드립니다.
학습중...
1:57:37공 튕기기
수업 진행하실 때 영상이 길면 집중이 떨어져서 가끔 놓지는 부분 있는데, 일일이 각주 달아주셔서 정말 효율적입니다. 진심으로 감사합니다 ㅜ
완전 온라인(?) 학원에 다니는것 같음 ㅎㅎㅎ
54:58 텍스트 할 차례입니다~~
저는 지금 막 코딩을 시작하려는 사람인데요 파이썬 기본편을 본 뒤에 이것을 해보려 하는데
해보니까 쉬워서 파이썬을 계속 할거입니다! 다음에도 더 재미있는 코딩영상 많이 올려주세요!!!!!!
현재 55:30 까지 봤습니당 듣기에 너무 편안하고 좋습니다
좋은 영상 감사드립니다 ㅎㅎ
2:20:02...
싫어요 한 사람들은 딱봐도 프로그래밍 강의하면서 돈 버는 사람들인데 무료로 이런거 유튜브로 올리니 배알이 꼴리나 보네
28:27 책갈피
💙안녕하세요. 3주에 걸쳐 기본편을 다 듣고 넘어왔습니다. 혹시 이 강의를 듣고 다음 강의를 들어야하나요? 바로 활용편2로 넘어가도 괜찮을까요?
18:32 배경 부분에서요
아래 코드에서 아래와 같이 오류가 나네요.
조치 방안이 있을까요?
참고로 m1 맥북이며 pygame은 "python3 -m pip install pygame==2.0.0.dev6 --user" 이렇게 설치 했읍니다.
backgroud = pygame.image.load\
("/Users/dukeh/Downloads/PythonWorkSpace/pygame_basic/background.png")
--> pygame.error: File is not a Windows BMP file
1:07:43 까지 봤다
26:10
“음..이렇게 하면 될려나..?”
가능합니다 파이썬이거든요
선생님 팁하나 알려드릴까요??
같은단어 여러개를 한번에 봐꾸실 때 단축키
Ctrl + Shift + L
를 사용하시면 편리합니다.
나도코딩 님 1:33:21 에서 이렇게 일일이 빼는것도 좋지만 이렇게 변수를 만들어서 하면 어때요?
stage = py.image.load(os.path.join(image_path, 'stage.png'))
stage_size = stage.get_rect().size
stage_height = stage_size[1]
stage_y_pos = HEIGHT - stage_height #바뀐 부분
이렇게 stage_y_pos도 캐릭터처럼 만들고 쭉 가서
screen.blit(background, (0, 0))
screen.blit(stage, (0, stage_y_pos)) #여기서 쓰는거에요
screen.blit(charather, (charather_x_pos, charather_y_pos))
제가 초딩이여서 인지 아니면 그냥 저 방법이 편하든 간에, 이 방법이 편하면 이 방법을 쓰세요.
프로그램 하지마라 선배로써 피흘리며 충고한다 조선에서는 하지마라
무슨 프로그램 쓰시는건가요? pycharm은 아닌거같고 되게 좋아보이네요
@팔토 감사합니다~!
감사합니다... 제 기준 코딩 유투버 중 최고 잘 가르치십니다
230102 ~54:42 수강시작
230103 54:42~1:50:42 퀴즈 완료, 프로젝트 이벤트 처리까지 완료(+코드 수정하여 무기 최대 2개 발사 가능하도록 설정)
230104 1:50:42~2:27:38 공 튀기기 및 작은 공으로 쪼개기 구현 완료
230105 2:27:38~ 수강 끝
나코님의 코드를 일부 다르게 작성해서 그런 것인지는 모르겠지만 저는 다른 부분에서 버그가 나오는 것 같네요... 동일한 위치에서 무기 2개를 발사한 경우 무기에 맞지 않은 공이 사라지는 버그가 발견되는 것 같은데 저도 한 번 다시 코드를 검토해야 할 것 같습니다... 역시 코드 작성보다도 코드 리뷰, 에러 체크가 어렵게 느껴지네요.
인프런에서 강의 듣고 왔습니다. 활용편1 완강했습니다. 너무 좋은 강의 감사합니다.^^
게임 완성도를 높이고 싶은 욕심에 링크해 주신 이미지 파일 찾아서 이미지 만들고 이미지 바깥 부분은 투명처리하고... ㅎㅎ
이것 저것 하다보니 시간이 금방 가네요.
이것 저것 찾아서 공부하다 보니 공 이미지 부분은 공 사이즈만 조정한다면
변경 전...
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 = pygame.image.load(os.path.join(image_path,"balloon1.png")).convert_alpha()
ball2 = pygame.transform.scale(ball,(80,80))
ball3 = pygame.transform.scale(ball,(40,40))
ball4 = pygame.transform.scale(ball,(20,20))
ball_images = [ball, ball2, ball3, ball4]
이렇게 처리하는게 나머지 공 이미지를 그리지 않아도 되니 조금 더 효율적인 듯 했습니다.
지금은 완성도를 조금 더 높이고 싶어서 충돌 부분을 지금보다 조금 더 정밀하게 처리하는 방법을 찾아 보고 있습니다.
다시 한번 강의 감사 드립니다. ^^
너무너무 훌륭하십니다. ^^ 강의보다 훨씬 효율적인 코드 공유 감사드립니다!
@@nadocoding 나도코딩님의 강의에 비할바가 아닙니다. 과찬이십니다.^^ 그리고 나도코딩님~ 제가 공과 캐릭터 충돌 부분을 조금 개선해 봤습니다.
충돌 관련해서 주말 동안 이것저것 검색해본 결과 sprite 클래스를 이용해서 group 으로 충돌처리를 하면 아주 좋았구요.
지금 현재 소스에서 수정을 최소화해서 충돌 부분을 개선할 수 있는 방법을 고민한 결과....
1. 수정부분 첫번째
변경 전
# 캐릭터 만들기
character = pygame.image.load(os.path.join(image_path,"character.png"))
변경 후
# 캐릭터 만들기
character = pygame.image.load(os.path.join(image_path,"character.png")).convert_alpha()
character_mask = pygame.mask.from_surface(character)
2. 수정부분 두번째
변경 전
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 = pygame.image.load(os.path.join(image_path,"balloon1.png")).convert_alpha()
ball2 = pygame.transform.scale(ball,(80,80))
ball3 = pygame.transform.scale(ball,(40,40))
ball4 = pygame.transform.scale(ball,(20,20))
ball_images = [ball, ball2, ball3, ball4]
3. 수정부분 세번째
변경 전
# 공과 캐릭터 충돌 처리
if character_rect.colliderect(ball_rect):
running = False
break
변경 후
# 공과 캐릭터 충돌 처리
ball_mask = pygame.mask.from_surface(ball_images[ball_img_idx])
offset = (int(ball_pos_x - character_x_pos) , int(ball_pos_y - character_y_pos))
if character_mask.overlap(ball_mask,offset):
running = False
break
이렇게 세부분만 수정하면 공과 캐릭터 충돌처리 부분이 정말 많이 개선 되었습니다. 특히 공의 모서리 부분에서의 충돌은 엄청난 차이가 있었구요.
혹시라도 나중에 강의 UPDATE 하실 일이 생기면 이 부분 반영해도 좋을 듯 합니다. 그럼 수고하세요. 전 나도코딩님의 다른 강의 들으러 갑니다.^^
마스킹 처리를 해주셨네요 ^^ 강의를 제작하면서 어느 정도 범위까지 할까, 어느 정도 난이도까지 할까, 보다 많은 분들이 보다 쉽게 배우려면 어디까지 해야할까를 참 많이 고민했는데, 스스로 이렇게 응용을 잘 하시니 대단하시네요! ^^ 단편 게임 프로젝트 강좌 제작 시에는 알려주신 내용 참고해서 해볼게요~ 감사합니다.
1:57:37
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"]
이렇게 썼을때 실행해보면 공이 화면 밖으로 올라가는 장면을 볼 수 있는데 왜 그런건가요?
그리고 ball_val["to_y"]= ball_val["init_spd_y"] 를 해서 to_y에 값을 넣게 되고 ball_val["pos_y"] += ball_val["to_y"]
을 통해서 to_y값을 pos_y에 더하게 되는데 pos_y는 바뀐 좌표로 즉시 이동되지 않고 움직이는 과정이 보이면서 가지는 건가요?
(말 표현이 미숙한 점 죄송합니다..)
선생님 강의 잘보고 있습니다. 감사합니다.
다름이 아니고 38:00쯤에 이해가 잘 안되는 부분이 있어서 여쭤보려 하는데요,
if character_x_pos < 0:
character_x_pos = 0
이게 'x좌표가 0보다 작으면 0으로 되돌린다' 라는 의미 아닌가요? 그러면 사실 화면 밖으로 삐져나갔다가 다시 돌아오는 식으로 작동하는거로 저는 이해를 했는데요,
근데 실행시켜보면 화면 밖으로 애초에 안나가는 것처럼 보여서 지금 혼란스럽네요.
제가 어느부분을 놓친건가요?
1:02:30초입니다.
# 잠시 대기
pygame.time.delay(2000) # 2초 정도 대기 (ms)
이 소스코드를 while 구문에도 적용 안 시켜놨는데 2초 대기 되는 이유가 뭔가요? 끝날 때 2초 대기가 된다는 식으로 적용 시켜야 하는거 아닌가요? 그냥 소스코드 마지막 부분에 해도 끝날 때 2초 딜레이로 적용 되나요? 만약 그렇다면 if 조건문중에 running = False 가 되는 경우도 있었는데 거기서 꺼지면 저 2초 딜레이는 적용이 안되는 거 아닌가요?
2020.10.5(day1)
책갈피 24:40
2번째 책갈피 33:32
2020.10.6(day2)
3번째 책갈피 1:00:12
4번째 책갈피 1:07:04 (퀴즈1 풀고 있는중)
2020.10.7(day3)
5번째 책갈피 1:22:16
2020.10.8(day4)
6번째 책갈피 1:35:10
2020.10.9(day5)
7번째 책갈피 1:54:06
2020.10.11(day6)
8번째 책갈피 2:18:00
2020.10.14(day7)
9번째 책갈피 2:27:35(공쪼개기가 잘안되서 해매고 있는중)
긴 시간동안 수고 많으셨습니다. 친절한 설명 감사합니다.
17:28부분에 배경그리기 부분에서
screen = pygame.display.set_mode((screen_width, screen_height))
코드를 적어두 screen변수가 none이라고 뜹니다
그래서 screen.blit(background,(0,0)) 코드를 적어도
'NoneType' object has no attribute 'blit' 라고 오류가 발생하는데 어떻게 해결해야 할까요?
(메모1)
pygame.display.set_caption("Nado Game")이라고 적어야 하는데
screen = pygame.display.set_caption("Nado Game")이라고 적어서 반환값이 없던 것
1:13:42 파이썬 초보라 보고 잘 따라하고 있는데 이벤트 처리 해당 부분에서 움직임이 부드럽지 않은 느낌이 있어서
to_x = 0 변수 추가 부분에
to_xL = 0
to_xR = 0 변수 추가 하고
이벤트 처리 부분에서
if event.type == pygame.KEYDOWN: #키가 눌러졌는지 확인
if event.key == pygame.K_LEFT: # 캐릭터를왼쪽으로
to_xL -= character_speed
elif event.key == pygame.K_RIGHT: # 캐릭터를 오른쪽으로
to_xR += character_speed
if event.type == pygame.KEYUP: #방향키를 떼면 멈춤
if event.key == pygame.K_LEFT:
to_xL = 0
elif event.key == pygame.K_RIGHT:
to_xR = 0
to_x = to_xL + to_xR
이런식으로 처리하는게 캐릭터 움직임이 더 부드러웠어요
나도코딩님 안녕하세요! 혹시 환경설정 부분 7분에서나오는 설정에서 linting을 검색해봐도 안나오는데 어떻게 해야할까요?? 제발 부탁드립니다ㅠㅠ
vscode 업데이트 된듯요 8:20 이벤트 루프 부터 만들어 봐요
@@와_얼불춤 댓글달아주셔서 감사합니다!
감사합니다. 참으로 무지 귀한 강의와 자료입니다.
강의 너무 잘 듣고 완성했습니다! 정말 도움되고 흥미로운 강의였어요. 친절하게 잘 알려주시고 단계별로 나눠서 진행해 복잡하지 않게 하나하나 이해할 수 있었습니다. 감사합니다!
삼종 세트 하고 갑니다
좋은 영상 대박 나세요🦊🦊🦊🐶🐶🐶
언젠가 머신러닝하고 데이터 분석도 부탁드려요~! 나도코딩님이 만들어주시면 공부하는데 많은 도움이 될것 같아요! 항상 감사합니다.
책갈피
40:00
잘 보고 갑니다~~ 나중에 또 올게요!!
기본편 공부 끝내고 활용편 시작합니다. 강의가 너무 좋습니다. 활용편 기대됩니다.
절말 감사합니다~~
삶의 활력이 되네요^^