<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jh9569_park.log</title>
        <link>https://velog.io/</link>
        <description>너구리개구리다</description>
        <lastBuildDate>Sat, 12 Feb 2022 11:47:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jh9569_park.log</title>
            <url>https://images.velog.io/images/jh9569_park/profile/7a1ce619-ab4b-4e14-89f3-344207e2eab5/raccoon-193647.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jh9569_park.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jh9569_park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Numble 챌린지 다른색깔 찾기 게임]]></title>
            <link>https://velog.io/@jh9569_park/Numble-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%8B%A4%EB%A5%B8%EC%83%89%EA%B9%94-%EC%B0%BE%EA%B8%B0-%EA%B2%8C%EC%9E%84</link>
            <guid>https://velog.io/@jh9569_park/Numble-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EB%8B%A4%EB%A5%B8%EC%83%89%EA%B9%94-%EC%B0%BE%EA%B8%B0-%EA%B2%8C%EC%9E%84</guid>
            <pubDate>Sat, 12 Feb 2022 11:47:39 GMT</pubDate>
            <description><![CDATA[<h2 id="주요-로직">주요 로직</h2>
<p>코드가 길어보이지만 interval timer를 생성하는 부분으로 
status state의 time 값을 하나씩 빼주며 로직의 흐름이 시작됩니다</p>
<pre><code>  const [ status, setStatus ] = useState&lt;StatusType&gt;({ stage: 1, grade: 0, time: 15 });
  const interval = useRef&lt;ReturnType&lt;typeof setInterval&gt;&gt;();
  useEffect(() =&gt; {
    interval.current = setInterval(() =&gt; {
      setStatus((status) =&gt; ({ ...status, time : status.time - 1}));
    }, 1000);
    return () =&gt; {
      if(interval.current) clearInterval(interval.current);
    };
  }, []);
</code></pre><p>각 박스마다 아래와 같은 type들을 props로 받게 되며 color 값으로 색상을 표시하고 
클릭시 container에서 받은 함수를 실행시키며 자신의 index와 targetIndex를 보내 확인합니다.</p>
<pre><code>interface BoxType {
  targetIndex: Number
  baseColor: String,
  pointColor: String,
}</code></pre><p><strong>정답일 경우</strong> :  next stage, 점수 반영, timer 초기화
<strong>오답일 경우</strong> : 현재 남은 time - 3</p>
<p>정답을 맞춰 점수가 바뀔때마다 색상과 target을 랜덤으로 추출하여 box array값을 갱신합니다.</p>
<pre><code>  useEffect(() =&gt; {
    const newBoxes:BoxesType = [];
    const total = Math.pow(Math.round((status.stage + 0.5) / 2) + 1, 2); //박스 개수
    const targetIndex = Math.floor(Math.random() * total); //정답일 index
    const { baseColor, pointColor } = getColorData(status.stage); //랜덤 색상
    for(let i = 0; i &lt; total; i++){
      newBoxes.push({
        targetIndex,
        baseColor,
        pointColor,
      });
    }
    setBoxes(newBoxes);
  }, [status.stage]);</code></pre><p>게임의 끝은 state의 time값을 감시하며 값을 비교해 게임 End를 체크합니다.</p>
<pre><code>  useEffect(() =&gt; {
    if(status.time &lt;= 0) {
      setStatus({
        stage: 1,
        grade: 0,
        time: 15,
      });
      window.alert(`Game Over! \nGrade : ${status.grade}`);
    }    
  }, [status.time, status.grade]);</code></pre><h2 id="고민됬던점">고민됬던점</h2>
<blockquote>
<p><strong>1. 화면에 보이는 박스 배치를 어떤식으로 해야할까</strong></p>
</blockquote>
<p>처음 봤을땐 2차원 배열을 만들어 화면에 표시 할까 생각해보았지만 
배열 핸들링이 까다로워지고 배열을 만들기위한 2중 for문이 마음에 들지 않았습니다.</p>
<p><strong>결론은 : css display:grid 처리</strong>
box를 감싸는 태그를 css display:grid로 감싸고 gridTemplateColumns의 값을 넣어 처리하였습니다.</p>
<blockquote>
<h4 id="2-단계별로-정답과-오답의-차이를-줄여-난이도-올리기">2. 단계별로 정답과 오답의 차이를 줄여 난이도 올리기</h4>
</blockquote>
<p>결국 stage가 높아질수록 정답과 오답의 색상 코드 값을 비슷하게 뽑아내는 코드가 필요했습니다
*<em>그래서 생각했던게 1차 RGB 각각의 수치값을 조금씩 변경 해보자
*</em>
색상을 바꿀때 R,G,B중 어느색을 바꿔야 되는지 정확히 몰랐고 랜덤으로 추출된 색에 따라 너무 티나거나 거의 차이없거나, 왔다갔다 하길래 오히려 이전 단계가 더 쉬운 케이스도 나왔습니다.</p>
<p><strong>결론은 : RGBA로 alpha값을 조정하자</strong>
단계가 올라갈수록 1(max:1)에 가까워지는 alpha값을 구하여 적용하였더니 비슷한 색이면서 적당히 어려워지는 결과를보았습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Typescript 길이제한 ]]></title>
            <link>https://velog.io/@jh9569_park/Typescript-%EA%B8%B8%EC%9D%B4%EC%A0%9C%ED%95%9C</link>
            <guid>https://velog.io/@jh9569_park/Typescript-%EA%B8%B8%EC%9D%B4%EC%A0%9C%ED%95%9C</guid>
            <pubDate>Thu, 13 May 2021 02:12:42 GMT</pubDate>
            <description><![CDATA[<p>이전 Typescript 공부중 array length를 제한 하는대 막혔던 적이 있어 찾아보다 
포럼에 질문 해본적이 있는대
<a href="https://jsdev.kr/t/typescript-array/5949">https://jsdev.kr/t/typescript-array/5949</a></p>
<pre><code>    type User = { 

      id:number,

      name:string

    }

    type UserList&lt;T,N extends number&gt; = _UserList&lt;T, N , []&gt;;

    type _UserList&lt;T, N extends number, R extends unknown[]&gt; = R[&#39;length&#39;] extends N ? R : _UserList&lt;T, N, [T, ...R]&gt;;

    const user:User = {

      id:123,

      name:&#39;asd&#39;

    }

    const userList:UserList&lt;User, 3&gt; = [user,user,user];
</code></pre><p>이렇게 처리 했습니다. 굿</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[이벤트 루프와 매크로]]></title>
            <link>https://velog.io/@jh9569_park/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84%EC%99%80-%EB%A7%A4%ED%81%AC%EB%A1%9C</link>
            <guid>https://velog.io/@jh9569_park/%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84%EC%99%80-%EB%A7%A4%ED%81%AC%EB%A1%9C</guid>
            <pubDate>Sun, 27 Dec 2020 14:54:08 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트의 흐름은 nodejs 와 마찬가지로 이벤트 루프에 기반하여 실행됩니다.</p>
<h3 id="이벤트-루프">이벤트 루프</h3>
<p>태스크를 바라보고 태스크에 작업할 내용이 있으면 처리하고 없다면 대기 하는 
자바스크립트 내에서 끊임 없이 돌아가는 loop 입니다.</p>
<p>여기서 이벤트 루프를 돌아가게 하는 태스크 종류에는</p>
<ol>
<li>외부 스크립트 <script src=""> 가 로드되고, 이 스크립트를 실행할때</li>
<li>사용자가 마우스를 움직여 mousemove 이벤트와 이벤트 핸들러를 실핼할때</li>
<li>settimeout 에서 설정한 시간이 다될때, callback을 실행할때
... 등등등</li>
</ol>
<p>태스크의 특징이 있는대</p>
<ol>
<li>엔진이 특정 태스크를 처리하는 동안엔 렌더링이 절대 일어나지 않습니다.</li>
<li>태스크 처리에 시간이 오래 걸리면 브라우저는 태스크를 처리하는 동안에 발생한 사용자 이벤트 등의 새로운 태스크들을 처리하지 못합니다.</li>
</ol>
<p>아래와 같이 태스크를 처리하는동안 브라우저는 아무런 작업을 하지 못하지만  </p>
<pre><code>let i = 0;
let start = Date.now();

function count() {
  for (let j = 0; j &lt; 1e9; j++) {
    i++;
  }
}


count();</code></pre><p>아래와 같이 태스크를 쪼개면 브라우저 동작이 가능합니다. </p>
<pre><code>let i = 0;

let start = Date.now();

function count() {

  do{
      i++;
  }while(i % 1e6 != 0);

  console.log(i);
  if(i == 1e9) { 
     alert(&quot;처리에 걸린 시간: &quot; + (Date.now() - start) + &quot;ms&quot;);
  } else {
    setTimeout(count);

  }
}

count();</code></pre>]]></description>
        </item>
    </channel>
</rss>