jinios / swift-cardgameapp Goto Github PK
View Code? Open in Web Editor NEWThis project forked from code-squad/swift-cardgameapp
솔리테어 카드게임앱 - 코드스쿼드 미션 (2018.04 - 2018.05)
This project forked from code-squad/swift-cardgameapp
솔리테어 카드게임앱 - 코드스쿼드 미션 (2018.04 - 2018.05)
카드덱과 관련된 위치에 카드뷰가 드래그되면 카드뷰가 사라지는 문제
변경된 currentFrame으로 더 정확한 로직으로 판단하도록 변경하기
(이미 사용자가 뷰 내에서 원하는 곳까지 드래그를 마친 상태. 뷰만 옮겨져있음)
.ended 일때의 로직 flow
뷰 컨트롤러의 속성으로 지정한 var cardDeck: CardImageView
에 addGestureRecognizer(UITapGestureRecognizer)
적용했음에도 불구하고 터치가 작동하지 않는 문제
Step5 피드백 내용 정리
dragging으로 인한 foundationView와 Model을 업데이트하는 로직에서 column활용하기
Q. 어차피 카드 이미지의 크기는 모두 똑같고, 계산해놓은 카드 이미지 사이즈을 알 수 있기 때문에 CardImageView에 속성을 지정해놓은것처럼 사이즈도 fix시키고, VC에서는 origin만 알려주고 생성하면 더 효율적이지 않을까?
<예상되는 문제점>
DeckView에서 이벤트 받음 - CardGameDelegate에게 Notify - Deck담당 Model에게 로직실행 - 로직 실행으로 인해 변경된 상태 VC에 Notify - DeckView에게 redraw호출
로 변경할 것현재 CardStacksView에서 한꺼번에 그리고있는 7개의 스택을 나눠서 각각의 View로 구현
(CardDeckView와 CardDeckDelegate, DeckManageable과같은 관계의 뷰, 뷰모델, 프로토콜 만들기)
카드게임 앱 미션 Step4 주요 피드백
toInfo: MoveInfo
로 rule을 체크하려고 하면 에러발생앱 내에서 사용하는 카드이미지의 크기는 모두 동일하므로, 계산하는 객체 만들고 서브뷰에서 접근 가능하도록 만들기
각 OneStack뷰들이 따로 나눠져있기때문에 7개의 OneStack뷰 모두 frame.origin은 (0,0)이며, PositionX enum으로 계산할 수 없다.
따라서 아래의 stackColumn()
메소드에서 column이 nil로 리턴되는 문제까지 연쇄적으로 일어난다.
// FrameCalculator.swift
func stackColumn(originX: CGFloat) -> Int? {
for x in PositionX.allValues {
guard x.value == originX else { continue }
return x.hashValue
}
return nil
}
MoveInfo의 view가 Stack인경우, 드래그액션이 시작된 OneStack이 어떤 스택인지(origin.x값으로 알 수 있도록) 계산하는 로직을 추가한다.
isInside(point:)
를 파악한다.FrameCalculator.availableFrame()
에서 toPoint가 (0,0)으로 리턴* toPoint: cardStack(or foundation)까지 카드가 옮겨질 딱 맞는 위치
게임이 이미 진행된 상태에서 한 스택의 카드가 open된 상태의 카드가 여러장인데도
카드가 룰에의해서 다른 곳으로 옮겨지면 default상태의 스택으로 정렬되는 문제
shake gesture로 opened cardDeck을 다시 덮고,
shuffle()한 후에 남아있는 카드로 새롭게 closedDeck을 만들고 다시 카드를 tap해서 열때 backside이미지가 표시됨.
<관련 요구사항>
StackView들을 7개로 나누면서 Deck, Foundation, StacksView에서 카드 Frame의 origin을 계산하는 방법이 달라짐. (특히 x좌표)
특히 x좌표는 PositionX라는 enum으로 저장되어있고 모든 카드이미지의 크기또한 고정값이라 매번 CardMaker클래스에서 계산할 필요성이 없어보임.
더블탭은 앞면으로 뒤집혀 있는 카드만 처리한다. 뒷면인 카드는 무시한다.
currentFrame: 드래그가 모두 완료되어 끝난 최종 포지션을 의미함
해당 CGRect내부에 CGPoint가 있는지 확인하는 메소드 구현하기
<이유>
전체 스택 테이블에서 각 스택을 담당하는 뷰의 상태를 하나씩 관리하기 위해 스택뷰 적용
From JK:
- private 에서 다시 public으로 바뀐건가요? 여기에 접근하는 경우가 있다면 메소드를 만들어서 해결하는 방법을 고려해보세요.
- 여기서 사용하는 stacks 자체를 별도 객체로 만드는 건 어떨까요?
- 객체 역할과 책임에서 상위 객체에 있는 코드를 하위 객체에게 좀 더 위임해도 좋을 것 같습니다.
ex)
CardDeckView - CardDeckManager프로토콜, CardDeckDelegate 클래스
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.