묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
프로필 페이지에서 401 에러가납니다 ㅜㅜ
로그인 후 프로필 페이지로 가면 401 에러가 납니다. 배포후에만 발생하는 문제이며 로컬에서는 잘 작동합니다. back서버에서 /user/followers 라우터에서 isLoggedIn 을 체크하는데 여기서 req.isAuthenticated() 가 false 가 되어 로그인이 필요합니다 라는 메세지가 브라우저로 전달됩니다. (Network 탭에 followers 클릭후 Response 택 클릭시 로그인이 필요합니다 라고 표시됩니다) (물론 followings 도 마찬가지입나다) 이때는 로그인이 풀려보이지는 않는데 다시 Home 으로 가보면 로그인이 풀려있습니다. ㅁ followers 혹은 followings 요청 401 에러 귀찮게 안해드리려고 혼자서 어떻게든 해보려 했는데 도저히 어떻게 수정해야 할지도 모르겠네요 ㅜㅜ
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
안녕하세요 권철민 선생님~
(질문은 아니지만.. ) 안녕하세요 권철민 선생님~ 미리보기강의를 듣고 주저 없이 수강신청하게 되었습니다..! 책도 구매하고 열심히 해보려고 합니다..! 비전공자이지만.. 선생님 강의를 들으며 포기하지 않고, 열심히 공부하겠습니다..!! 선생님의 강의는 저에게 포기하지 않으려는 마음을 다시 심어주셨습니다. 진심으로 감사합니다..!!
-
[개정판] 파이썬 머신러닝 완벽 가이드
안녕하세요 권철민선생님
삭제된 글입니다
-
미해결실전 프로젝트로 배우는 타입스크립트
Covid19 project 이 동작 하는중 에러 납니다
안녕하세요 질문이 있습니다. 제가 최종프로젝트-ES6 문법 전까지 따라가면서 소스에 TYPE을 입혔습니다. npm run build 로 문제 없이 tsc가 수행 되고 complile error가 안나 옵니다 근데 index.html 을 open with live server 로 돌리면 아래와 같은 exception 이 나옵니다. 그래서 tsconfig.json의 target을 ES5 에서 ES6 로 바꾸면 위의 에러는 안 납니다 하지만 ES6 로 바꾸면 다른 EXCEPTION 이 납니다. 제가 멀 잘못 따라 했을 까요?? 답변 부탁 드립니다. 감사합니다
-
해결됨실전! 스프링 데이터 JPA
jpa와 mysql을 붙일때요..
강의 항상 잘 듣고 있습니다^^!! 수업과는 조금? 상관이 없는 질문 일수도 있는데요. 개인적으로 복습해보려고 아마존 S2에 Mysql 테이블 생성해서 데이터 넣고 제가 jpa, jpa-data 등 이용해서 자료 한번 조회하는 간단한 프로젝트를 해보고 있습니다. 그런데 ㅠㅠ DB에 데이터는 정상적으로 들어가는데 JPA가 쏘는 쿼리가 영 이상한지 계속 오류가 뜨네요. 무엇이 잘못된 거일까요? 작동시키려는 쿼리? 메소드는 단순합니다. 전체 정보 불러오기 입니다. @GetMapping("/findall") public String findAll() { String result = ""; for (Site site : siteRepository.findAll()) { result += site.toString() + "<br/>"; } return result; } application.yml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://54.xxx1xx.x3/shark1 username: password: jpa: hibernate: ddl-auto: none show-sql: true database: mysql data: jpa: repositories: enabled: true siteRepository.java @Transactional(readOnly = true) public interface SiteRepository extends JpaRepository<Site, Long> { List<Site> findByArea1(String area1); } Site.java @Entity @Getter @Setter @Table(name = "site") public class Site { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long site_id; private String name; private String location; private String area1; private String area2; private String info; } 소스는 이러하구요 쿼리가 나갈때 findall() 호출하면 Hibernate: select site0_.site_id as site_id1_0_, site0_.area1 as area2_0_, site0_.area2 as area3_0_, site0_.info as info4_0_, site0_.location as location5_0_, site0_.name as name6_0_ from site site0_ 이런식으로 나갑니다 ㅠㅠㅠ DB 칼럼도 도메인이랑 모두 맞춰놨는데요 ㅠㅠ 제가 뭔가 JPA에 대해 설정을 잘못한게 있을까요? 도움 꼭 부탁드립니다. ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
Repository 애노테이션에 대해서
안녕하세요 영한센세!! 강의를 듣다가 @Repository 애노테이션에 대해서 궁금한 점이 생겨서 질문을 남깁니다!! "스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다." 제가 이해한 바로는 스프링 데이터 접근 계층 : 코드Level의 예외 데이터 계층의 예외 : DB (SELECT, INSERT, DELETE) Level의 예외 라고 이해했습니다... 그렇다면 만약 DB Level의 예외가 발생하면 코드Level의 예외로 반환해준다. 로 결론이 났는데 이해한 내용이 맞는지 궁금합니다🤔 ps. 간략한 예시가 있을까용🙏🏻?
-
미해결홍정모의 따라하며 배우는 C언어
while(*str)??
void Transpose(char* str) { while (*str) { if (islower(*str)) *str = toupper(*str); else if (isupper(*str)) *str = tolower(str); str++; } 1. 트랜스포즈함수에서 while문 조건식에 (*str)이 의미가 뭘까요?? *str에 값이 있다면 while문으로 들어가서 실행해라는 의미인가요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
log
log는 어떤 목적으로 사용되는 건지 궁금합니다. 그냥 html창에 주석 을 다는 것과 다른 용도가 있는지 구분이 잘 안가용
-
미해결홍정모의 따라하며 배우는 C언어
typedef에서 *하나와 두개의 차이
char(*complicated_function1())[3] { return &char3; // Returns a pointer to char[3] typedef char(*FRPTC3())[3]; typedef char(*(*PTFRPTC3)())[3]; FRPTC3* fptr2 = complicated_function1; PTFRPTC3 fptr3 = complicated_function1; 여기서 FRPTC3의 *하나와 PTFRPTC3의 * 두개의 차이는 뭐죠?? 이중포인터인가요??
-
미해결홍정모의 따라하며 배우는 C++
헤더 파일(1.11강)
open containing folder를 이용하여 myheaders파일을 새로 만들고 add.h파일을 옮기고 난 후 우측 explorer창에서 헤더 파일을 우클릭 하고 open을 눌렀는데 계속 실행이 안 되었습니다. include 하여 빌드는 되긴 하지만 이렇게 실행이 계속 안되는게 보편적인 문제인 건지 아니면 제 컴퓨터에 한해서 실행이 안 되는 건지 궁금하여 질문 남깁니다!!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 궁금한게 있어서 질문 드려봅니다
다름이 아니라영상의 27분 50초 쯤 SendBuffer에 대해서C++일경우에 레퍼런스 카운트를 이용해서 0이라면 풀에 반환한다고 말씀하셨는데요.C#에서도 아래처럼 1) 가능한 부분이 아닌가 싶어서 궁금해서 질문드려봅니다TLS 환경에 일정량의 SendBuffer Pool을 만들어 놓고 TLS환경에는 싱글스레드 처럼 하나의 스레드만 접근이 가능하므로 SendBuffer.Open시에 SendBuffer에 FreeSize가 reserveSize보다 크면 Pool에 반납을 하고 새롭게 미리 할당된 메모리를 가져오고 기존 메모리를 초기화해서 다시 풀에 넣는방식이라면 가능하지 않을까 싶은데 어떻게 생각하시는지 궁금합니다 추가질문 입니다. 2) 아래와 같은 이유로 SendBuffer를 새로 할당한 것인가요?C++의 레퍼런스 카운트를 이야기한 부분이 혹시Send시에 SocketAsyncEventArgs의 BuffList에 ArraySegment값들이 들어가고(원본의 참조형태로 들고 있기 떄문에) 그걸 Socket.SendAsync에서 호출하게 되는데 커널단에서 실제 Send 처리 이후의 메모리의 레퍼런스 카운트 시점을 알아야 정확히 풀로 반환할 수 있기 때문인건가요? 위와 같은 문제라서SendBuffer는 새로 할당하는 방법을 선택하신건지도 궁금합니다 3) C#에선 풀은 세션 별로 버퍼 풀방법 뿐인건가요?결국 레퍼런스 카운트 때문이라도C#에선Pool을 활용하려면 결국 세션 단위로 버퍼풀을 만들어서 사용하는 방법뿐일까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
auth.js 에서 cookies가 undefined로 뜹니다
auth.js 에서 req.cookies를 찍어보면 undefined로 뜹니다. 같은문제로 다른 분들이 질문하신 것들을 참고해서 제 코드를 확인해봤는데 오타문제나 cookieParser를 빠뜨려서 생긴 문제는 아니었고요. 현재 저는 cors를 back에서 직접 해주고 있는데 어떻게 해결해야 하나요? let auth = (req, res, next) => { // 인증처리 하는 곳 // 클라이언트 쿠키에서 토큰을 가져온다 let token = req.cookies.x_auth; console.log('쿠키', req.cookies.x_auth); // 토큰을 복호화 한 후 유저를 찾는다. User.findByToken(token, (err, user)=>{ if(err) throw err; // 유저가 없으면 인증 No if(!user) return res.json({isAuth:false, error: true}); // 유저가 있으면 인증 Okay req.token = token; req.user = user; next(); }) }
-
미해결따라하며 배우는 리액트, 파이어베이스 - 채팅 어플리케이션 만들기[2023.12 리뉴얼]
강사님 안녕하세요 강의 다시 처음부터 복습하려고 보고 있습니다!
그런데 아래와 같이 문구가 뜹니다. useEffect에서 history를 사용했을 때 console창에 아래와 같은 문구가 뜨는데 해결방법이 있을까요?? console.log창에서 아래와같이 문구가뜹니다. Line 26:6: React Hook useEffect has a missing dependency: 'history'. Either include it or remove the dependency array react-hooks/exhaustive-deps useEffect(() => { firebase.auth().onAuthStateChanged(user => { if (user) { history.push("/"); } else { history.push("/login"); } }) }, [])
-
미해결그리드(Grid) 핵심이론 및 실전 활용
에밋 단축키 관련해서 질문 있어요
코드에서 에밋 단축키 설정할 때에 이미 다른 단축키 설정이 되어있다고 하면 못하는건가요? 제가 설치한 vscode에서는 ctrl + d 가 사용중이더라고요. 아직 이게 뭔지 모르겠지만;; ctrl+d로 고치지 않고 초기값 그대로 사용해도 수업에는 지장이 없는지요? 넘넘 기초적인 질문드려서 죄송합니다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
TypeError: postData.split is not a function 에러 질문 있습니다!
안녕하세요! 항상 좋은 강의 잘 듣고 있습니다. 감사합니다. 현재 챕터4 끝까지 수강하고 다시 복습하고 있었는데, 자꾸 위와 같은 에러가 발생합니다. 이미 저랑 같은 질문을 했던 분들이 많이 계셔서 밑에 달린 제로초님 답변 따라 PostCard부터 쭉 확인해봤는데도 어떤 문제인지 찾지 못했습니다.. 리덕스데브툴로 확인해보니,ADD_POST_REQUESTADD_POST_SUCCESSADD_POST_TO_ME 까지 실행됐다가 에러가 발생합니다. // PostCard.js <Card.Meta avatar={<Avatar>{post.User.nickname[0]}</Avatar>} title={post.User.nickname} description={<PostCardContent postData={post.content} />} /> // reducers/post.js const dummyPost = (data) => ({ id: data.id, content: data.content, User: { id: 1, nickname: '제로초', }, Images: [], Comments: [], }); // reducers/user.js case ADD_POST_TO_ME: draft.me.Posts.unshift({ id: action.data }); break; // sagas/post.js function* addPost(action) { try { // const result = yield call(addPostAPI, action.data); yield delay(1000); const id = shortId.generate(); yield put({ type: ADD_POST_SUCCESS, data: { id, content: action.data, }, }); yield put({ type: ADD_POST_TO_ME, data: id, }); const onSubmitForm = useCallback(() => { dispatch({ type: ADD_POST_REQUEST, data: { text, }, }); }, []); PostForm의 data: { text } 부분을 그냥 data: text, 로 입력해봤는데그때부터는 위와 같은 TypeError는 발생하지 않았지만, 글이 빈칸으로 포스팅되고 리덕스로 확인해보니 content 가 빈칸으로만 출력되었습니다..
-
미해결그로스해킹 - 데이터와 실험을 통해 성장하는 서비스를 만드는 방법
교차 세일의 기준이 제 생각엔
안녕하세요 ^^ 저는 서동기입니다. 제가 생각하는 크로스세일은 연관 검색어로 노출된 상품을 고객이 구매할 때를 말하는 것 같습니다. 그래서 아까 강의중 예문에 연관 키워드가 들어간 예문이 크로스세일인것 같습니다. 양승화멘토님의 고견을 듣고 싶습니다.^^
-
해결됨실전 리액트 프로그래밍
로그아웃 기능 관련 문의
안녕하세요. 강의 마지막부분에 설명해주신 로그아웃 기능 관련 문의를 드리려합니다. 우측 상단에 있는 로그아웃 버튼을 클릭하게 되면 클릭하자마자 쿠키에 저장된 User 관련 정보가 사라짐으로써 기본 페이지가 로딩되지 않고 로그인 페이지로 리다이렉션이 되어야 하는 것이 정상 시나리오인것 같은데요. 로그아웃 버튼을 클릭하면 리다이렉션이 이루어지지 않은 채 그대로 멈춰있네요. 그 상태에서 새로고침을 하게 되면 로그인 페이지로 리다이렉션이 되고요. 뭔가 놓친 부분이 있는건가요?? 작성한 소스코드 링크를 올려드릴테니 확인해주시면 감사하겠습니다. https://drive.google.com/file/d/1NofoiWcbaZrAl8DV-ZlZREclhx7qlrrX
-
해결됨모던 자바스크립트(ES6+) 기본
[강의자입니다] 브라우저 디버거 창의 오른쪽에 let, const 변수 표시
강의를 만드는 시점에는 let 변수와 const 변수가 브라우저 디버거 창의 오른쪽에 표시되지 않았으나, 2021.02.13 기준, 질문을 받고 확인해보니 표시됩니다. 변경되었습니다.표시되더라도 변수 앞에서 호이스팅으로 let 변수, const 변수를 사용할 수 없으며 에러가 발생합니다만, 블록에 작성된 변수를 표시하여 사용의 편리를 제공하기 위한 것으로 생각됩니다. 바로 아래 질문에 화면 캡처가 있으니 참조하기 바랍니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
어노테이션 관련 질문드립니다.
7분 즘에 MemberRepository 클래스르 만들고 @PersistenceContext 어노테이션을 private EntityManager em; 에 붙였는데 원래 정석대로라면 팩토리를 만들고 그걸로 엔티티매니저를 반환받는거였는데 이 어노테이션으로 그 과정을 스킵한다고 봐도 되나요? 팩토리 만들 때 마다 비용이 많이 소모된다고 알고있는데 이 어노테이션도 똑같이 팩토리를 한번만 만들고 그 팩토리로 엔티티매니저를 반환하나요? 그렇다면 이 과정을 알고 있다는 전제 하에 그냥 간단하게 @Autowired 같은 거라고 보면 될까요 ㅎㅎ...
-
미해결파이썬 무료 강의 (활용편1) - 추억의 오락실 게임 만들기 (3시간)
공이 안없어집니다..
공(고양이)가 안없어집니다.. 이미지를 바꾸면서 ball을 cat으로, to_remove를 _rm으로 바꾼 것 양해부탁드립니다. # 1. 모든 공을 없애면 게임 종료, 성공 # 2. 강아지가 고양이에 닿으면 게임 종료, 실패 # 3. 시간 제한 99초 초과 시 게임 종료, 실패 import pygame, os pygame.init() # 초기화 필수 # 게임 화면 크기 설정 screen_width = 640 # 가로 크기 screen_height = 480 # 세로 크기 screen = pygame.display.set_mode((screen_width, screen_height)) # 화면 타이틀 설정 pygame.display.set_caption('강아지가 츄르주는 게임') # 게임 이름 # FPS clock = pygame.time.Clock() # 1. 사용자 게임 초기화 # 이미지 불러오기 current_path = os.path.dirname(__file__) # 현재 파일 위치 반환 image_path = os.path.join(current_path, "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, "puppy.png")) # 70*70 캐릭터 불러오기 character_size = character.get_rect().size # 캐릭터 이미지의 가로 세로 크기를 가져옴 character_width = character_size[0] # 캐릭터의 가로 크기 character_height = character_size[1] # 캐릭터의 세로 크기 character_pos_x = (screen_width - character_width) / 2 # x position = 화면 가로의 절반에 위치 하도록 (캐릭터의 x 좌표) character_pos_y = screen_height - stage_height - character_height + 10 # 이동할 좌표 chracter_to_x = 0 # 이동 속도 character_speed = 0.4 # 무기 만들기 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 # target cat_images = [ pygame.image.load(os.path.join(image_path, "cat0.png")), pygame.image.load(os.path.join(image_path, "cat1.png")), pygame.image.load(os.path.join(image_path, "cat2.png")), pygame.image.load(os.path.join(image_path, "cat3.png")) ] # 타겟 크기에 따른 최초 스피드 cat_speed_y = [-18, -15, -12, -9] # index 0 1 2 3 - cat 1 2 3 4 # 타겟들 cats = [] # 최초 발생하는 큰 고양이 추가 cats.append({ "pos_x" : 50, # 고양이의 x 좌표 "pos_y" : 50, # 고양이의 y 좌표 "img_idx" : 0, # 고양이의 이미지 인덱스 "to_x" : 3, # 고양이의 x축 이동 방향, -3이면 왼쪽으로 3이면 오른쪽ㅇfh "to_y" : -6, # y축 이동 방향 "init_spd_y" : cat_speed_y[0] # y축 최초 속도 }) # 사라질 츄르, 고양이 정보 저장 변수 weapon_rm = -1 cat_rm = -1 # 폰트 정의 game_font = pygame.font.Font(None, 40) # 폰트 객체 생성 (폰트, 크기) # 게임 총 시간 total_time= 100 # 시작 시간 계산 start_ticks = pygame.time.get_ticks() # 현재 tick 정보를 받아옴 # Game Over, TIME OVER, Mission Complete game_result = "GAME OVER" # event loop running = True # 게임이 진행 중인가? while running: dt = clock.tick(30) # delta = clock. FPS 설정 for event in pygame.event.get(): # 키보드에 맞는 이벤트 실행되면 if event.type == pygame.QUIT: # 창 끄기 이벤트 발생 시 running = False if event.type == pygame.KEYDOWN: # 키가 눌러졌는데 확인 if event.key == pygame.K_RIGHT: chracter_to_x += character_speed elif event.key == pygame.K_LEFT: chracter_to_x -= character_speed elif event.key == pygame.K_SPACE: # 스페이스바 누르면 무기 발사 weapon_pos_x = character_pos_x + (character_width / 2) - (weapon_width / 2) weapon_pos_y = character_pos_y weapons.append([weapon_pos_x, weapon_pos_y]) elif event.key == pygame.K_UP: pass elif event.key == pygame.K_DOWN: pass if event.type == pygame.KEYUP: # 방향키를 뗐을 때 if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT: chracter_to_x = 0 elif event.key == pygame.K_UP or event.key == pygame.K_DOWN: pass # 캐릭터 움직이기 character_pos_x += chracter_to_x * dt # FPS에 따라 속도가 변하지 않게 delta 값을 곱해주어 고정해줌 # 캐릭터 가로 경계값 처리 if character_pos_x < 0: character_pos_x = 0 elif character_pos_x > screen_width - character_width: character_pos_x = screen_width - character_width # 무기 위치 조정 weapons = [[w[0], w[1] - weapon_speed] for w in weapons] # 무기가 천장에 닿으면 없애기 # weapons = [[w[0], w[1]] for w in wea pons if w[1] > 0] # 타겟 위치 정의 for cat_idx, cat_val in enumerate(cats): cat_pos_x = cat_val["pos_x"] cat_pos_y = cat_val["pos_y"] cat_img_idx = cat_val["img_idx"] cat_size = cat_images[cat_img_idx].get_rect().size cat_width = cat_size[0] cat_height = cat_size[1] # 가로 경계값: 타겟의 경계값 처리 -> 경계값이 닿으면 반대 쪽으로 튕김 if cat_pos_x < 0 or cat_pos_x > (screen_width - cat_width): cat_val["to_x"] *= -1 # 세로 경계값: 스테이지에 튕겨서 올라감 if cat_pos_y >= (screen_height - stage_height - cat_height): cat_val["to_y"] = cat_val["init_spd_y"] else: # 그 외 모든 경우에는 to_y를 증가 cat_val["to_y"] += 0.5 cat_val["pos_x"] += cat_val["to_x"] cat_val["pos_y"] += cat_val["to_y"] # 충돌 처리를 위한 rect 정보 update character_rect = character.get_rect() character_rect.left = character_pos_x character_rect.top = character_pos_y for cat_idx, cat_val in enumerate(cats): cat_pos_x = cat_val["pos_x"] cat_pos_y = cat_val["pos_y"] cat_img_idx = cat_val["img_idx"] # cat rect 정보 업뎃 cat_rect = cat_images[cat_img_idx].get_rect() cat_rect.left = cat_pos_x cat_rect.top = cat_pos_y # cat과 puppy 충돌 처리 if character_rect.colliderect(cat_rect): running = False break # cat과 츄르 충돌 처리 for weapon_idx, weapon_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(cat_rect): weapon_rm = weapon_idx # 해당 츄르 없애기 위한 값 설정 cat_rm = cat_idx # 해당 고양이 없애기 위한 값 설정 if cat_img_idx < 3: # 0 1 2 -> 가장 작은 공이 아니라면 # 현재 고양이 크기 정보 cat_width = cat_rect.size[0] cat_height = cat_rect.size[1] #나눠질 고양이 정보 small_cat_rect = cat_images[cat_img_idx + 1].get_rect() small_cat_width = small_cat_rect.size[0] small_cat_heigth = small_cat_rect.size[1] # 왼쪽으로 튕겨나가는 작은 고양이 cats.append({ "pos_x" : cat_pos_x + (cat_width / 2) - (small_cat_width / 2), "pos_y" : cat_pos_y + (cat_height / 2) - (small_cat_heigth / 2), # 고양이의 y 좌표 "img_idx" : cat_img_idx + 1, "to_x" : -3, # 고양이의 x축 이동 방향, -3이면 왼쪽으로 3이면 오른쪽ㅇfh "to_y" : -6, # y축 이동 방향 "init_spd_y" : cat_speed_y[cat_img_idx + 1] # y축 최초 속도 }) # 오른쪽으로 튕겨나가는 작은 고양이 cats.append({ "pos_x" : cat_pos_x + (cat_width / 2) - (small_cat_width / 2), "pos_y" : cat_pos_y + (cat_height / 2) - (small_cat_heigth / 2), # 고양이의 y 좌표 "img_idx" : cat_img_idx + 1, "to_x" : +3, # 고양이의 x축 이동 방향, -3이면 왼쪽으로 3이면 오른쪽ㅇfh "to_y" : -6, # y축 이동 방향 "init_spd_y" : cat_speed_y[cat_img_idx + 1] # y축 최초 속도 }) break else: continue # 충돌된 cat or 무기 없애기 if cat_rm > -1: del cats[cat_rm] cat_rm = -1 if weapon_rm > -1: del weapons[weapon_rm] weapon_rm = -1 # 모든 cat이 없어졌을 때 if(len(cats)==0): game_result = "MISSION COMPLETE" running = False # screen.fill((r, g, b)) # rgb 값으로 배경색 채울 수도 있음 screen.blit(background, (0, 0)) # 배경 이미지를 어디서부터 나타내줄건지. 0, 0 -> 왼쪽 맨 위부터 for weapon_pos_x, weapon_pos_y in weapons: screen.blit(weapon, (weapon_pos_x, weapon_pos_y)) for idx, val in enumerate(cats): cat_pos_x = val["pos_x"] cat_pos_y = val["pos_y"] cat_img_idx = val["img_idx"] screen.blit(cat_images[cat_img_idx], (cat_pos_x, cat_pos_y)) screen.blit(stage, (0, screen_height - stage_height)) screen.blit(character, (character_pos_x, character_pos_y)) # 캐릭터 그리기 # 타이머, 경과 시간 계산 elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000 # 초단위로 표시 timer = game_font.render("Time: {}".format(int(total_time - elapsed_time)), True, (255, 0, 0)) screen.blit(timer, (10, 10)) # 시간이 0 이하면 game over if(total_time - elapsed_time <= 0): game_result = "TIME OVER" running = False pygame.display.update() # 게임 화면 다시 그리기 # 잠시 대기 pygame.time.delay(1000) # 2초 대기 # 게임 오버 메세지 msg = game_font.render(game_result, True, (255,0,0)) msg_rect = msg.get_rect(center=(int(screen_width / 2), int(screen_height / 2))) screen.blit(msg, msg_rect) pygame.display.update() pygame.time.delay(2000) # pygame 종료 pygame.quit()