黑马程序员技术交流社区

标题: 人射击,枪射子弹游戏 [打印本页]

作者: 李言    时间: 2015-7-10 21:11
标题: 人射击,枪射子弹游戏
小白的我试着用学到的知识,试着改善了一下课堂练习,一个小游戏
因为包含5个文件
文件一: main.m
#import <Foundation/Foundation.h>
#import "Gun.h"
#import "Soldier.h"

int main() {
//  创建人,枪对象
    Gun *gun = [[Gun alloc] init];
    Soldier *sol = [[Soldier alloc] initGun:gun];
//  游戏控制
    [sol control];
    return 0;
}
文件二:Gun.h
#import <Foundation/Foundation.h>
/**
*  枪类的声明
*  属性:
*  枪的型号, 子弹数量
*  方法:
*  枪发射子弹,重写init
*/
@interface Gun : NSObject
{
    @public
    NSString *_size;
    int _bulletNumber;
}
- (void)shoot;  //  射击
- (id)init;    //   初始化
@end
文件三:Gun.m
#import "Gun.h"
/**
*  枪类的方法实现
*/
@implementation Gun
// 枪发射子弹方法实现
- (void)shoot{
    if (_bulletNumber > 0) {
        _bulletNumber--;
        NSLog(@"啪!干死一个鬼子!!!");
        NSLog(@"萝莉管家:亲,您还有%d颗子弹哦,么么哒(^_^)", _bulletNumber);
    } else
        NSLog(@"亲,咱们没子弹了,呜呜");
}
// init方法的重写
- (id)init{
    if (self = [super init]) {
        _bulletNumber = 6;
    }
    return self;
}
@end
文件四:Soldier.h
#import <Foundation/Foundation.h>
#import "Gun.h"
/**
*  创建一个士兵类
*  属性:
*  名字,等级,生命,枪,人物经验
*  方法:
*  跑,蹲,射击,跳,装子弹,初始化,提示,重写init
*/
@interface Soldier : NSObject
{
    @public
    NSString *_name;
    int _level;
    Gun *_gun;
    int _life;
    int _experience;
}
- (void)run;    //  跑
- (void)jemp;   //  跳
- (void)squat;  //  蹲
+ (void)tiShi;     //  游戏提示
- (void)fireGun;   //  射击
- (void)control;   //  游戏控制
- (void)loadBullet;    //   装弹
- (id)initGun:(Gun *)gun;   //  初始化
@end
文件五:Soldier.m
#import "Soldier.h"
/**
*  士兵类方法的实现
*/
@implementation Soldier
// 跑方法实现
- (void)run{
    NSLog(@"风紧,扯呼!!!");
}
// 蹲方法实现
- (void)squat{
    NSLog(@"蹲下可不代表哥投降了,只是想拉屎...");
}
// 跳方法实现
- (void)jemp{
    _life++;
    NSLog(@"按剧情跳悬崖一定摔不死,弟兄们跳吧.");
    NSLog(@"哇塞,跳崖果然没死,捡到大力丸:生命+1");
}

// 射击方法实现
- (void)fireGun{
    [_gun shoot];
    switch(++_experience){
        case 5 :
            NSLog(@"终于升到一等兵了");
            break;
        case 20 :
            NSLog(@"终于升到二等兵了");
            break;
        case 80 :
            NSLog(@"终于升到三等兵了");
            break;
    }
}

// 装子弹方法的实现
- (void)loadBullet{
    _gun->_bulletNumber = 6;
    NSLog(@"好了子弹满了,不用手撕僵尸了");
}

// 提示方法的实现
+ (void)tiShi{
    NSLog(@"新兵蛋子,哥来教你打鬼子");
    NSLog(@"a是开枪了,z是装子弹,w是跳了,d是跑了,s是蹲下,q退出.嘿嘿,小子,有惊喜哦");
}
// 游戏控制的实现
- (void)control{
    //        游戏控制
    int n = 1;
    char action, ch;
    [Soldier tiShi];
    while(n){
        scanf("%c", &action);
        scanf("%c", &ch);
        switch(action){
            case 'a' :
            case 'A' :
                [self fireGun]; //  射击
                break;
            case 'W' :
            case 'w' :
                [self jemp]; // 跳
                break;
            case 'd' :
            case 'D' :
                [self run]; // 跑
                break;
            case 's' :
            case 'S' :
                [self squat]; // 蹲
                break;
            case 'z' :
            case 'Z' :
                [self loadBullet]; // 装弹
                break;
            case 'x' :
            case 'X' :
                [Soldier tiShi]; // 游戏提示
                break;
            case 'q' :
            case 'Q' :
                n = 0;      //  退出
                NSLog(@"你妈妈喊你回家吃饭了");
                break;
            default :
                NSLog(@"输入不正确哦");
        }
        NSLog(@"需要提示按x哦");
    }
}

// init方法的重写
- (id)initGun:(Gun *)gun{
    if (self = [super init]) {
        self->_gun = gun;
        self->_life = 3;
        self->_level = 0;
    }
    return self;
}
@end

作者: 行知灬哒    时间: 2015-7-10 22:02
不错    666    就是要这样
作者: 深蓝的蓝    时间: 2015-7-10 22:33
感觉很厉害啊  佩服
作者: 李言    时间: 2015-7-10 23:01
初始化程序那一段应该是// init方法的重写 - (id)initGun: (Gun *)gun{     if (self = [super init]) {         self->_gun = gun;         self->_life = 3;         self->_level = 0;     }     return self; } @end
作者: 4B青年    时间: 2015-7-10 23:07
流弊哄哄吊炸天。。。献上我的膝盖一副
作者: 李言    时间: 2015-7-10 23:15
4B青年 发表于 2015-7-10 23:07
流弊哄哄吊炸天。。。献上我的膝盖一副

:o不至于吧
作者: 4B青年    时间: 2015-7-10 23:21
李言 发表于 2015-7-10 23:15
不至于吧

因为还没学到OC,只要有改进视频的都至少用心了,都是脱离了低级趣味的人,都是最可爱的人
作者: carshoel    时间: 2015-7-10 23:39
牛人真多啊!你进黑马了没
作者: 李言    时间: 2015-7-10 23:42
carshoel 发表于 2015-7-10 23:39
牛人真多啊!你进黑马了没

现在基础班呢
作者: huguozhang    时间: 2015-7-11 01:52
学习了~~~  :victory:
作者: lixianzhu0712    时间: 2015-7-11 18:08
好牛逼的样子!
作者:   张恒宇    时间: 2015-7-11 23:09
写的不错。。。。。物理引擎在哪!!!!!你的json,png人物,,,,还要自己写flashtool来实现人物的动作。
你这些类的实现写一个出来剩下的都可以copy出来了!你可以在cocos2d中开启物理引擎在helloword.cpp   中添加
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);来实现
hero的图像自己做出来通过Flash导出JSON格式再写一个Flashtool来实现他;
#include "FlashTool.h"
#include <json/document.h>


Animate * FlashTool::readJsonSpriteSheet(std::string jsonFile,float delayPerUnit){
   
    rapidjson::Document doc;
    std::string fileContent = FileUtils::getInstance()->getStringFromFile(jsonFile);
    fileContent.erase(0,fileContent.find_first_of('{'));
   
    doc.Parse<0>(fileContent.c_str());
   
    std::string imgFileName = doc["meta"]["image"].GetString();
   
    auto &frames = doc["frames"];
    auto sfc = SpriteFrameCache::getInstance();
   
    Vector<AnimationFrame*> animFrames;
    for (auto m=frames.MemberonBegin(); m!=frames.MemberonEnd(); m++) {
        auto frameName = m->name.GetString();
        auto & frameProperties = m->value["frame"];
        auto & spriteSourceSize = m->value["spriteSourceSize"];
        
        auto sf = sfc->getSpriteFrameByName(frameName);
        if (!sf) {
            sf = SpriteFrame::create(imgFileName, Rect(frameProperties["x"].GetInt(), frameProperties["y"].GetInt(), frameProperties["w"].GetInt(), frameProperties["h"].GetInt()), m->value["rotated"].GetBool(), Vec2(spriteSourceSize["x"].GetInt(), spriteSourceSize["y"].GetInt()), Size(spriteSourceSize["w"].GetInt(), spriteSourceSize["h"].GetInt()));
            sfc->addSpriteFrame(sf, frameName);
        }
        animFrames.pushBack(AnimationFrame::create(sf, delayPerUnit, ValueMapNull));
    }
   
    Animation * animation = Animation::create(animFrames,delayPerUnit);
    return Animate::create(animation);
}
flashtool.h
#include <iostream>
#include <cocos2d.h>

USING_NS_CC;

class FlashTool {
   
public:
    static Animate * readJsonSpriteSheet(std::string jsonFile,float delayPerUnit);
};


#endif /* defined(__NoOneDies__FlashTool__) */


作者: Fighting--BJ    时间: 2015-7-11 23:13
学习学习!
作者: 李言    时间: 2015-7-11 23:21
  张恒宇 发表于 2015-7-11 23:09
写的不错。。。。。物理引擎在哪!!!!!你的json,png人物,,,,还要自己写flashtool来实现人物的动作 ...

我只是基础班啊,大哥,你说的这些我都没学过的:(
作者:   张恒宇    时间: 2015-7-11 23:24
李言 发表于 2015-7-11 23:21
我只是基础班啊,大哥,你说的这些我都没学过的

我想多了。。。。
作者:   张恒宇    时间: 2015-7-11 23:39
李言 发表于 2015-7-11 23:21
我只是基础班啊,大哥,你说的这些我都没学过的

其实我连基础班都没去呢;加油吧。。。前面的路还很长基础班写这样不错了
作者: 小白小白    时间: 2015-8-19 15:42
  张恒宇 发表于 2015-7-11 23:09
写的不错。。。。。物理引擎在哪!!!!!你的json,png人物,,,,还要自己写flashtool来实现人物的动作 ...

我也是直接添加这两个文件,可是报错,说frames.MemberonBegin()与frames.MemberonEnd()不是rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>的成员,请教一下这个问题怎么解决
作者: runsunlife    时间: 2015-8-19 15:55
不错。挺好的哈
作者: 小白小白    时间: 2015-8-19 15:59
runsunlife 发表于 2015-8-19 15:55
不错。挺好的哈

大哥在线啊,帮我看看这是什么问题,说frames.MemberonBegin()与frames.MemberonEnd()不是rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>>的成员,请教一下这个问题怎么解决
作者: runsunlife    时间: 2015-8-19 16:01
别叫我大哥  哈哈虽说我很老。。。关键是哥们俺还没看到你那呢。。。就是凑个热闹
作者: 小白小白    时间: 2015-8-19 16:15
runsunlife 发表于 2015-8-19 16:01
别叫我大哥  哈哈虽说我很老。。。关键是哥们俺还没看到你那呢。。。就是凑个热闹 ...

哥,你有qq吗,那个比较容易交流,救救我,加我的qq497594319
作者: tangbinbin    时间: 2015-8-24 11:38
厉害,自己学习以后举一反山,挺不错的
作者: GodLovenan    时间: 2015-8-25 11:04
楼主 好屌啊, 感谢楼主分享
作者: iphone    时间: 2015-8-25 14:31
看起来好牛逼的样子
作者: 庞佳星    时间: 2015-8-25 16:36
吊炸天!!!!学习了
作者: 15132876050    时间: 2015-8-26 21:10
好厉害   可以当大牛了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2