標籤:
使用原生的ios UIKit實現簡單的消除類遊戲,還沒完全完成,不大想繼續做了,所以寫個部落格大家分享下:
先上源碼:http://git.oschina.net/jonear/LianLianDots
-----------------------------------------又是淩亂的分割線-----------------------------------------------------
主要是分享下這個遊戲的結構設計吧,整體還是很簡單的:
Manager:
LLDGameManger: 用於管理當前遊戲屬性的,是否成功,是否可以串連等
LLDGameLevel:用於記錄每個關卡的要求,需要達到多少分、能走幾步
UI:
LLDMainViewController:選關的介面,沒什麼可講的。
LLDGameViewController:遊戲介面,主要包含兩部分1.LLDGameView 2.LLDTopBar
LLDGameView:真正的遊戲介面,裡有n*n的LLDItemView組成,和手勢的基本邏輯控制
LLDTopBar:頂部的navbar,用於記錄分數,步數,剩餘時間等
LLDItemView:每個點,有不同的顏色,點擊狀態等屬性
-----------------------------------------又是淩亂的分割線-----------------------------------------------------
主要看看LLDGameView,其他都很簡單的。
map,二維數組
用一個二維數組來記錄地圖當前的情況
_itemArray = [NSArray arrayWithObjects:[NSMutableArray array], [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], nil];_selectedItemArray = [[NSMutableArray alloc] init];
更新地圖:
- (void)updateItems { int row = 0; for (NSMutableArray *itemArray in _itemArray) { for (int i=0; i<9; i++) { if (itemArray.count <= i) { int randomTop = random()%10-2; LLDItemView *item = [[LLDItemView alloc] initWithFrame:CGRectMake(row*_itmeWidth, -i*_itmeWidth-randomTop, _itmeWidth, _itmeWidth)]; [item setUserInteractionEnabled:NO]; [self addSubview:item]; [itemArray addObject:item]; } } [UIView animateWithDuration:0.3 animations:^{ int i=8; for (LLDItemView *item in itemArray) { item.top = i*_itmeWidth; i--; } }]; row ++; }}
通過手勢獲得座標,通過座標獲得點的view:
- (LLDItemView *)getItemAtPoint:(CGPoint)point { int row = point.x/_itmeWidth; if (_itemArray.count > row) { NSMutableArray *array = _itemArray[row]; int index = 9-point.y/_itmeWidth; if (array.count > index) { LLDItemView *view = array[index]; //判斷點是否在圓形地區內 UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:view.frame cornerRadius:view.width/3]; if ([path containsPoint:point]) { return view; } } } return nil;}
通過判斷是相同顏色的點畫出連線:
-(void)addLineToNode:(LLDItemView *)nodeView { [nodeView showTouch]; if(_selectedItemArray.count == 1){ //path move to start point CGPoint startPoint = nodeView.center; [_polygonalLinePath moveToPoint:startPoint]; _polygonalLineLayer.path = _polygonalLinePath.CGPath; _polygonalLineLayer.strokeColor = nodeView.styleColor.CGColor; }else{ //path add line to point [_polygonalLinePath removeAllPoints]; CGPoint startPoint = [_selectedItemArray[0] center]; [_polygonalLinePath moveToPoint:startPoint]; for (int i = 1; i < _selectedItemArray.count; ++i) { CGPoint middlePoint = [_selectedItemArray[i] center]; [_polygonalLinePath addLineToPoint:middlePoint]; } _polygonalLineLayer.path = _polygonalLinePath.CGPath; } }
然後放手消除選中的點:
- (void)checkSelectedItem { if (_selectedItemArray.count >= 3) { LLDItemViewStyle style = LLDItemViewStyleRed; for (LLDItemView *view in _selectedItemArray) { [view removeFromSuperviewWithScore:_selectedItemArray.count*10]; [self removeItemFromArray:view]; style = view.style; } [[LLDGameManager defaultManager] clearDotType:style count:_selectedItemArray.count]; if (_delegate && [_delegate respondsToSelector:@selector(didFinishStep)]) { [_delegate didFinishStep]; } }}
-----------------------------------------又是淩亂的分割線-----------------------------------------------------
當然還有寫回退、掉落等功能也有,都比較簡單,可以自己看原始碼。
關卡模式、螢幕適配、關卡設定等功能都還沒做,就當做是學習demo吧,有想做完的可以聯絡我。
當然簡單的遊戲可以用UIKit,稍微複雜點的盡量用遊戲引擎SprikeKit、cocos2d、unity什麼的。
我用sprikekit做的魔塔Demo可以推薦下:http://git.oschina.net/jonear/Tower_SpriteKit
ios實戰-消除類遊戲Dots