티스토리 뷰
[조건]
1. 화면 상에 100*100 박스 출력
2. 박스안에 특정 도형을 출력 - 도형 종류 무관 - 예) 네모, 세모, 원, 보노보노 등
3. 화살표로 특정 도형 이동 구현
<div class="ctn" onload="loaded()" onkeydown="keydown()" onkeyup="keyup()">
<h2> Javascript Drawing </h2>
<p> 박스 안에 도형 출력-> 화살표로 이동 구현하기</p>
<p> 키보드로 원을 움직여보세요 💛</p>
<canvas id="canvas" width="500" height="500" > </canvas>
</div>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var x = canvas.width/2;
var y = canvas.height/2;
//x와 y의 변수를 이용해서 캔버스 중앙에서 그려지도록 하겠습니다.
var ballRadius = 10;
// 충돌을 감지하기 위해서는 공이 벽에 닿았는지를 확인하고
//그에 따라 움직이는 방향을 수정해야 합니다.
//의 변수에 원의 반지름 값을 대입하여 계산하는데 사용합니다
//상하좌우 컨트롤 버튼이 눌렸는 지 확인하는 4개의 변수,
// 버튼을 누르는 것은 boolean 변수로 정의하고 초기화 합니다,
// 컨트롤 버튼이 눌려지지 않은 상태이므로 기본값은 false
var rightPressed = false;
var leftPressed = false;
var topPressed = false;
var bottomPressed = false;
function drawBall() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI*2, false);
ctx.fillStyle = "green";
ctx.fill();
ctx.closePath();
//{ ctx.arc(x, y, ballRadius, 0, Math.PI*2, false);
//원의 중심을 가리키는 x와 y좌표
//원의 반지름
//시작 각도와 끝 각도(원을 그릴 때 시작과 끝이되는 각도이며, 라디안 값입니다.)
//그리는 방향(false를 넣으면 시계방향으로 그려집니다.
//기본 값이나 true를 넣으면 반 시계방향으로 그려집니다.)
//이 파라미터는 옵션입니다.}
}
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
//캔버스의 내용들을 지워주기 위한 메소드인 clearRect() (en-US)
drawBall();
//매 10밀리초마다 캔버스는 지워지고,
//새로운 x와 y값의 좌표를 가지는 공이 다음 프레임에 그려지게 됩니다.
if(rightPressed && x < canvas.width-10 ) {
x+=2;
}else if(leftPressed && x > 10) {
x-= 2;
}else if(bottomPressed && y < canvas.height-10){
y+= 2;
}else if(topPressed && y> 10){
y-= 2;
}
}
// 버튼이 눌렸을 때 원의 움직임을 조종할 수 있는 코드가 실행되어야 합니다.
//키가 눌렸음을 인식하기 위해, 이벤트 리스너를 설정합니다.
document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
// 키보드 중 어떤 키 하나가 눌려서 keydown 이벤트가 발생하면,
//keyDownHandler() 함수가 실행됩니다.
.
function keyDownHandler(e) {
if(e.keyCode == 39) {
rightPressed = true;
}
//왼쪽 방향키를 누르면, leftPressed 변수가 true 로 설정되고,
//왼쪽 방향키에서 손을 때면 leftPressed 변수가 false로 설정됩니다
else if(e.keyCode == 37) {
leftPressed = true;
}
else if(e.keyCode == 38 ) {
topPressed = true;
}
else if(e.keyCode == 40 ) {
bottomPressed = true;
}
}
// 두번째 리스너에도 같은 패턴이 적용됩니다: 키에서 손을 때면
// keyup 이벤트가 keyUpHandler() 함수를 실행합니다 .
function keyUpHandler(e) {
if(e.keyCode == 39) {
rightPressed = false;
}
else if(e.keyCode == 37) {
leftPressed = false;
}else if(e.keyCode == 38 ) {
topPressed = false;
}else if(e.keyCode == 40 ) {
bottomPressed = false;
}
}
//draw()함수는 setInterval를 통해서 10밀리초마다 실행됩니다.
setInterval(draw, 10);
<참고>
https://developer.mozilla.org/ko/docs/Games/Tutorials/2D_Breakout_game_pure_JavaScript
[결과화면]
See the Pen by 현정 (@Celine__509) on CodePen.
'프론트엔드 > javaScript, jQuery' 카테고리의 다른 글
| [jQuery]버튼 클릭 후 url 복사 / toastPopup (1) | 2021.08.24 |
|---|---|
| [jQuery] 높이에 따른 더보기 버튼 유무 (2) | 2021.08.17 |
| [javaScript] function의 파라미터 사용하여 button기능 개발 (0) | 2021.08.17 |
| [javaScript] function을 활용하여 button기능 개발 (0) | 2021.08.16 |
| [javaScript] onclick 속성으로 button 기능 개발 (0) | 2021.08.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프론트엔드
- node.js
- react portal
- 디자인시스템만들기
- React.js
- Portal
- npm
- 탭메뉴
- javascript
- file-saver
- 퍼블리셔
- 제이쿼리
- 프론트엔드개발
- react excel 다운
- paging-custom
- excel down
- 페이징 커스텀
- react
- jQuery
- 개발
- 로그인폼
- 리액트 포탈
- css3
- 퍼블리싱
- CSS
- slick-slide
- 슬릭 슬라이드
- HTML
- excel custom
- frontend
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
글 보관함