잠깐! 질문이 있으신가요? 아래 영상의 설명을 참고하셔서 질문게시판을 이용해보세요 ^^ 이미 답변이 되었을 수도 있답니다. - 자주 묻는 질문 게시판 : nadocoding.tistory.com/17 - 사용방법 : ua-cam.com/video/LZQC9mEzdtk/v-deo.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 ...
이번에도 어찌저찌 해보겠습니다 선생님 파이썬이 익숙해지는 그날까지...★ 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 ...
영상 시작 부분에서 pygame 설치 오류가 뜨는 분들이 많으실 텐데, 22년 12월 기준으로 python 3.11 이상 최신 버전은 pip install pygame 실행 시 설치가 안 되는 오류가 있습니다. 낮은 버전을 다시 설치하셔야 하는데, 3.7 이전 버전은 VS code에서 디버깅 툴이 지원되지 않으므로 3.7~3.10 사이의 버전 설치를 권장합니다. 저는 3.10.9 버전으로 해결했습니다.
기본편 끝내고 현재 활용편1까지 다 따라했습니다! (이제는 선생님이라고 불러야 할 것 같습니다 ^^) 그냥 보고 따라하니 조금씩 이해가 가고 퀴즈를 통해서 더욱 이해가 잘가네요. 진짜 아무것도 모르고 시작해서 금방 포기 할 줄 알았는데 너무 재밌게 배우고 있습니다! 영상 만드시는데 수고가 많으시겠지만 꾸준히 올려주세요! 감사합니다
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'을 넣어서 멈추게 하려 했는데도 안되더라고요 ㅠ) 제 방법이 조건문이 더 겹겹이 있어서 시간적인 면에서 비효율적이긴 해도 논리상 구현은 돼야 할 것같은데, 이대로 실행을 하면 캐릭터가 계속 왼쪽 경계밖으로 벗어나네요 ㅠ 제 코드에 어떤 논리상 오류가 있는건가요??
바다 건너 사는데요... 시작할까말까 고민만 1년 하다가... 까먹고 있다가 우연한 기회에 다시 접하게 되서 정말 기쁩니다. 퇴근후에 30분 정도라도 강의 듣고 있으면 그래도 머리가 약간은 돌아가는 느낌이 드네요.ㅋㅋㅋ 소걸음으로 시작한지 그래도 몇주 되어갑니다. 잘듣고 잘보고 잘흉내 내서 나도한번 코딩을 제대로 해보는 시간이 오기를 간절히 기다려봅니다.. 직장에서도 잘 써먹어서 좋은 프로모션이 있으면 더 좋구요..늘 감사 합니다.
linting 이라는 설정이 안 나오면... (2024년 2월 12일) 제 생각에는 vscode가 업데이트가 되서 사라진것 같습니다 그냥 결론 예기 하면 8:20 부터 이벤트루프 만들어 보세요. (그냥 코드부터 보고 싶다면 11:08 ) 이게 왜 이러냐면 vscode가 업데이트 되서 그 설정이 사라졌지만 나도코딩님의 영상을 보면 linting 어쩌구가 체크 되있고, 체크 해제 해야 하는데, 없어지면서 체크 해제가 기본 값이 된것 같습니다. 그러니까 그 설정을 할 필요가 없어졌다는 소리에요
댓글을 안달래야 안달 수가 없습니다. 너무나도 완벽합니다. 이제 파이썬 책 한바퀴 돌리고 두바퀴째 돌리기 직전에 한번 무작정 따라했는데 뭔가 광명을 찾은 느낌입니다. 전체 큰 틀이 느껴지고 큰 깨달음을 얻어갑니다. 결국 for, if문을 활용해서 이 게임이란걸 만들어내다니....ㄷㄷㄷ 재미가 붙습니다. 감사합니다. 최고(굿)(굿)(굿)
첨에 살짝 (좌표 50,50)에서 x축 이동방향 오른쪽으로 3, y축 이동방향 위로 -6만큼 올라갔다가 내려감. 왼쪽 위에서 -> 바닥에 두 번 튀기고 오른쪽 벽에 맞고 다시 바닥에 두 번 튀기고 왼쪽 벽에 맞는다는 것을 가정(반복) ball_val["pos_x"] += ball_val["to_x"] ---- 내려올 때 x 축 이동방향 3씩 증가 즉 ball_val["pos_x"] += 3 else: # 그 외의 모든 경우에는 속도를 증가 ball_val["to_y"] += 0.5 ---- 내려올때 y축 이동방향 -6에 += 0.5 증가 ============================================================================ # 스테이지에 튕겨서 올라가는 처리 if ball_pos_y >= screen_height - stage_height - ball_height: ball_val["to_y"] = ball_val["init_spd_y"] ---- 튀어오르고 ball_val[“to_y”] = -18 ball_val["pos_x"] += ball_val["to_x"] ----이때 x 축 이동방향은 튕겨서 올라갈 때 x 축 이동방향 3씩 증가 즉 ball_val["pos_x"] += 3 포물선 상단 찍고 내려올 때 else: # 그 외의 모든 경우에는 속도를 증가 ball_val["to_y"] += 0.5 ---- 내려올때 y축 이동방향 -18에 += 0.5 증가 ball_val["pos_x"] += ball_val["to_x"] ----이때 x 축 이동방향은 튕겨서 포물선 상단 찍고 내려 올 때 x 축 이동방향 3씩 증가 즉 ball_val["pos_x"] += 3 ============================================================================ 두번째 튀김 # 스테이지에 튕겨서 올라가는 처리 if ball_pos_y >= screen_height - stage_height - ball_height: ball_val["to_y"] = ball_val["init_spd_y"] ---- 튀어오르고 ball_val[“to_y”] = -18 ball_val["pos_x"] += ball_val["to_x"] ----이때 x 축 이동방향은 올라 갈 때 x 축 이동방향 3씩 증가 즉 ball_val["pos_x"] += 3 포물선 상단 찍고 내려올 때 else: # 그 외의 모든 경우에는 속도를 증가 ball_val["to_y"] += 0.5 ----내려올 때 y축 이동방향 -18에 += 0.5 증가 ball_val["pos_x"] += ball_val["to_x"] ----이때 x 축 이동방향은 내려올 때 x 축 이동방향 3씩 증가 즉 ball_val["pos_x"] += 3 ============================================================================ # 세로벽에 닿았을 때 공 이동 위치 변경 (튕겨 나오는 효과) if ball_pos_x < 0 or ball_pos_x > screen_width - ball_width: ball_val["to_x"] = ball_val["to_x"] * -1 오른쪽 벽 받고 3에서 -3으로 이동방향이 왼쪽으로 ball_val["pos_x"] += ball_val[3] * -1 ball_val["pos_x"] += -3] 값이 점점 감소하여 왼쪽으로 떨어지며 움직임
else: # 그 외의 모든 경우에는 속도를 증가 ball_val["to_y"] += 0.5 y 이동 방향은 아래로 증가 ============================================================================ # 스테이지에 튕겨서 올라가는 처리 if ball_pos_y >= screen_height - stage_height - ball_height: ball_val["to_y"] = ball_val["init_spd_y"] 왼쪽으로 한번 튀김 튀어오르고 ball_val[“to_y”] = -18 로 초기화 되고. else: # 그 외의 모든 경우에는 속도를 증가 ball_val["to_y"] += 0.5 내려올 때 y 이동 방향은 증가 ball_val["pos_x"] += ball_val["to_x"] ---- 내려올 때 x 축 이동방향 -3씩 감소 즉 ball_val["pos_x"] += -3 ============================================================================ [왼쪽으로 한번 더 튀김] # 스테이지에 튕겨서 올라가는 처리 if ball_pos_y >= screen_height - stage_height - ball_height: ball_val["to_y"] = ball_val["init_spd_y"] 튀어오르고 ball_val[“to_y”] = -18 로 초기화 되고.( 포물선 상단 꼭지점 까지 y 이동 방향은 감소) 벽 맞기 전 까지는 x 이동 방향은 감소 ball_val["pos_x"] += -3] ============================================================================ if ball_pos_x < 0 or ball_pos_x > screen_width - ball_width: ball_val["to_x"] = ball_val["to_x"] * -1 왼쪽 벽 받고 -3에서 3으로 이동방향이 오른쪽으로 ball_val["pos_x"] += ball_val[-3] * -1 ball_val["pos_x"] += 3] 값이 점점 증가하여 오른쪽으로 떨어지며 움직임 [반복] 공 위치 정의 이거 이렇게 이해했는데 맞는가 봐주세요....
인프런에서 강의 듣고 왔습니다. 활용편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 하실 일이 생기면 이 부분 반영해도 좋을 듯 합니다. 그럼 수고하세요. 전 나도코딩님의 다른 강의 들으러 갑니다.^^
마스킹 처리를 해주셨네요 ^^ 강의를 제작하면서 어느 정도 범위까지 할까, 어느 정도 난이도까지 할까, 보다 많은 분들이 보다 쉽게 배우려면 어디까지 해야할까를 참 많이 고민했는데, 스스로 이렇게 응용을 잘 하시니 대단하시네요! ^^ 단편 게임 프로젝트 강좌 제작 시에는 알려주신 내용 참고해서 해볼게요~ 감사합니다.
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 를 따로 빼준답니다. ^^ 감사합니다.
230102 ~54:42 수강시작 230103 54:42~1:50:42 퀴즈 완료, 프로젝트 이벤트 처리까지 완료(+코드 수정하여 무기 최대 2개 발사 가능하도록 설정) 230104 1:50:42~2:27:38 공 튀기기 및 작은 공으로 쪼개기 구현 완료 230105 2:27:38~ 수강 끝 나코님의 코드를 일부 다르게 작성해서 그런 것인지는 모르겠지만 저는 다른 부분에서 버그가 나오는 것 같네요... 동일한 위치에서 무기 2개를 발사한 경우 무기에 맞지 않은 공이 사라지는 버그가 발견되는 것 같은데 저도 한 번 다시 코드를 검토해야 할 것 같습니다... 역시 코드 작성보다도 코드 리뷰, 에러 체크가 어렵게 느껴지네요.
나도코딩님 안녕하세요 강의 정말 잘 보고있습니다. 한 가지 질문이 있는데요. 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
궁금한것이 있습니다! 퀴즈에서 똥 피하기에서 여러개의 똥을 내리게 할려고 만들기 위해 enemy_list = [] 이렇게 만들어 for i in range(0,max_level): enemy = pygame.image.load("C:\PythonWorkspace\enemy.png") enemy_width = character_size[0] # 가로의 크기 enemy_height = character_size[1] # 세로의 크기 enemy_x_pos = screen_width / 2 - randrange(100,300) # 화면 가로의 절반 크기에 해당하는곳에 위치 enemy_y_pos = (screen_height / 2) - (character_height / 2) #화면 세로 크기 가장 아래 해당하는곳 위치
enemy_list.append(enemy) 이런식으로 만들었습니다 그런데 그리는곳에 리스트 안에 있는 enemy 을 빼내서 쓸려고 하는데 for i in range(0,2): enemy=enemy_list[i] screen.blit(enemy,(enemy_x_pos,enemy_y_pos)) 마지막에 저장 했던 list 만 꺼내와지네요 왜이런지 모르겠습니다.
안녕하세요? 올려주신 강의 너무나도 유익하게 보면서 배우고 있습니다. 다름이 아니오라, 제가 강의를 따라서 타이핑하다 보니, 에러가 나는 부분이 있어서요. 어디냐면 영상 15:46 부분의 "screen.blit" 부분에서 오류가 생깁니다. 오류 메시지는 "NameError : name 'screen' is not defined" 입니다. 그런데 아무리 살펴도 선생님의 코드와 제 코드에는 아무 차이(오타나 띄어쓰기, tab 등등)가 없더라구요... 왜 이런 일이 생기는 걸까요? 이것때문에 따라해보질 못하고 그냥 강의만 보고 있습니다... 귀찮으시더라도 답변 달아주시면 영광이겠습니다. 너무나도 감사드립니다!!!
정말 재미있게 잘보고 만들어봤습니다! 게임엔진을 먼저 접하다 보니 이런 기본적인 부분들이 어떻게 작동하는지 무지상태였는데 그렇다고 C++강의를 들으니 비우는 양이 너무 방대하고 기초로 배울게 너무 ㅁ낳더라구요..... 이렇게 파이썬으로라도 만들어보니 당연하게 생각한 부분들이 당연하지 않고 어떻게 만들어졌을지, 내가 구현한다면 어떻게 해야할 지 힌트를 얻을 수 있는 시간이었던 것 같습니다. 어느정도 개념파악이 되었으니 활용편들도 실습해보고 C++까지 배울 수 있는 사람이 되었으면 좋겠습니다 감사합니다!
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 이런식으로 처리하는게 캐릭터 움직임이 더 부드러웠어요
잠깐! 질문이 있으신가요? 아래 영상의 설명을 참고하셔서 질문게시판을 이용해보세요 ^^ 이미 답변이 되었을 수도 있답니다.
- 자주 묻는 질문 게시판 : nadocoding.tistory.com/17
- 사용방법 : ua-cam.com/video/LZQC9mEzdtk/v-deo.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 에서 하시게 되면 많이 불편하실거라 생각합니다 ^^
솔직히 이런 강의가 한국어 영상으로
나와준다는게 너무나
감사할 따름이네요. 감동입니다11
대한민국에 많은 훌륭한 강의들이 있지만 사교육비 절감에 조금이나마 일조하고 싶었는데 많은 분들이 호응해 주셔서 얼마나 감사한지 모릅니다. 계속 좋은 영상을 만들도록 꾸준히 노력하겠습니다 ^^
@@nadocoding 계속 좋은 영상 빨리 올려주세요...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ (좋은 강의 잘보고 있습니다. ^^)
@@nadocoding 대기업 부품으로써 자괴감 많이 느끼고 있었는데, 나도코딩님 강의로 늦었지만 프로그래머라는 꿈을 갖게 되었어요.
앞으로 2년 열심히 공부해서 프로그래머로 새 삶을 시작하려 합니다. 너무 감사합니다.
맨날 흑백화면에 print나 쳐대는 게 코딩인가 싶었는데 실용편 따라하니 진짜 코딩의 참맛을 알 것 같습니다.
말 잘하시네요 ㅋㅋㅋㅋㅋㅋㅋ
ㅇㅈ
@@hoya0690 '인정'을 초성으로만 따서 'ㅇㅈ'이라고 써요
20:59 책갈피✨
내가본 파이선 강의중에 최고다... 이만한거 없다.. 그냥 여기서 1달만 미친척하고 하면 파이썬 쌉고수.. 강의 정말 최곱니다요
이번에도 어찌저찌 해보겠습니다 선생님 파이썬이 익숙해지는 그날까지...★
1:41:35 무기 발사 처리
1:45:12 공격 시 무기 위로 올라가게 조정
1:54:00 공격당한 공 쪼개지고 늘어나고 하는거
1:58:33 enumerate
2:05:48 공 튕김처리 그림판 설명
강의 하시는데 목소리가 너무 차분하고 귀에 잘 들어옵니다. 가르치는데 천부적인 목소리를 소유하신 것 같아요. 감사합니다!
칭찬 정말 감사드립니다. ^^ 제게는 늘 어색한 제 목소리지만 전달이 잘 된다고 하시니 진짜 다행이에요 ㅋㅋㅋ
PC언어는 내것은 아니라고 생각하며 지내왔는데..."나도코딩님" 의 기본편(약2주간) 보고 더할나위 없는 실력과 강의에 감탄 금할 수 없네요.. 멋지고 최곱니다. 한걸음 한걸음 나아가고 많이 배우겠습니다.
갑니다
정말 최고의 강의입니다. 전 초딩,중딩,고딩은 알아도 코딩은 전혀 모릅니다. 그런 제가 강의하시는대로 따라 하니 조금씩 알게 되더라구여. 진심으로 감사드립니다. 목소리 최고, 강의 이끌어 가시는 스킬도 최고입니다. 복 받으실 거예요.
코하하하
책갈피 1:07:47
이런영상 많이 올려주셔서 감사합니다, 공부 잘 하고 있어요.
처음 댓글을 달아봐요...파이썬 독학중입니다. 이렇게 고컬리티 강의를 무료로 올려주셔서 ..너무 감사 드립니다.. 어떤 강의도 이런 퀄은 없었네요..더하기 빼기 강의만 수두룩했는데,, 이런 실전 강의를 올려주셔서 다시 한번 감사드립니다.
28:27 이번에도 잘 따라가 보겠습니다~ 감사합니다.
저도 나름 코딩강사랍시고 여기저기 강의 하며 다녔었고, 파이게임의 주제로도 강의한 적 있었는데,
이 영상을 보니 제가 했던건 강의 축에도 못낀다는걸 느꼈습니다.
가지고 계시는 지식도 훌륭하시지만, 그걸 전달하고 설명하시는 실력도 대단하시네요
앞으로도 좋은 영상 기대하겠습니다.
진짜재밋다ㅋㅋㅋㅋㅋㅋ 파이썬 파짜도 모르고 아직 기초도 안듣고 있는데 이해가 되면 얼마나 잘 가르쳐주시는 거징ㅎㅎ 이거 보고 기초편보면 정말 재밋게 배울 수 있을 것 같아요ㅎㅎ 감사합니당ㅎㅎ
똑똑혜
@@이기섭섭하다 7
@@이기섭섭하다
저분 동생이라서 형 선전해주는 거 아닐까요?
@@kimjunsik540
안 똑똑해!
감사합니다. 너무, 훌륭한 강의 .. 그리고, 광고도 없구오... 최고의 영상.. 감동X1000만배 입니다.
와 ... 뒤늦게 이 강의 따라 해 보고 있는데, 챕터 하나 하나 풀어 나가고 결과가 제대로 나올때마다 희열이 느껴지네요 ^^ 댓글이 왜 많이 달렸는지 이해가 갑니다. 감사합니다.
목소리도 너무 듣기 좋고요, 설명도 너무 친절하시고, 강의 퀄리티도 높고요, 너무 최고에요!
자꾸 이러시면 진짜인 줄 알고 혼자 헤벌레... 합니다.
3000 만큼 감사합니다♥
키 이벤트를 통한 캐릭터 이동 시 방향키를 빠르게 누르면 캐릭터가 아예 멈춰버리는 현상이 생깁니다.
프로젝트 코드 기준으로 아래와 같이 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 로 둘로 나눈거 맞습니다 ^^
이번에도 다 듣고 따라해 보았어요!! 와우~~ 같이 따라 할때는 귀에 쏙쏙 잘 들어와요 ㅎㅎㅎ^^ 대박ㅎㅎㅎ 넘넘 재밌어요!!! 감사합니다.~~~^^
ㅠㅠ 감동입니다. 이렇게 열심히 하시는 분이 계시니... 다음 강의도 열심히 준비하겠습니다!!!^^
나만 어려운가.. 무슨말은 하는지는 알아듣는것 같아도 막상
안보고 똑같이 해보라면 시작부터 막막하네요 공 액션 나오기 시작할때부터
한계를 느끼네요. 다들 잘 하시는것 보니 대단합니다.
[책갈피]
1:07:04
좋은 강의 올려주셔서 감사합니다!
책 한권 본 느낌, 아니 다른 책(파이썬 완벽가이드)에서는 언급되지 않은것도 볼 수 있어 좋았습니다. 추천입니다. ^^
1:04:00
파이썬을 아예 모르는 상태에서 봤는데도 전체적인 내용이 잘 이해되네요!! 세부적인 문법만 익힌다면 저도 충분히 게임을 만들 수 있다는 자신감을 얻었습니다. 좋은 강의 감사해요~~!
선생님 기초 6시간 듣고 왔어요 너무 재밋어요 활용편에선 또 어떤 수업으로 저한테 흥미를 주실지 기대되네용 좋은 강의 감사합니다.
2:10:26
미친듯이 거의 하루 만에 7시간 때려 붓고 영상대로 다만들고 추가로 나만의 방식으로도 만들어보고 이영상에서 흡수 할 수 있는 정보란 정보는 머리에 다 때려박았네요
현재 55:30 까지 봤습니당 듣기에 너무 편안하고 좋습니다
좋은 영상 감사드립니다 ㅎㅎ
영상 시작 부분에서 pygame 설치 오류가 뜨는 분들이 많으실 텐데, 22년 12월 기준으로 python 3.11 이상 최신 버전은 pip install pygame 실행 시 설치가 안 되는 오류가 있습니다. 낮은 버전을 다시 설치하셔야 하는데, 3.7 이전 버전은 VS code에서 디버깅 툴이 지원되지 않으므로 3.7~3.10 사이의 버전 설치를 권장합니다. 저는 3.10.9 버전으로 해결했습니다.
댓글정말안다는편인데 바로 해결됬네요~^^
감사합니당
사랑해요
@user-cb7vf5fm3j python 홈페이지에서 다운 받을 수 있습니다!
감사합니다 :)
활용편 완강 가즈아
54:44
1:22:16 퀴즈 해결 완료
2:10:23 무기, 공 이해중
끝!
기본편 끝내고 현재 활용편1까지 다 따라했습니다! (이제는 선생님이라고 불러야 할 것 같습니다 ^^)
그냥 보고 따라하니 조금씩 이해가 가고 퀴즈를 통해서 더욱 이해가 잘가네요.
진짜 아무것도 모르고 시작해서 금방 포기 할 줄 알았는데 너무 재밌게 배우고 있습니다!
영상 만드시는데 수고가 많으시겠지만 꾸준히 올려주세요! 감사합니다
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'을 넣어서 멈추게 하려 했는데도 안되더라고요 ㅠ) 제 방법이 조건문이 더 겹겹이 있어서 시간적인 면에서 비효율적이긴 해도 논리상 구현은 돼야 할 것같은데, 이대로 실행을 하면 캐릭터가 계속 왼쪽 경계밖으로 벗어나네요 ㅠ 제 코드에 어떤 논리상 오류가 있는건가요??
체크포인트
12/2
39:54 FPS
12/3
1:25:17 배경과 캐릭터
12/4
1:50:43 공 만들기
12/9
완강
감사합니다
초 5학년 입니다. 코딩이 재밌어서 이분 보고 시작했는데 제가 게임을 만들수 있을줄은 몰랐어요. ㅋㅋㅋ 친구한테 제가 만들었다 하니까 안믿더라고여.. 어쨋든 강의 정말 좋아요!!!
고인물 ㄷㄷ
저도 초5인데 C언어 파이썬 열심히 공부중입니다 만들어보니까 재밋더라구요 ㅎ
중1 인데 내일 파이썬 함수 배워요
+ 현재는 코틀린으로 넘어가 앱개발 중
난 중1인데.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ.ㅜ
자바로 역전하겠습니다.
저도 저번달 돌잔치 했는데요 코딩 정말 쉽네요ㅎㅎ
거의 3시간 가까이 되는 영상인데, 시간가는 줄 모르고 보았네요. 파이썬을 혼자 공부하시는 분들께 정말 좋은 강의네요! 코딩하는 걸 어려워하는 어려워하고 활용을 못하는 경우가 많은데 게임을 직접 만들어보며 재미있게 코딩하기 좋아요!
누가 대신 코드 짜줘서 그런가 개재밌네요... ㅎㅎㅎㅎ 감사히 잘 볼게요!
좋은 강의 감사드립니다.
학습중...
1:57:37공 튕기기
바다 건너 사는데요... 시작할까말까 고민만 1년 하다가... 까먹고 있다가 우연한 기회에 다시 접하게 되서 정말 기쁩니다. 퇴근후에 30분 정도라도 강의 듣고 있으면 그래도 머리가 약간은 돌아가는 느낌이 드네요.ㅋㅋㅋ 소걸음으로 시작한지 그래도 몇주 되어갑니다. 잘듣고 잘보고 잘흉내 내서 나도한번 코딩을 제대로 해보는 시간이 오기를 간절히 기다려봅니다.. 직장에서도 잘 써먹어서 좋은 프로모션이 있으면 더 좋구요..늘 감사 합니다.
가격이 부담스러워서 코딩 배우고 싶었지만 못 배우고 있었는데 나도코딩님 덕분에 재밌게 배우고있어요 ㅠㅠ 감사합니다
프로젝트 도입부에 게임 직접 해보는 거 피지컬 ㄷㄷ
77
아니 ㄹㅇ 개잘하긴 하네 ㅋㅋㅋ
linting 이라는 설정이 안 나오면...
(2024년 2월 12일)
제 생각에는 vscode가 업데이트가 되서 사라진것 같습니다
그냥 결론 예기 하면 8:20
부터 이벤트루프 만들어 보세요.
(그냥 코드부터 보고 싶다면 11:08 )
이게 왜 이러냐면 vscode가 업데이트 되서 그 설정이 사라졌지만 나도코딩님의 영상을 보면 linting 어쩌구가 체크 되있고, 체크 해제 해야 하는데, 없어지면서 체크 해제가 기본 값이 된것 같습니다.
그러니까 그 설정을 할 필요가 없어졌다는 소리에요
댓글을 안달래야 안달 수가 없습니다. 너무나도 완벽합니다. 이제 파이썬 책 한바퀴 돌리고 두바퀴째 돌리기 직전에 한번 무작정 따라했는데 뭔가 광명을 찾은 느낌입니다. 전체 큰 틀이 느껴지고 큰 깨달음을 얻어갑니다. 결국 for, if문을 활용해서 이 게임이란걸 만들어내다니....ㄷㄷㄷ 재미가 붙습니다. 감사합니다. 최고(굿)(굿)(굿)
좋은 강의 만들어주셔서 감사해요! 그런데 53:35 너무 귀여우신거 아닙니까?
53:29 실수는 누구나 합니다. 저도 해요 ㅎㅎㅎ
@@설윤사랑해 ㅇㅇ
재밌게 강의 잘 보고있습니다 선생님. 꾸준히 흥미를 가지고 코딩 공부에 임하게 해줄 수 있는 강의는 이 강의가 처음이에요. 감사합니다♥
54:43 텍스트) 책갈피
점점 어려워 지기는 하는데 그냥 무작정 따라하고 있어요 좋은 강의 주셔서 감사합니다.
감사합니다. 참으로 무지 귀한 강의와 자료입니다.
말을 엄청 안정적으로 잘하시네요 짧은 시간도 아닌데 ㄷㄷ 앞쪽 설명 들으면서 똥피하기 생각났는데 퀴즈로 나와서 반갑네요 ㅋㅋㅋ
헛 ㅋㅋㅋ 똥피하기를 먼저 떠올리시다니!! 통했네요 ^^ 강의 뒤로 갈수록.. 말을 많이 해서 그런지 목소리가 조금 허스키해집니다 ㅠㅠ 미리 양해 부탁드립니다 ㅋㅋ
저도 해볼게유
선생님 사랑합니다 강의진짜 잘보고있습니다 나중에 시간되시면 웹코딩도 올려주실수잇나요 이미 나도코딩님한테 중독되서 다른강의를 못보겟네요
따뜻한 댓글 감사합니다 ^^ 파이썬 강의 이후 커리큘럼 구상 시 참고하겠습니다.
1:02:46 내가 볼려고!!
첨에 살짝 (좌표 50,50)에서 x축 이동방향 오른쪽으로 3, y축 이동방향 위로 -6만큼 올라갔다가 내려감. 왼쪽 위에서 -> 바닥에 두 번 튀기고 오른쪽 벽에 맞고 다시 바닥에 두 번 튀기고 왼쪽 벽에 맞는다는 것을 가정(반복)
ball_val["pos_x"] += ball_val["to_x"]
---- 내려올 때 x 축 이동방향 3씩 증가
즉 ball_val["pos_x"] += 3
else: # 그 외의 모든 경우에는 속도를 증가
ball_val["to_y"] += 0.5
---- 내려올때 y축 이동방향 -6에 += 0.5 증가
============================================================================
# 스테이지에 튕겨서 올라가는 처리
if ball_pos_y >= screen_height - stage_height - ball_height:
ball_val["to_y"] = ball_val["init_spd_y"]
---- 튀어오르고 ball_val[“to_y”] = -18
ball_val["pos_x"] += ball_val["to_x"]
----이때 x 축 이동방향은 튕겨서 올라갈 때 x 축 이동방향 3씩 증가
즉 ball_val["pos_x"] += 3
포물선 상단 찍고 내려올 때
else: # 그 외의 모든 경우에는 속도를 증가
ball_val["to_y"] += 0.5
---- 내려올때 y축 이동방향 -18에 += 0.5 증가
ball_val["pos_x"] += ball_val["to_x"]
----이때 x 축 이동방향은 튕겨서 포물선 상단 찍고 내려 올 때 x 축 이동방향 3씩 증가
즉 ball_val["pos_x"] += 3
============================================================================
두번째 튀김
# 스테이지에 튕겨서 올라가는 처리
if ball_pos_y >= screen_height - stage_height - ball_height:
ball_val["to_y"] = ball_val["init_spd_y"]
---- 튀어오르고 ball_val[“to_y”] = -18
ball_val["pos_x"] += ball_val["to_x"]
----이때 x 축 이동방향은 올라 갈 때 x 축 이동방향 3씩 증가
즉 ball_val["pos_x"] += 3
포물선 상단 찍고 내려올 때
else: # 그 외의 모든 경우에는 속도를 증가
ball_val["to_y"] += 0.5
----내려올 때 y축 이동방향 -18에 += 0.5 증가
ball_val["pos_x"] += ball_val["to_x"]
----이때 x 축 이동방향은 내려올 때 x 축 이동방향 3씩 증가
즉 ball_val["pos_x"] += 3
============================================================================
# 세로벽에 닿았을 때 공 이동 위치 변경 (튕겨 나오는 효과)
if ball_pos_x < 0 or ball_pos_x > screen_width - ball_width:
ball_val["to_x"] = ball_val["to_x"] * -1
오른쪽 벽 받고 3에서 -3으로 이동방향이 왼쪽으로
ball_val["pos_x"] += ball_val[3] * -1
ball_val["pos_x"] += -3] 값이 점점 감소하여 왼쪽으로 떨어지며 움직임
else: # 그 외의 모든 경우에는 속도를 증가
ball_val["to_y"] += 0.5
y 이동 방향은 아래로 증가
============================================================================
# 스테이지에 튕겨서 올라가는 처리
if ball_pos_y >= screen_height - stage_height - ball_height:
ball_val["to_y"] = ball_val["init_spd_y"]
왼쪽으로 한번 튀김
튀어오르고 ball_val[“to_y”] = -18 로 초기화 되고.
else: # 그 외의 모든 경우에는 속도를 증가
ball_val["to_y"] += 0.5
내려올 때 y 이동 방향은 증가
ball_val["pos_x"] += ball_val["to_x"]
---- 내려올 때 x 축 이동방향 -3씩 감소
즉 ball_val["pos_x"] += -3
============================================================================
[왼쪽으로 한번 더 튀김]
# 스테이지에 튕겨서 올라가는 처리
if ball_pos_y >= screen_height - stage_height - ball_height:
ball_val["to_y"] = ball_val["init_spd_y"]
튀어오르고 ball_val[“to_y”] = -18 로 초기화 되고.( 포물선 상단 꼭지점 까지 y 이동 방향은 감소)
벽 맞기 전 까지는 x 이동 방향은 감소 ball_val["pos_x"] += -3]
============================================================================
if ball_pos_x < 0 or ball_pos_x > screen_width - ball_width:
ball_val["to_x"] = ball_val["to_x"] * -1
왼쪽 벽 받고 -3에서 3으로 이동방향이 오른쪽으로
ball_val["pos_x"] += ball_val[-3] * -1
ball_val["pos_x"] += 3] 값이 점점 증가하여 오른쪽으로 떨어지며 움직임
[반복]
공 위치 정의 이거 이렇게 이해했는데 맞는가 봐주세요....
인프런에서 강의 듣고 왔습니다. 활용편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 하실 일이 생기면 이 부분 반영해도 좋을 듯 합니다. 그럼 수고하세요. 전 나도코딩님의 다른 강의 들으러 갑니다.^^
마스킹 처리를 해주셨네요 ^^ 강의를 제작하면서 어느 정도 범위까지 할까, 어느 정도 난이도까지 할까, 보다 많은 분들이 보다 쉽게 배우려면 어디까지 해야할까를 참 많이 고민했는데, 스스로 이렇게 응용을 잘 하시니 대단하시네요! ^^ 단편 게임 프로젝트 강좌 제작 시에는 알려주신 내용 참고해서 해볼게요~ 감사합니다.
이 채널을 이제라도 알아서 다행이다. 감사합니다 8ㅅ8
진짜 대박... 지금 6시간 파이썬 기초 강의 듣는데 이 게임 목표로 꼭 완강할 겁니다 대박...
^^ 꼭 기초 강의 완주하시고 기억이 남아있을때 게임 프로젝트까지 완주 해버리세요 !! 감사합니다.
난 이제다봄
사실 기초편 1시간안봄
그 와중에 나는 저 사람 게임 잘하는거만 보이지..
긴 시간동안 수고 많으셨습니다. 친절한 설명 감사합니다.
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(공쪼개기가 잘안되서 해매고 있는중)
수업 진행하실 때 영상이 길면 집중이 떨어져서 가끔 놓지는 부분 있는데, 일일이 각주 달아주셔서 정말 효율적입니다. 진심으로 감사합니다 ㅜ
배우다 보니까....
컴퓨터 게임들 움직이는거 레알 어떻게 만든거야...
유니티, 또는 다른 프레임 웤을 사용해 더 편리하게 만들죠 퍼이게임으로 만드는 사람은 많이 없는것 같아요 ㅎㅎ
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 ㅋㅋㅋㅋㅋ혼자 쫌 더 공부해 볼께요....
기초 파이썬 끝내고 활용편 넘어왔습니다. ^^ 또 열심히 배워볼게요^^
강의 잘들었습니다. 머릿속에 쏙쏙 들어오네요. 키보드 소리도 듣기 좋네요 사각사각 거리는게 키보드는 어떤 키보드를 쓰시는지 물어봐도 될까요?
어디서 어떻게 몇 년이나 노력하며 배우셨길래
이렇게 설명하며 코딩을 자연스레 하시는 거죠..?
초보자 입장으로 너무 감사하고 신기할 따름이예요
나도코딩처럼 되고 싶습니다!! 하트하트
28:27 책갈피
처음에 pygame 다운로드 할 때
pip install pygame 을 쳐도 다운로드가 되질 않네요...
230102 ~54:42 수강시작
230103 54:42~1:50:42 퀴즈 완료, 프로젝트 이벤트 처리까지 완료(+코드 수정하여 무기 최대 2개 발사 가능하도록 설정)
230104 1:50:42~2:27:38 공 튀기기 및 작은 공으로 쪼개기 구현 완료
230105 2:27:38~ 수강 끝
나코님의 코드를 일부 다르게 작성해서 그런 것인지는 모르겠지만 저는 다른 부분에서 버그가 나오는 것 같네요... 동일한 위치에서 무기 2개를 발사한 경우 무기에 맞지 않은 공이 사라지는 버그가 발견되는 것 같은데 저도 한 번 다시 코드를 검토해야 할 것 같습니다... 역시 코드 작성보다도 코드 리뷰, 에러 체크가 어렵게 느껴지네요.
저렇게 라이브러리 활용하는 부분도 프레임으로 만들어서 재사용 하면 완전 편리하고 좋겠네요 1:07:05 퀴즈가 하필 똥피하기 ㅋㅋㅋ 무료 퀄리티를 초월하는 수준 높은 강의 잘 들었습니다 오늘은 요기까지
완전 온라인(?) 학원에 다니는것 같음 ㅎㅎㅎ
2:20:02...
싫어요 한 사람들은 딱봐도 프로그래밍 강의하면서 돈 버는 사람들인데 무료로 이런거 유튜브로 올리니 배알이 꼴리나 보네
감사합니다... 제 기준 코딩 유투버 중 최고 잘 가르치십니다
나도코딩님 안녕하세요 강의 정말 잘 보고있습니다.
한 가지 질문이 있는데요. 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 여기서 배경 적용했는데 왜 화면이 잠깐 뜨다가 다시 들어갈까요...?(스크린이 정의 되지 못했다는데요..)
저도 여기서 헤맸는데
이분 강의목록에 '소스코드 비교방법' 영상보시면 해결방법 나옵니다!
54:58 텍스트 할 차례입니다~~
1:07:43 까지 봤다
책갈피
40:00
잘 보고 갑니다~~ 나중에 또 올게요!!
파이썬 game강의도 잘 보았습니다. 알림 설정하고 다른 동영상도 쭉 가겠습니다.
“음..이렇게 하면 될려나..?”
가능합니다 파이썬이거든요
26:10
프로그램 하지마라 선배로써 피흘리며 충고한다 조선에서는 하지마라
처음으로 프로젝트 하나 끝내봅니다.
좋은 강의 해주셔서 감사합니다.
열심히 배우겠습니다.
궁금한것이 있습니다! 퀴즈에서 똥 피하기에서 여러개의 똥을 내리게 할려고 만들기 위해 enemy_list = [] 이렇게 만들어
for i in range(0,max_level):
enemy = pygame.image.load("C:\PythonWorkspace\enemy.png")
enemy_width = character_size[0] # 가로의 크기
enemy_height = character_size[1] # 세로의 크기
enemy_x_pos = screen_width / 2 - randrange(100,300) # 화면 가로의 절반 크기에 해당하는곳에 위치
enemy_y_pos = (screen_height / 2) - (character_height / 2) #화면 세로 크기 가장 아래 해당하는곳 위치
enemy_list.append(enemy)
이런식으로 만들었습니다 그런데 그리는곳에 리스트 안에 있는 enemy 을 빼내서 쓸려고 하는데
for i in range(0,2):
enemy=enemy_list[i]
screen.blit(enemy,(enemy_x_pos,enemy_y_pos))
마지막에 저장 했던 list 만 꺼내와지네요 왜이런지 모르겠습니다.
안녕하세요?
올려주신 강의 너무나도 유익하게 보면서 배우고 있습니다.
다름이 아니오라,
제가 강의를 따라서 타이핑하다 보니, 에러가 나는 부분이 있어서요.
어디냐면
영상 15:46 부분의 "screen.blit" 부분에서 오류가 생깁니다.
오류 메시지는 "NameError : name 'screen' is not defined" 입니다.
그런데 아무리 살펴도 선생님의 코드와 제 코드에는 아무 차이(오타나 띄어쓰기, tab 등등)가 없더라구요...
왜 이런 일이 생기는 걸까요?
이것때문에 따라해보질 못하고 그냥 강의만 보고 있습니다...
귀찮으시더라도 답변 달아주시면 영광이겠습니다.
너무나도 감사드립니다!!!
안녕하세요
이웃합니다
좋은 강의 영상 감사합니다
선생님 팁하나 알려드릴까요??
같은단어 여러개를 한번에 봐꾸실 때 단축키
Ctrl + Shift + L
를 사용하시면 편리합니다.
활용편이 어렵네요ㅡㅡ 좋은 강의 감사합니다 여러번 돌려 보고 공부중입니다
나코 형 체고..! 책갈피 : 1:58:38
정말 재미있게 잘보고 만들어봤습니다!
게임엔진을 먼저 접하다 보니 이런 기본적인 부분들이 어떻게 작동하는지 무지상태였는데
그렇다고 C++강의를 들으니 비우는 양이 너무 방대하고 기초로 배울게 너무 ㅁ낳더라구요.....
이렇게 파이썬으로라도 만들어보니 당연하게 생각한 부분들이 당연하지 않고 어떻게 만들어졌을지, 내가 구현한다면 어떻게 해야할 지 힌트를 얻을 수 있는 시간이었던 것 같습니다.
어느정도 개념파악이 되었으니 활용편들도 실습해보고 C++까지 배울 수 있는 사람이 되었으면 좋겠습니다 감사합니다!
삼종 세트 하고 갑니다
좋은 영상 대박 나세요🦊🦊🦊🐶🐶🐶
저는 지금 막 코딩을 시작하려는 사람인데요 파이썬 기본편을 본 뒤에 이것을 해보려 하는데
해보니까 쉬워서 파이썬을 계속 할거입니다! 다음에도 더 재미있는 코딩영상 많이 올려주세요!!!!!!
나도코딩 최고에요. 감사합니다!!
완강했어요. 진짜 재밌는 강의였습니다 ~~
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
이런식으로 처리하는게 캐릭터 움직임이 더 부드러웠어요
저는 영상을 보면서 무엇을 할 것이다~ 를 말해주시면 파이썬으로 구현을 해보고 어떻게 하셨는지 참고를 했습니다... 시간은 영상의 두 배 이상 걸리지만 확실히 배울 수가 있었네요~
기본편 공부 끝내고 활용편 시작합니다. 강의가 너무 좋습니다. 활용편 기대됩니다.
절말 감사합니다~~
삶의 활력이 되네요^^
와 몇일에 걸쳐 퀴즈 전반부 후반부 영상 안보고 클리어 한다고 시간이 꽤 걸렸습니다만 영상 놓치지 않고 다 봤습니다~ 감사합니다.
정말 이해가 잘 되도록 쉽게 알려주시네요 ㅎ 감사합니다.
그런데 개발자에게 윈도우 '프로'를 설치하면 더 좋은 점이 있나요?
강의 너무 잘 듣고 완성했습니다! 정말 도움되고 흥미로운 강의였어요. 친절하게 잘 알려주시고 단계별로 나눠서 진행해 복잡하지 않게 하나하나 이해할 수 있었습니다. 감사합니다!
줄 신경써서 써야겠네요 ㅋㅋ ㅠㅠ 이번 수업도 즐겁게 잘 들었습니다! 파이썬의 고수가 되기 위해 아직 갈길은 멀지만..언젠간..^^
이런 강의를 볼수있어서 영광입니다
정말 댓글을 안달수 없게 만드시네요^^ 정말 유익한 강의 너무 좋습니다. 항상 감사합니다