예제 #1
0
//增加积分
void GamePlayer::addScore(float value)
{
    score += value;
    std::string strScore = Convert2String(score);
    Label *labelScore = (Label *)GameScene::getGamescene()->getChildByTag(scoreTag);
    labelScore->setString(strScore.c_str());
}
예제 #2
0
//增加分数
void HPlayer::addScore(float _value)
{
    score+=_value;
    string strScore=Convert2String(score);//将int形转换为string类型
    //根据HWorld获取场景中分数标签并且改变他的值
    Label *temp=(Label *)HWorld::getInstance()->getChildByTag(scoreLabel_Tag);
    temp->setString(strScore.c_str());//将string类型转换为char*类型
    
}
예제 #3
0
파일: KeyConfig.cpp 프로젝트: Halksel/DTTD
void KeyConfig::Update() {
	exit.Update(&exit);
	config.Update(&config);
	if (config.InMouseClick()) {
		flag = true;
	}

	if (Input.GetKeyPress(KEY_INPUT_ESCAPE,MyInput::PRESSED) ) {
		flag = false;
	}
	if (flag) {
		if (first == -1) {
			for (int i = 0; i < 256; ++i) {
				if (Input.GetKeyPressDef(i, MyInput::PRESSED_ONCE)) {
					auto it = keyname.end();
					if ((it = find(keyname.begin(), keyname.end(), Convert2String(i))) != keyname.end()) {
						first = i;
						keysuf = it - keyname.begin();
						break;
					}
				}
			}
		}
		else {
			for (int i = 0; i < 256; ++i) {
				if (Input.GetKeyPressDef(i, MyInput::PRESSED_ONCE)) {
					if (find(keyname.begin(), keyname.end(), Convert2String(i)) == keyname.end()) {
						second = i;
						keyname[keysuf] = Convert2String(second);
						SwapKeyConfig(first, second);
						ConfigSave();
						flag = false;
						break;
					}
				}
			}
		}

	}
	else {
		first = -1;
		second = -1;
	}
}
예제 #4
0
//让主角掉血的方法,分为死亡和非死亡两种情况来分析
void HPlayer::downHp()
{
    //如果还处于无敌状态则不需要掉血
    if (isStrong)
    {
        return;
    }
    
    //如果已经不是无敌状态
    //血量减少1
    hp-=1;
    
    //如果血量少于0,则将主角设置不可见并且设置他已经死亡
    if (hp<=0)
    {
        this->setVisible(false);
        isDead=true;
        //取出旧的分数      //getInstance()获取的是一个.plist文件
        int oldScore=atoi(UserDefault::getInstance()->getStringForKey("user_score","-1").c_str());
        //当有新的分数,就将新的分数保存到数据中,并且要刷新保存
        if (oldScore!=-1&&score>oldScore)
        {
            UserDefault::getInstance()->setStringForKey("user_score", Convert2String(score));
            UserDefault::getInstance()->flush();
        }
        HWorld::getInstance()->lostGame();
    }
    //如果主角还未死亡然后移除相应界面中的血量贴图
    else
    {
        switch (hp)
        {
            case 1:
                HWorld::getInstance()->removeChildByTag(tag_playerHP2, true);
                break;
            case 2:
                HWorld::getInstance()->removeChildByTag(tag_playerHP3, true);
                break;
            case 3:
                HWorld::getInstance()->removeChildByTag(tag_playerHP4, true);
                break;
            case 4:
                HWorld::getInstance()->removeChildByTag(tag_playerHP5, true);
                break;
        }
        
        //减血后会有一段时间的无敌状态
        //将无敌状态开启,并且开启无敌状态的定时器
        isStrong=true;
        strongCount=0;//无敌时间的计数
        
        
        this->schedule(schedule_selector(HPlayer::strongIng));
    }
}
예제 #5
0
//增加杀敌数
void GamePlayer::addKillCount(float num)
{
    killCount += num;
    std::string strKillCount = Convert2String(killCount);
    strKillCount += "/100";
    Label *labelKillCount = (Label *)GameScene::getGamescene()->getChildByTag(killCountTag);
    labelKillCount->setString(strKillCount.c_str());
    
    if (killCount >= 100) {
        //储存分数
        int oldScore = atoi(UserDefault::getInstance()->getStringForKey("user_score", "-1").c_str());
        if (score > oldScore) {
            UserDefault::getInstance()->getStringForKey("user_score", Convert2String(score));
            UserDefault::getInstance()->flush();
        }
        
        //调用胜利画面
        GameScene::getGamescene()->winGame();
    }
}
예제 #6
0
//增加杀敌数
void HPlayer::addKillCount(float _value)
{
    killCount+=_value;
    string strKillCount=Convert2String(killCount);
    strKillCount+="/100";
    //获取HWorld中杀敌数标签,并且改变他的值
    Label *temp=(Label *)HWorld::getInstance()->getChildByTag(killLabel_Tag);
    temp->setString(strKillCount.c_str());
    
    
    //当杀敌过百的时候,游戏胜利
    if (killCount>=100)
    {
        //oldScore-----从.plist文件中获取储存的旧分数
        //atoi--->将char*转换为整形
                                                        //根据"user_score"这个KEY来取值,如果没有值,将值设为-1
        int oldScore=atoi(UserDefault::getInstance()->getStringForKey("user_score","-1").c_str());
        
        //  string.c_str()-->string转化为char*
        //atoi(char*)---->char*转化为int
        
        
        
        if (score>oldScore)
        {                                                 //KEY
            UserDefault::getInstance()->setStringForKey("user_score", Convert2String(score));
            UserDefault::getInstance()->flush(); //必须要写,刷新数据
        }
        

        
        
        //调用胜利界面
        HWorld::getInstance()->winGame();
    }
}
예제 #7
0
//主角掉血函数(默认每次只掉一滴血)
void GamePlayer::downHP()
{
    if (isStrong) {
        return;
    }
    hp -= 1;//掉一滴血
    if (hp <= 0) {
        
        this->setVisible(false);
        isDead = true;
        
        //储存最高分数
        int oldScore = atoi(UserDefault::getInstance()->getStringForKey("user_score", "-1").c_str());
        if (score > oldScore) {
            UserDefault::getInstance()->setStringForKey("user_score", Convert2String(score));
            UserDefault::getInstance()->flush();
        }
        GameScene::getGamescene()->removeChildByTag(Hp1);
        //调用失败界面
        GameScene::getGamescene()->lostGame();
        //调用失败layer
    }else{
        //将界面血量更新
        switch (hp) {
            case 1:
                GameScene::getGamescene()->removeChildByTag(Hp2);
                break;
            case 2:
                GameScene::getGamescene()->removeChildByTag(Hp3);
                break;
        }
        //设置主角无敌时间
        isStrong = true;
        strongCount = 0;
        
        this->schedule(schedule_selector(GamePlayer::playerStrong));
    }
}
예제 #8
0
void HPlayer::playerInit(const char * playerName)
{
    Size size=Director::getInstance()->getWinSize();
    Point origin = Director::getInstance()->getVisibleOrigin();
    
    
    
    
    //设置飞船的位置在屏幕下面
    Sprite *ship=Sprite::create(playerName);
    ship->setPosition(Point(origin.x+150,origin.y+120));
    this->addChild(ship,0,ship_Tag);
    
    
    //设置参数(血量,当前血量,分数,无敌时间)
    hpMax=5;
    hp=5;
    score=0;
    strongTime=2*60;//60帧*2--->2秒
    isStrong=false;//初始不是无敌状态,减血后会有一段时间的无敌状态
    
    //添加右下角的血量Sprite
    for (int i=0; i<5; i++)
    {
        Sprite *shipHp=CCSprite::create("icon_hp.png");
        
        //设置每个血量贴图在屏幕的右下角一次排列,并且从右至左tag分别是值为1,2,3,4,5的枚举类型
        shipHp->setPosition(Point(size.width-20-30*i, shipHp->getContentSize().height*0.5));
        
        if (i==0) {
            shipHp->setTag(tag_playerHP1);
        }else if(i==1){
            shipHp->setTag(tag_playerHP2);
        }else if(i==2){
            shipHp->setTag(tag_playerHP3);
        }else if(i==3){
            shipHp->setTag(tag_playerHP4);
        }else if(i==4){
            shipHp->setTag(tag_playerHP5);
        }
        //将每一个血量贴图添加到HWorld层中
        HWorld::getInstance()->addChild(shipHp,10);
    }
    
    
    //添加分数Label
    Label *label=Label::createWithSystemFont("分数:", "Helvetica-Blood" , 24);
    //分数Label在屏幕位置左上方
    label->setPosition(Point(200, size.height-22));
    HWorld::getInstance()->addChild(label,10);
    
    //添加分数结果Label
    string strScore=Convert2String(score);//将score---转化为string类型
                                                  //此处需要的时char*类型,所以使用c_str()进行转换
    Label * scoreLabel=Label::createWithSystemFont(strScore.c_str(), "Helvetica-Blood" , 24);
    scoreLabel->setPosition(Point(260, size.height-22));
    //设置颜色为黄色
    scoreLabel->setColor(Color3B(255, 255, 0));
    HWorld::getInstance()->addChild(scoreLabel,10,scoreLabel_Tag);
    
    
    
    
    
    //添加杀敌Label
    Label *killLabel=Label::createWithSystemFont("杀敌:", "Helvetica-Blood", 24);
    killLabel->setPosition(Point(200, size.height-52));
    HWorld::getInstance()->addChild(killLabel,10);
    
    //杀敌数结果Label
    string strKillCount=Convert2String(killCount);//将score---转化为string类型
    strKillCount+="/100"; //C++中string可以直接拼接
                                                      //此处需要的时char*类型,所以使用c_str()进行转换
    Label *labelKillCount=Label::createWithSystemFont(strKillCount.c_str(), "Helvetica-Blood", 24);
    labelKillCount->setPosition(Point(260, size.height-52));
    //设置为黄色
    labelKillCount->setColor(Color3B(255, 255, 0));
    HWorld::getInstance()->addChild(labelKillCount,10,killLabel_Tag);
    
    
    //创建一个单点触摸监听
    auto listener1 = EventListenerTouchOneByOne::create();
    listener1->setSwallowTouches(true); //这个方法是指是否要吞噬触摸事件(也可以称之为是否穿透)
    
    listener1->onTouchBegan = [=](Touch* touch, Event* event)
    {
        //1、首先通过getCurrentTarget获取点击到的对象
        auto target = static_cast<Sprite *>(event->getCurrentTarget());
        
        //2、调用getLocation将iOS坐标系转换成cocos2d-x坐标系
        Point locationInNode = target->convertToNodeSpace(touch->getLocation());
        //3、然后调用convertToNodeSpace将上述cocos2d-x坐标系转换成该对象的本地坐标系
        
        //4、通过调用getContentSize获取该对象的大小
        Size s = target->getContentSize();
        
        //5、创建该对象的frameRect
        Rect rect = Rect(0, 0, s.width, s.height);
        
        //6、将该触摸的本地坐标系与frameRect比较,若包含则表明触摸有效返回
        if (rect.containsPoint(locationInNode))
        {
            ///////////表示触摸到该对象,可进行一系列操作///////
            return true;//表示寻找到该对象,并终止场景图事件监听遍历。—向下执行onTouchMoved, onTouchEnded
        }
        return false;//表示本次遍历不是该触摸对象,继续遍历下一个事件监听对象。
    };
    
    listener1->onTouchMoved = [=](Touch* touch, Event* event)
    {
        
        //强制类型转换
        auto target = static_cast<Sprite*>(event->getCurrentTarget());
        
        
        Point original = target->getPosition();
        Point destination=touch->getDelta();
        
        target->setPosition(Point(original.x+destination.x,original.y+destination.y));
        
        
        //边界限定
        float leftBorderLimit = target->getTexture()->getContentSize().width * 0.5f;
        float rightBorderLimit = size.width - target->getTexture()->getContentSize().width * 0.5f;
        float lowBorderLimit = target->getTexture()->getContentSize().width * 0.5f;
        float heightBorderLimit = size.height - target->getTexture()->getContentSize().width * 0.5f;

        if (original.x+destination.x<leftBorderLimit||original.x+destination.x>rightBorderLimit)
        {
            target->setPosition(Point(original.x,original.y+destination.y));
        }
        
        if (original.y+destination.y<lowBorderLimit||original.y+destination.y>heightBorderLimit)
        {
            target->setPosition(Point(original.x+destination.x,original.y));
        }
        
        
        
    };
    
    listener1->onTouchEnded = [=](Touch* touch, Event* event)
    {
        
    };
    
    //将触摸事件监听(listener1)加入到对象(ship)一个监听事件不能被添加给两个对象
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, ship);
    
    
    
    
}
예제 #9
0
void GamePlayer::initPlayer()
{
    //设置主角初始位置
    Size visibleSize = Director::getInstance()->getVisibleSize();
    this->setPosition(visibleSize.width/2, this->getContentSize().height/2);
    
    auto listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    
    listener->onTouchBegan=[](Touch *touch, Event *event)
    {
        return true;
    };
    
    listener->onTouchMoved=[](Touch *touch, Event *event)
    {
        auto target = static_cast<Sprite *>(event->getCurrentTarget());
        target->setPosition(target->getPosition() + touch->getDelta());
    };
    
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
    
    //初始化三个主角血条
    for (int i = 0;  i < 3; i++) {
        Sprite *playerHP = Sprite::create("icon_hp.png");
        playerHP->setPosition((visibleSize.width)-(playerHP->getContentSize().width*i)-20, playerHP->getContentSize().height/2);
        if (i == 0) {
            playerHP->setTag(Hp1);
        }else if (i == 1){
            playerHP->setTag(Hp2);
        }else{
            playerHP->setTag(Hp3);
        }
        GameScene::getGamescene()->addChild(playerHP, 10);
    }
    
    
    strongTime = 2*60;//设置无敌时间为2秒
    hp = 3;//初始化血量为3
    score = 0;//初始化分数为0
    killCount = 0;//初始化杀敌数为0
    
    //初始化"分数"文字加入layer中
    Label *label = Label::createWithSystemFont("分数", "Arial", 24);
    label->setPosition(30,visibleSize.height-22);
    label->setColor(Color3B::BLACK);
    GameScene::getGamescene()->addChild(label);
    
    //将Score加入 “分数” 中
    std::string strScore = Convert2String(score);
    Label *labelScore = Label::createWithSystemFont(strScore.c_str(), "Arial", 24);
    labelScore->setPosition(Point(110,visibleSize.height-22));
    labelScore->setColor(Color3B(255, 255, 0));
    GameScene::getGamescene()->addChild(labelScore, 10, scoreTag);
    
    //杀敌人数
    Label* labelKill = Label::createWithSystemFont("杀敌:", "Arial-Blod", 24);
    labelKill->setPosition(Point(30,visibleSize.height-52));
    labelKill->setColor(Color3B::BLACK);
    GameScene::getGamescene()->addChild(labelKill,10);
    
    //杀敌数字加入layer中
    std::string strKillCount=Convert2String(killCount);
    strKillCount+="/100";
    Label* labelKillCount = Label::createWithSystemFont(strKillCount.c_str(), "Arial-Blod", 24);
    labelKillCount->setPosition(Point(110,visibleSize.height-52));
    labelKillCount->setColor(Color3B(255, 255, 0));
    GameScene::getGamescene()->addChild(labelKillCount,10,killCountTag);
}