官术网_书友最值得收藏!

Time for action – implementing init()

Inside init(), we'll build the game screen, bringing in all the sprites and labels we'll need for the game:

  1. So right after the if statement where we call the super Layer::init method, we add:
    _players = Vector<GameSprite*>(2);
    _player1Score = 0;
    _player2Score = 0;
    _screenSize = Director::getInstance()->getWinSize();
  2. We create the vector where we'll store both players, initialize the score values, and grab the screen size from the singleton, all-knowing Director. We'll use the screen size to position all sprites relatively. Next we will create our first sprite. It is created with an image filename, which FileUtils will take care of loading from the correct folder:
    auto court = Sprite::create("court.png");
    court->setPosition(Vec2(_screenSize.width * 0.5, _screenSize.height * 0.5));
    this->addChild(court);
  3. Get into the habit of positioning sprites with relative values, and not absolute ones, so we can support more screen sizes. And say hello to the Vec2 type definition used to create points; you'll be seeing it a lot in Cocos2d-x.
  4. We finish by adding the sprite as a child to our GameLayer (the court sprite does not need to be a GameSprite).
  5. Next we will use our spanking new GameSprite class, carefully positioning the objects on screen:
    _player1 =  GameSprite::gameSpriteWithFile("mallet.png");
    _player1->setPosition(Vec2(_screenSize.width * 0.5,  _player1->radius() * 2));
    _players.pushBack(_player1);
    this->addChild(_player1);
        
    _player2 =  GameSprite::gameSpriteWithFile("mallet.png");
    _player2->setPosition(Vec2(_screenSize.width * 0.5, _screenSize.height - _player1->radius() * 2));
    _players.pushBack(_player2);
    this->addChild(_player2);
    _ball = GameSprite::gameSpriteWithFile("puck.png");
    _ball->setPosition(Vec2(_screenSize.width * 0.5, _screenSize.height * 0.5 - 2 * _ball->radius()));
    this->addChild(_ball);
  6. We will create TTF labels with the Label class createWithTTF static method, passing as parameters the initial string value (0), and the path to the font file. We will then position and rotate the labels:
    _player1ScoreLabel = Label::createWithTTF("0",  "fonts/Arial.ttf", 60);
    _player1ScoreLabel->setPosition(Vec2(_screenSize.width - 60,  _screenSize.height * 0.5 - 80));
    _player1ScoreLabel->setRotation(90);
    this->addChild(_player1ScoreLabel);
    _player2ScoreLabel = Label::createWithTTF("0",  "fonts/Arial.ttf", 60);
    _player2ScoreLabel->setPosition(Vec2(_screenSize.width - 60,  _screenSize.height * 0.5 + 80));
    _player2ScoreLabel->setRotation(90);
    this->addChild(_player2ScoreLabel);
  7. Then we turn GameLayer into a multitouch event listener and tell the Director event dispatcher that GameLayer wishes to listen to those events. And we finish by scheduling the game's main loop as follows:
    auto listener = EventListenerTouchAllAtOnce::create();
    listener->onTouchesBegan =  CC_CALLBACK_2(GameLayer::onTouchesBegan, this);
    listener->onTouchesMoved =  CC_CALLBACK_2(GameLayer::onTouchesMoved, this);
    listener->onTouchesEnded =  CC_CALLBACK_2(GameLayer::onTouchesEnded, this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
    //create main loop
    this->scheduleUpdate();
    return true;

What just happened?

You created the game screen for Air Hockey, with your own sprites and labels. The game screen, once all elements are added, should look like this:

What just happened?

And now we're ready to handle the player's screen touches.

主站蜘蛛池模板: 梅州市| 河西区| 措勤县| 额济纳旗| 离岛区| 岳阳市| 泰州市| 盈江县| 金山区| 陆良县| 浦城县| 广德县| 香格里拉县| 扬州市| 威海市| 通海县| 若尔盖县| 石楼县| 汤原县| 西乌珠穆沁旗| 平罗县| 兰州市| 阿克陶县| 临海市| 乐平市| 舒城县| 眉山市| 东丽区| 淳化县| 冷水江市| 阳春市| 高碑店市| 庆城县| 栾川县| 绍兴县| 淳化县| 兰考县| 博乐市| 岳阳市| 密山市| 共和县|