목록분류 전체보기 (103)
우찬쓰 개발블로그
현재 개발하고 있는 토이 프로젝트에 RxJava는 쓰지않는데 EventBus기능이 필요해졌다. LocalBroadcastManager를 쓸수도 있겠지만, 이 클래스는 context를 필요로 하다보니 코드의 양이 늘어나는 문제도 있고, 현재 프로젝트의 아키텍쳐 구조를 헤칠것 같았다. 그래서 Coroutine에 있는 SharedFlow를 이용하여 EventBus를 구현해보기로 했다. 유저가 글쓰기를 하고나면, 다른 화면에서 이벤트를 받아서 리프레시 해주어야 한다. Coroutine 공식 문서를 보면 EventBus에 대한 가이드를 어느정도 해주고 있다. kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-sh..
MVVM 아키텍에서 LiveData를 쓰다보면 흔하게 마주할 수 있는 상황이 바로 Event 일회성 처리에 대한 문제이다. private val _eventStartSettingActivity = MutableLiveData() val eventStartSettingActivity: LiveData get() = _eventStartSettingActivity MainActivity로부터 SettingActivity를 시작하는 다음과 같은 event용 LiveData가 있다고 해보자. 이 이벤트를 emit하는 곳은 activity_main.xml에서 onClick을 처리하도록한 databinding이라고 생각하고, 이 클릭이벤트의 대한 메소드를 아래와 같이 정의했다. fun onClickSettingMe..
안드로이드 10부터 다크모드를 지원하기 시작했지만, 실제 적용해본적이 없어서 토이프로젝트에 적용해보기로 했습니다. 일단 결과물을 볼까요? 저는 기본적으로 흰색과 검은색으로 테마를 정했기 때문에, 깔끔한 다크모드가 적용된 것을 보실 수 있습니다. 그럼 바로 그 과정을 시작해봅시다. 위처럼 기존에 하드하게 박혀있던 컬러를 걷어내야 되겠죠? 이제는 values에 있는 color.xml을 복사해서 한벌을 더 준비해줍니다. 다크모드에 들어갈 color.xml은 values-night에 넣어주시면 됩니다. 그리고 저는 텍스트 컬러를 직접 이름으로 구분하여 컬러를 각각 다르게 넣어줬습니다. themes도 마찬가지로 나누어서 두벌을 준비하고, 각각의 설정 컬러를 새롭게 적용해줍니다. 이렇게만 하면 끝입니다! 라고 말하..
저는 이쯤에서부터 깃허브 호스팅을 시작했던 것으로 기억합니다. 어느정도 플레이 할 수 있는 테트리스가 되니 다른분들도 시켜보고 싶더군요. 깃허브 호스팅은 간단합니다. `gh-pages`라는 브랜치를 만들어서 push하면, 가장 상위루트에 index.html로 정의한 파일이 호스팅되게 됩니다. URL을 예를 들어보면 제 github 프로젝트 주소가 github.com/WoochanLee/BalanceTetris이고, 호스팅하면 woochanlee.github.io/BalanceTetris 이런 주소가 됩니다. 이 주소를 공유하여 테스터분들의 피드백을 요청하여 봤습니다. 근데 피드백을 들어보니, 랜덤의 문제점이 들어납니다. 긴 블럭만 계속 나온다던지.. 아니면 죽어도 안나온다던지.. 그래서 찾아보니 테트리스..
이제 테트리스 게임같긴 한데 뭔가 밋밋하죠? 네 맞습니다.. 색상을 입혀야 겠군요. 여기까지 만들고나서 지인들에게 조언을 구해보니 중요한 사실이 있었습니다. 테트리스의 각 블록은 이미 암묵적으로 정해진 색상이 있더군요(저도 이때 처음 알게되었음) 그래서 저도 그 색상을 따다가 블럭의 설계도에 추가해 봤습니다. /** ****□□□□**** **/ class BlockTypeOne { constructor() { this.widthBlockCount = 4; this.widthBlockMarginCount = 0; this.heightBlockCount = 1; this.heightBlockMarginCount = 1; this.blockColor = "#8CD6F3"; this.shape = [ [0, ..
고지가 눈앞에 보이니, 게임 시작부터 게임 오버까지 만들고 싶어졌습니다! 자 그럼 완성된 줄을 지우는 로직부터 시작해봅시다. removeCompletedLine(lineCount) { let stackedBlockArray = this.stackedBlock.blockArray; for (let y = 0; y < heightBlockCount; y++) { let isCompletedLine = true; for (let x = 0; x < widthBlockCount; x++) { if (!stackedBlockArray[x][y]) { isCompletedLine = false; break; } } if (isCompletedLine) { this.removeLine(y); return this.r..
이제 블럭을 좌우로 움직일 때 입니다! 화살표에 따라 블럭이 움직여 줘야 게임이겠죠 ㅎㅎ 그리서 key 이벤트를 받아 블럭이 움직이도록 해봅시다. window.onkeydown = (e) => { handleKeyboardEvent(e); }; function handleKeyboardEvent(e) { switch (e.code) { case "ArrowLeft": onClickLeftArrow(controlBlocks, stackedBlocks); break; case "ArrowRight": onClickRightArrow(controlBlocks, stackedBlocks); break; case "ArrowDown": onClickDownArrow(controlBlocks, stackedBloc..
이전에 테트리스 블럭이 쌓일 공간을 만들었으니, 이제 직접 조정할 블럭과 쌓일 블럭을 만들어야겠죠? 저는 이 두개를 stackedBlock과 controlBlock으로 이름붙였습니다. 그리고 각 블럭을 초기화 해봅니다. const widthBlockCount = 10; const heightBlockCount = 25; let stackedBlock = new Array(widthBlockCount); let controlBlock = new Array(widthBlockCount); initBlockArray(stackedBlock); initBlockArray(controlBlock); function initBlockArray(blockArray) { for (let x = 0; x < widthB..
벌써 테트리스를 만든지는 꽤 오래되었지만, 블로그에 테트리스 개발기를 써야지.. 써야지.. 하다가 오늘에야 마음먹고 쓰게되었습니다. 결론부터 말씀드리자면, 소스는 오픈소스로 공개되어있고, 출처만 밝히면 누구든지 소스를 참고할 수 있게 공개해 두었습니다. 누구든 이 테트리스 오픈소스에 참여할 수 있으니, PR 올려주세요~! github.com/WoochanLee/BalanceTetris WoochanLee/BalanceTetris Tetris built with vanilla javascript. Contribute to WoochanLee/BalanceTetris development by creating an account on GitHub. github.com 깃허브 호스팅을 이용하여 바로 플레이 해..
chrome://inspect