60,500원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결따라하며 배우는 웹 게임
문제점 2가지
이동하는 부분에서 주사율이 높으면 펭귄이 천천히갑니다.올려진 소스에서는 두번째 로그인 할 경우 기존에 있는 펭귄은 만들어지지가 않습니다.
- 미해결따라하며 배우는 웹 게임
이 소스코드를 다운받고 브라우저 여러개로 테스트해보면
두번째로 접속한 유저는 첫번째로 접속한 유저를 볼수가없던데 무슨이유일까요?
- 미해결따라하며 배우는 웹 게임
도표자료에서 5번째 문서가 주소가 4번째 문서랑 같은거 같아요 수정 부탁드리겠습니다
도표자료에서 5번째 문서가 주소가 4번째 문서랑 같은거 같아요 수정 부탁드리겠습니다
- 미해결따라하며 배우는 웹 게임
this.app.fire 시 문제 해결
this.app.fire로 접근시 app을 찾을 수 없어서 찾아보았는데pc.app.fire로 접근하면 되는거 같아 말씀드려봅니다참고하시면 좋을거 같아요
- 미해결따라하며 배우는 웹 게임
Ref를 만드신 이유에 대해서 질문드립니다.
Ref를 만들어준 이유가 단지 clearTimeout을 실행하기 위해서 만든 setTimeout 바구니(?) 인가요~? 만약 그렇다면 Ref말고 다른 방식으로 clearTimeout을 실행시켜도 되는 거죠?
- 미해결따라하며 배우는 웹 게임
2번째 로그인 시 원래 있던 캐릭터가 생성되지 않습니다.
M.match_join이 호출되긴 하는데 PlayerView.js에서 op_code 값이 2가 나오는지 찍어봐도 찍히지 않고 호출되지 않는 거 같습니다. import React, { useEffect, useState, useRef } from 'react' import '../App.css'; const PlayView = () => { const [isHit, setIsHit] = useState(false) const setTimeOutRef = useRef(null); useEffect(() => { if(!window.pc.app.gameApp) return; window.pc.app.gameApp.socket.onmatchdata = (matchState) => { let jsonResult = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(matchState.data))) switch (matchState.op_code) { case 1: onPlayerMove(jsonResult) break; case 2: onHandleInitialData(jsonResult) break; case 3: onPlayerSpawn(jsonResult) break; default: break; } } }, []) const onPlayerMove = () => { } const onHandleInitialData = (data) => { const myAccountId = window.pc.app.gameApp.user.user_id; console.log('onHandleInitialData', data); for (const player of data.players) { if(myAccountId === player.user_id) { continue; } console.log(player); setTimeout(() => { onPlayerSpawn(player); }, 1000); } } const onPlayerSpawn = (data) => { // Create a new player entity. let playerEntity = window.pc.app.root.findByName("Player"); let newPlayerEntity = playerEntity.clone(); // Put Location into new player entity. if(data.position) { let position = data.position; newPlayerEntity.rigidbody.teleport(position[0], position[1], position[2]); } else { newPlayerEntity.rigidbody.teleport(0, 3, 0); } // addChild into Root newPlayerEntity.enabled = true; let sceneRoot = window.pc.app.root.findByName("Root"); sceneRoot.addChild(newPlayerEntity); } useEffect(() => { window.pc.app.on("boxHit", listener); return () => { window.pc.app.off("boxHit", listener) } // window.addEventListener("message", listener) // return () => { // window.removeEventListener("message", listener); // } }, []) const listener = (event) => { // if(event.origin !== "http://localhost:3000") // return; clearTimeout(setTimeOutRef.current); setIsHit(true); setTimeOutRef.current = setTimeout(() => { setIsHit(false); }, 1000); } return ( <div> {isHit && <div className='Popup'>Box is hit</div> } </div> ) } export default PlayView local nk = require("nakama"); local M = {} local function on_player_move(context, dispatcher, tick, state, message) local player = state.presences[message.sender.session_id] if player == nil then return end local ok, decode_data = pcall(nk.json_decode, message.data) if not ok then nk.session_disconnect(message.sender.session_id) return end player.info["position"] = decode_data.position; dispatcher.broadcast_message(1, message.data) end local function on_player_spawn(context, dispatcher, tick, state, message) -- 실제로 매치에 있는 사람이 보낸 것인지 확인. 아니면 return local player = state.presences[message.sender.session_id] if player == nil then return end dispatcher.broadcast_message(3, message.data) end function M.match_init(context, initial_state) local state = { presences = {}, empty_ticks = 0 } local tick_rate = 30 -- 1 tick per second = 1 MatchLoop func invocations per second local label = "" return state, tick_rate, label end function M.match_join_attempt(context, dispatcher, tick, state, presence, metadata) local acceptuser = true return state, acceptuser end function M.match_join(context, dispatcher, tick, state, presences) for _, presence in ipairs(presences) do state.presences[presence.session_id] = presence state.presences[presence.session_id].info = { user_id = presence.user_id, position = {0, 3, 0} } end local player_infos = {} for _, p in pairs(state.presences) do table.insert(player_infos, p.info) end local player_init_data = { players = player_infos, tick = tick } dispatcher.broadcast_message(2, nk.json_encode(player_init_data), presences) return state end function M.match_leave(context, dispatcher, tick, state, presences) for _, presence in ipairs(presences) do state.presences[presence.session_id] = nil end return state end function M.match_loop(context, dispatcher, tick, state, messages) print("messages: ", nk.json_encode(messages)) for _, message in ipairs(messages) do if (message.op_code == 1) then local ok = pcall(on_player_move, context, dispatcher, tick, state, message) if not ok then nk.session_disconnect(message.sender.session_id) end end if (message.op_code == 3) then local ok = pcall(on_player_spawn, context, dispatcher, tick, state, message) if not ok then nk.session_disconnect(message.sender.session_id) end end end return state end function M.match_terminate(context, dispatcher, tick, state, grace_seconds) return state end function M.match_signal(context, dispatcher, tick, state, data) return state, data end return M
- 미해결따라하며 배우는 웹 게임
docker-compose up --build 시 에러
docker-compose.yml 파일을 수정하고 my-config.yml파일을 생성하여 docker-compose up --build를 입력했는데 다음과 같은 오류가 나타나면서 실행이 되지 않습니다. nakama-server 파일 현황입니다. 저는 modules폴더와 .cookie 파일이 생성되지 않았습니다. 각 파일 수정한 내용입니다. docker-compose.yml my-config.yml
- 미해결따라하며 배우는 웹 게임
js 파일이 생성되지 않습니다.
collider와 trigger js파일이 생서되지 않았는데 무슨 이유일까요?