- Cocos2d-x by Example:Beginner's Guide(Second Edition)
- Roger Engelbert
- 468字
- 2021-07-23 20:00:29
Time for action – handling multitouches
There are three methods we need to implement in this game to handle touches. Each method receives, as one of its parameters, a vector of Touch
objects:
- So add our
onTouchesBegan
method:void GameLayer::onTouchesBegan(const std::vector<Touch*> &touches, Event* event) { for( auto touch : touches) { if(touch != nullptr) { auto tap = touch->getLocation(); for (auto player : _players) { if (player->boundingBox().containsPoint(tap)) { player->setTouch(touch); } } } } }
Each
GameSprite
, if you recall, has a_touch
property.So we iterate through the touches, grab their location on screen, loop through the players in the vector, and determine if the touch lands on one of the players. If so, we store the touch inside the player's
_touch
property (from theGameSprite
class).A similar process is repeated for
onTouchesMoved
andonTouchesEnded
, so you can copy and paste the code and just replace what goes on inside the_players
array for loop. - In
TouchesMoved
, when we loop through the players, we do this:for (auto player : _players) { if (player->getTouch() != nullptr && player->getTouch() == touch) { Point nextPosition = tap; if (nextPosition.x < player->radius()) nextPosition.x = player->radius(); if (nextPosition.x > _screenSize.width - player->radius()) nextPosition.x = _screenSize.width - player->radius(); if (nextPosition.y < player->radius()) nextPosition.y = player->radius(); if (nextPosition.y > _screenSize.height - player->radius()) nextPosition.y = _screenSize.height - player->radius(); //keep player inside its court if (player->getPositionY() < _screenSize.height* 0.5f) { if (nextPosition.y > _screenSize.height* 0.5 - player->radius()) { nextPosition.y = _screenSize.height* 0.5 - player->radius(); } } else { if (nextPosition.y < _screenSize.height* 0.5 + player->radius()) { nextPosition.y = _screenSize.height* 0.5 + player->radius(); } } player->setNextPosition(nextPosition); player->setVector(Vec2(tap.x - player->getPositionX(), tap.y - player->getPositionY())); } }
We check to see if the
_touch
property stored inside the player is the being moved now. If so, we update the player's position with the touch's current position, but we check to see if the new position is valid: a player cannot move outside the screen and cannot enter its opponent's court. We also update the player's vector of movement; we'll need this when we collide the player with the puck. The vector is based on the player's displacement. - In
onTouchesEnded,
we add this:for (auto player : _players) { if (player->getTouch() != nullptr && player->getTouch() == touch) { //if touch ending belongs to this player, clear it player->setTouch(nullptr); player->setVector(Vec2(0,0)); } }
We clear the _touch
property stored inside the player if this touch is the one just ending. The player also stops moving, so its vector is set to 0
. Notice that we don't need the location of the touch anymore; so in TouchesEnded
you can skip that bit of logic.
What just happened?
When you implement logic for multitouch this is pretty much what you will have to do: store the individual touches inside either an array or individual sprites, so you can keep tracking these touches.
Now, for the heart and soul of the game—the main loop.
- 手機安全和可信應用開發(fā)指南:TrustZone與OP-TEE技術詳解
- INSTANT Sencha Touch
- Hands-On C++ Game Animation Programming
- Julia Cookbook
- SSM輕量級框架應用實戰(zhàn)
- Hands-On Functional Programming with TypeScript
- Learning Concurrency in Kotlin
- 從零學Java設計模式
- 透視C#核心技術:系統(tǒng)架構及移動端開發(fā)
- 劍指大數(shù)據(jù):企業(yè)級電商數(shù)據(jù)倉庫項目實戰(zhàn)(精華版)
- Visual Basic.NET程序設計
- Mastering Responsive Web Design
- R統(tǒng)計應用開發(fā)實戰(zhàn)
- Getting Started with SQL Server 2014 Administration
- 機器學習開發(fā)者指南