This page was last modified 09:55, 28 March 2008.
CS000865 - Collision detection
From Forum Nokia Wiki
| ID | CS000865 | Creation date | March 28, 2008 |
| Platform | S60 3rd Edition, MR S60 3rd Edition, FP1 S60 3rd Edition, FP2 Beta | Tested on devices | Nokia E61i Nokia E90 Communicator Nokia N95 8GB |
| Category | Symbian C++ | Subcategory | Games |
| Keywords (APIs, classes, methods, functions): CPeriodic, Math::Random(), TRect::Intersects() |
Overview
This snippet demonstrates how to implement the logic for basic collision detection, which is useful, for example, in simple games. In the snippet, five blocks are drawn onto the screen and sent moving. Collisions against walls and other blocks are detected. Moving is handled with CPeriodic.
In this snippet, the code is implemented in a container control named CAppView. The control is derived from CCoeControl.
Header file
const TInt KBlocks = 5; const TInt KBlockWidth = 10; const TInt KBlockHeight = 10; const TInt KBlockMaxSpeed = 3; const TInt KDelay = 10000; const TInt KInterval = 10000;
/** * Static callback function for timer, called periodically. * @param aPtr pointer to this class * @return one of S60 error codes */ static TInt TimerCallBack(TAny* aPtr); /** * Timer function called from TimerCallBack. * Takes care of moving the blocks. * @return one of S60 error codes */ TInt DoTimer(); // Data TPoint iPosition[KBlocks]; // positions for blocks TPoint iSpeed[KBlocks]; // speeds for blocks TRgb iColor[KBlocks]; // colors for blocks CPeriodic* iTimer;
Source file
#include <e32math.h>
void CAppView::ConstructL(const TRect& aRect) { // Create a window for this application view CreateWindowL(); // Create a periodic timer to move the blocks iTimer = CPeriodic::NewL(EPriorityNormal); // Initialize the blocks TInt i; for (i = 0; i < KBlocks; i++) { iSpeed[i] = TPoint( Math::Random() % (2 * KBlockMaxSpeed + 1) - KBlockMaxSpeed, Math::Random() % (2 * KBlockMaxSpeed + 1) - KBlockMaxSpeed); iPosition[i] = TPoint( Math::Random() % aRect.Width(), Math::Random() % aRect.Height()); iColor[i] = TRgb( Math::Random() % 256, Math::Random() % 256, Math::Random() % 256); } // Start the timer iTimer->Start(KDelay, KInterval, TCallBack(TimerCallBack, this)); // Set the window size SetRect(aRect); // Activate the window, which makes it ready to be drawn ActivateL(); }
TInt CAppView::TimerCallBack(TAny* aPtr) { return ((CAppView*)aPtr)->DoTimer(); }
TInt CAppView::DoTimer() { // Get gc to draw with CWindowGc& gc = SystemGc(); gc.Activate(Window()); gc.Clear(); gc.SetPenStyle(CGraphicsContext::ENullPen); gc.SetBrushStyle(CGraphicsContext::ESolidBrush); // Handle each block in turn for (TInt i = 0; i < KBlocks; i++) { gc.SetBrushColor(iColor[i]); TPoint& position = iPosition[i]; TPoint& speed = iSpeed[i]; // Move blocks position = position + speed; TRect rect = Rect(); // Detect block colliding against walls if ((position.iX + KBlockWidth >= rect.iBr.iX) || (position.iX <= rect.iTl.iX)) { speed.iX = -speed.iX; position = position + speed; } if ((position.iY + KBlockHeight >= rect.iBr.iY) || (position.iY <= rect.iTl.iY)) { speed.iY = -speed.iY; position = position + speed; } // Detect blocks colliding against each other TRect boxRect(position, TSize(KBlockWidth, KBlockHeight)); for (TInt j = 0; j < KBlocks; j++) { TRect boxRect2(iPosition[j], TSize(KBlockWidth, KBlockHeight)); if ((i != j) && (boxRect.Intersects(boxRect2))) { speed.iY = -speed.iY; speed.iX = -speed.iX; } } // Draw current block gc.DrawRect(boxRect); } gc.Deactivate(); return KErrNone; }
Postconditions
Five blocks are bouncing on the screen.
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Roaming detection? | gusditz | General Symbian C++ | 1 | 2004-02-02 03:22 |
| code for bluetooth device detection | soorejmg | Symbian Tools & SDKs | 4 | 2006-12-21 17:17 |
| Non-working example for keylock detection in the Knowledge Base? | mgroeber9110 | Developer Resources Feedback (Documentation, Examples, Training) | 1 | 2008-07-09 18:21 |
| detection problem of 3100 on pc | sfahadahmed | General Discussion | 0 | 2005-01-20 12:29 |
| The truth of implementing a VoIP client in Symbian | er_benji | VoIP | 9 | 2007-10-11 14:39 |

