Join Now
Quality Rating:
  • Currently 5.0 / 5
(5.0 / 5 - 1 vote cast)
Expertise Level:
  • Currently 5.0 / 5
(5.0 / 5 - 1 vote cast)

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
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtopicQUqfnTopicZgamesQ
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX