ios實戰-消除類遊戲Dots

來源:互聯網
上載者:User

標籤:

使用原生的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,其他都很簡單的。

  1. 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.