[D3.js] 키보드 이미지 조정기

in #dclick6 years ago (edited)

[D3.js] 키보드 이미지 조정기



오늘은 어떤 실험을 할까 고민하다가 주제를 결정하지 못했는데 문득 고전 스네이크 게임이 생각나서 한번 캐릭을 조정하는 걸 표현을 해볼까 하는 생각에 정석은 아닌데 생각나는 느낌대로 코딩해서 실험을 해보았네요. 오늘 실험 내용은 Circle(원)을 스네이크라고 생각하고 켄버스 영역 내에서 키보드로 조정해보는 실험입니다.

1. 게임 배경 환경 설정


    //배경
    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");

캔버스 영역을 500x500으로 잡았고 배경색은 Yellow Color로 지정했습니다. 계속 캔버스 영역에 대해 다루었기 때문에 이제 이 표현은 자연스럽게 다가 올꺼에요. 이 영역이 게임 배경이 됩니다.

2. 게임 스네이크 캐릭(circle) 만들기


 var circle = svg.append("circle")
    .attr("cx",circle_cx)
    .attr("cy",circle_cy)
    .attr("r",20)
    .attr("fill","red")

이 부분은 Circl(원)을 지겹게 사용한 거라 circle_cx, circle,cy 좌표에 반지름 20인 Red 원을 그리는 코딩입니다.

3. 게임 스네이크 캐릭(circle) 이동


이 부분이 실제 실험을 할 내용입니다. 어떻게 이동을 시켜야 circle(원)이 움직일까요.
이전에 배운 내용 중에 on() 이벤트 함수가 있습니다. 키보드나 마우스의 이벤트 함수로 키보드나 마우스의 어떤 동작이 발생하면 이벤트를 발생시킬 수 있는데 실험은 키보드 이벤트를 통해 circle(원)을 움직이게 하겠습니다.


  • 키눌림 : .on("keydown", function() {이벤트 동작 })
  • 키값 : d3.event.keyCode
  • 갱신 : setInterval(호출함수, 호출시간간격);

위 키눌림과 키값을 통해서 circle을 움직이는 방향과 거리를 계산하고 setInterval()함수로 일정시간간격으로 rendering 을 하도록 하여 circle이 움직이게 만들도록 구상해 보았습니다.

1) 키 방향과 거리 계산


순간 떠오로는 느낌이라 맘에 드는 코딩은 아닙니다. 그냥 느낌만 전달한 코딩으로 대충 아래와 같이 코딩했네요.

[조건]

  • d3.event.keyCode : 왼쪽(37), 오른쪽(39), 위쪽(38), 아래쪽(40)

[구상]


if(왼쪽키면) x은 -5만큼(y=0)
else if(오른쪽키면) x은 +5만큼(y=0)

if(위쪽키면) y은 -5만큼(x=0)
else if(아래쪽키면) y은 5만큼(x=0)


방향을 if문으로 이렇게 구상하고 x,y의 이동 거리는 5만큼 잡았습니다. x,y은 move_cx, move_cy로 변수로 별도 지정하여 최종 circle(원) 좌표에 더하는 식으로 만들 예정입니다.

 d3.select("body")
       .on("keydown", function() {
        if(d3.event.keyCode==37){
           move_cx=-5;
           move_cy=0;
        }
        else if(d3.event.keyCode==39){
           move_cx=5;
           move_cy=0;
        }
        if(d3.event.keyCode==38){
           move_cx=0;
           move_cy=-5;
        }
        else if(d3.event.keyCode==40){
           move_cx=0;
           move_cy=5;
        }
    });

위 코딩을 보면 body 태그안에서 on() 함수가 실행 됩니다. 이렇게 하면 웹페이지 body 영역에서 키보드를 누르면 이벤트가 발생하는데 이때 누른 d3.event.keyCode 값에 따라 move_cx, move_cy 값이 결정됩니다.

2) circle(원) 랜더링


이제 방향과 거리를 구했으니깐 circle(원)을 그려서 움직임을 만들어 봅시다.

  • setInterval(호출함수, 호출시간간격);

[구상]


최종 원의 x좌표 : circle_cx = circle_cx+move_cx;
최종 원의 y좌표 : circle_cy = circle_cy+move_cy;

function render(){
    svg.select("circle").remove(); //이전원 제거;

    svg.append("circle") //원 그리기
            .attr("cx",circle_cx)
            .attr("cy",circle_cy)            
            .attr("r",20)
            .attr("fill","red")
}

setInterval(render, 50);

원을 그릴 때 이전 원은 제거해야 하고 키로 눌렀을 때 move_cx, move_cy 방향과 거리 값을 원을 그리는 좌표 circle_cx, circle_cy 변수에 더해줌으로써 키가 누르는 방향과 거리로 circle(원) 그려집니다. 그리고 랜더링 시간은 0.05초로 빠르게 움직이게 했습니다. 시간값은 컴사양에 따라서 조정하시면 됩니다. 제 노트북은 똥컴이라서 0.05초도 느리게 움직이네요.

좀 다듬어서 코딩을 하면,

function render(){
    svg.select("circle").remove(); //이전값 제거;
        
        //최종 그려 질 원의 x,y좌표
    circle_cx+=move_cx;
    circle_cy+=move_cy;
    
        // 캔버스 영역을 벗어나지 못하게 락을 검
    if(circle_cx>=480) circle_cx=480;
    else if(circle_cx<=20) circle_cx=20;
    if(circle_cy>=480) circle_cy=480;
    else if(circle_cy<=20) circle_cy=20;    
    
    svg.append("circle") //키값 출력
            .attr("cx",circle_cx)
            .attr("cy",circle_cy)            
            .attr("r",20)
            .attr("fill","red")
}

setInterval(render, 50);

4. 종합 코딩


<body>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
     var circle_cx=250;
     var circle_cy=250
     var move_cx=0;
     var move_cy=0;

    //배경
    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");
 var circle = svg.append("circle")
    .attr("cx",circle_cx)
    .attr("cy",circle_cy)
    .attr("r",20)
    .attr("fill","red")

 d3.select("body")
       .on("keydown", function() {
        if(d3.event.keyCode==37){
           move_cx=-5;
           move_cy=0;
        }
        else if(d3.event.keyCode==39){
           move_cx=5;
           move_cy=0;
        }
        if(d3.event.keyCode==38){
           move_cx=0;
           move_cy=-5;
        }
        else if(d3.event.keyCode==40){
           move_cx=0;
           move_cy=5;
        }
    });
function render(){
    svg.select("circle").remove(); //이전값 제거;
    circle_cx+=move_cx;
    circle_cy+=move_cy;
    
    if(circle_cx>=480) circle_cx=480;
    else if(circle_cx<=20) circle_cx=20;
    if(circle_cy>=480) circle_cy=480;
    else if(circle_cy<=20) circle_cy=20;    
    
    svg.append("circle") //키값 출력
            .attr("cx",circle_cx)
            .attr("cy",circle_cy)            
            .attr("r",20)
            .attr("fill","red")
}

setInterval(render, 50);
</script>
</body>

5. 결과


키보드를 눌렀을 때 움직임만 실험한거라 게임오버 상태는 없네요.

마무리


오늘은 circle(원)을 스네이크 캐릭이라고 가정하고 조정을 해보았습니다. 조정 코딩이 깔끔하지 않고 부족한 부분이 많네요. 사실 잠결에 post 주제를 결정 못해서 생각나는데로 뭘 했는지 기억이 잘 안나네요. (^^)

완성하고 나니 게임을 만들고 싶긴 하는데 어떻게 할지 결정을 못했네요.



Sponsored ( Powered by dclick )
[도서관장이책추천해드립니다] 18탄 "심플한 정리법"

물건. 일본발 미니멀리즘이 살짝 유행이 지나는가 싶더니 소수를 중심으로 다시 조금씩 유행하고 ...

logo

이 글은 스팀 기반 광고 플랫폼
dclick 에 의해 작성 되었습니다.

Sort:  

디클릭은 사랑입니다. 후원차 왔어요.

감사합니다.

스네이크 게임 재미있겠어요 ㅋ

아쉽지만 스네이크 circle(원)이 아이템을 랜덤으로 생성하고 꼬리를 길게 늘어나게 하면 완성 될텐데 너무 삼천포주제가 빠질 것 같아서 여기까지만 하려고요.
콘솔게임으로 예전 c언어로 만들어 봤는데 이제 기억도 안나네요.

꾸준하면서 좋은 코딩 교육 자료 매일 잘 보고 있습니다.

^^ 보클하고 갑니다~

감사합니다. 디클릭은 사랑입니다.

화면의 대상을 움직이게 하는것 만으로 제 관점에선 대단하세요!
비온다니 차분한 금요일 보내세요.

댓글 디클릭.jpg

오늘 비가 참 ~!
기분이 우중충합니다.

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 62978.31
ETH 2546.24
USDT 1.00
SBD 2.76