ios实战-消除类游戏Dots

使用原生的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

时间: 2024-10-19 22:20:41

ios实战-消除类游戏Dots的相关文章

用cocos2d-html5做的消除类游戏《英雄爱消除》——概述

在bbs.html5china.com论坛学习了MV和老马的小熊蘑菇后我也自己模仿他们做了这样子一个游戏,权当技术交流学习,现在附上游戏截图和源码. 游戏截图: 1.系统菜单界面: 2.游戏界面 3.游戏结束界面: 4.游戏设置页面 这是一款休闲型的游戏,移动方块,相同的方块在一起就会消除,计算消除整个屏幕方块所需要画的时间,时间越短成绩越好.下面附上源码链接: http://files.cnblogs.com/jackyWHJ/HeroLikeClear.zip 接下来会把几个主要功能写个教程

用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ var STATE_PLAYING = 0; var STATE_GAMEOVER = 1; var g_sharedGameLayer; var GameLayer = cc.Layer.extend({ _time:0, _timeLabel:null, _timeSt

用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现

Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ var Block = cc.Sprite.extend({ id:0, name:"", active:true, pointX:0, pointY:0, beginPoint:null, flash:false, ctor:function (a

用cocos2d-html5做的消除类游戏《英雄爱消除》(4)——游戏结束

游戏结束界面: 在前面几个教程中,这个界面的创作所需要的知识点基本我们都讲过了,这里就说下用户数据的缓存吧,也是先来看下源码 /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ var GameOver = cc.Layer.extend({ init:function () { var bRet = false; if (this._super()) { var sp = cc.Sprite.create(s_b05);

用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ cc.dumpConfig(); var winSize; var SysMenu = cc.Layer.extend({ _hero:null, _logo:null, _logo

201512-2 消除类游戏 (水题,暴力)

问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除.当有多处可以被消除时,这些地方的棋子将同时被消除. 现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘. 请注意:一个棋子可能在某一行和某一列同时被消除. 输入格式 输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数. 接下来n行,每行m个

CCF - 201512-2 - 消除类游戏

问题描述 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除.当有多处可以被消除时,这些地方的棋子将同时被消除. 现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘. 请注意:一个棋子可能在某一行

消除类游戏(js版)

原文:消除类游戏(js版) 最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码总共456行,未经过严格测试 1 <html lang="zh-CN"> 2 <head> 3 <meta charset="utf-8"> 4 <meta http-equiv="X-UA-Compatible&qu

【CCF】消除类游戏

问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除.当有多处可以被消除时,这些地方的棋子将同时被消除. 现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘. 请注意:一个棋子可能在某一行和某一列同时被消除. 输入格式 输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数. 接下来n行,每行m个