如何设计开发iphone塔防游戏4-栩栩如生

本文由eseedo(泰然骷髅会成员)翻译,泰然授权转载,转载请通知eseedo(http://blog.sina.com.cn/eseedo)。(-by Iven)

欢迎继续这个系列教程的学习。


如果游戏和现实世界的法则相去甚远,完全不着边,很可能玩家无法产生代入感。即便是完全虚构的世界,也需要和真实的世界有点相似之处。既然大多数的塔防游戏源自现实,我们需要让游戏中的事物尽可能显得真实一些。如果你还没有看过前几篇的学习,建议先去了解一下。看过的童鞋也不妨回顾一下。



在这一部分的轿车中,我们会把前两部分的内容整合在一起,同时给炮塔和敌人添加一些旋转和瞄准动作,让它们尽可能的显得真实一些:

1.炮塔要瞄准最接近的敌人

2.炮塔要朝向所瞄准的敌人

3.当敌人在某个特定的方向移动时需要旋转

 

正式学习之前,还是先把源代码下载下来吧:Tower Defense Part 3

 

作为游戏开发者,如果要开发出一款吸住玩家的游戏,我们任重道远。不过,如果要达到虚拟现实的程度,可不是一时半会儿能搞定的,要花费大量的时间和精力才能实现。所以哥只会像一个真正的游戏开发者一样做事-仿造真实。首先要从炮塔开始调整,在Tower.m中添加如下代码,让它可以追踪最接近的敌人:

- (Creep *)getClosestTarget {
    Creep *closestCreep = nil;
    double maxDistant = 99999;

    DataModel *m = [DataModel getModel];

    for (CCSprite *target in m._targets) {
        Creep *creep = (Creep *)target;
        double curDistance = ccpDistance(self.position, creep.position);

        if (curDistance < maxDistant) {
            closestCreep = creep;
            maxDistant = curDistance;
        }

    }

    if (maxDistant < self.range)
        return closestCreep;

    return nil;
}

使用以上代码和DataModel类,程序会搜索地图上所有的敌人,通过比较它们和炮塔的距离来找出最接近的敌人。对于每个搜索到的敌人,我们都会检查它到炮塔的距离是否小于之前存储的距离。默认情况下,我们选择99999这个距离,因为任何一个出现在地图上的敌人到炮塔的距离都会小于这个值。

 

接下来的代码可以让炮塔旋转,里面有一些数学的东西,不过并不是太复杂:

-(void)towerLogic:(ccTime)dt {

    self.target = [self getClosestTarget];

    if (self.target != nil) {

        //rotate the tower to face the nearest creep
        CGPoint shootVector = ccpSub(self.target.position, self.position);
        CGFloat shootAngle = ccpToAngle(shootVector);
        CGFloat cocosAngle = CC_RADIANS_TO_DEGREES(-1 * shootAngle);

        float rotateSpeed = 0.5 / M_PI; // 1/2 second to roate 180 degrees
        floatrotateDuration = fabs(shootAngle * rotateSpeed);   

        [self runAction:[CCSequence actions:
                            [CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],
                            nil]];
    }
}

如果你仔细比较,会发现炮塔和敌人的此类代码非常类似,因为其数学原理是一样的。为了方便起见,哥这里来个一石二鸟,只解释Creep.m中的这段代码:

 

-(void)creepLogic:(ccTime)dt {

    // Rotate creep to face next waypoint
    WayPoint *waypoint = [self getCurrentWaypoint ];

    CGPointwaypointVector = ccpSub(waypoint.position, self.position);
    CGFloat waypointAngle = ccpToAngle(waypointVector);
    CGFloat cocosAngle = CC_RADIANS_TO_DEGREES(-1 * waypointAngle);

    float rotateSpeed = 0.5 / M_PI; // 1/2 second to roate 180 degrees
    floatrotateDuration = fabs(waypointAngle * rotateSpeed);   

    [self runAction:[CCSequence actions:
                     [CCRotateTo actionWithDuration:rotateDuration angle:cocosAngle],
                     nil]];
}

在以上代码中,根据炮塔的当前朝向,敌人的朝向,以及兴趣点(对于敌人来说就是路点,而对于炮塔来说就是敌人)的位置,我们需要计算出旋转的角度。为此,首先我们需要计算出当前点和兴趣点之间的方向向量。然后我们使用cocos2d的一个函数将向量转换为弧度(反正切),接下来将这个弧度转换成角度。

还有一点需要注意的是,我们预计的旋转角度是0-359度,而cocos2d所处理的旋转角度一般是0-180和0-180度。

经过以上代码的处理,我们基本实现了炮塔和敌人的真实化。

这一部分的教程很短,但至关重要,在下一部分,我们将真正让炮塔开火!

标签: cocos2d教程, 塔防游戏教程

?>