deleting items from 2d arrays
Michael P.
baseball.mjp at gmail.com
Fri Aug 14 11:49:57 PDT 2009
Daniel Keep Wrote:
>
>
> Michael P. wrote:
> > Okay, so I'm making a breakout type game in D. Using Derelict.
> > I have a 2d array of Block type variables(not important what's in them) declared like this:
> > Block[][] level;
> > and later load into like this:
> > level = loadLevel( "levels.txt", levelNumber );
> > Anyways, what I want to do is that when the ball hits one of the blocks in the array, I remove it. When a line no longer has any blocks in it, I remove that line/row. When there are no more lines, I load the next level.
> > Any ideas on how I could achieve this?
> >
> > foreach( Block[] ba; level )
> > {
> > foreach( Block b; ba )
> > {
> > if( checkCollision( ball, b.p ) )
> > {
> > //remove the block??
> > }
> > }
> > }
> >
> > The level array has 12 lines of 'x' amount of bricks. x can be as great as 10.
> > -Michael P.
>
> That depends on what you mean by "remove" and what Block is.
>
> If Block is a class, you can remove instances from the array simply by
> setting that slot to null.
>
> foreach( row ; level )
> {
> foreach( ref block ; row )
> {
> if( checkCollision( ball, block.p ) )
> block = null;
> }
> }
>
> If you want to actually remove the Block from the array, and their
> relative ordering isn't important, you can do this:
>
> void dropElement(T)(ref T[] arr, size_t i)
> {
> assert( i < arr.length );
> arr[i] = arr[$-1];
> arr = arr[0..$-1];
> }
>
> That moves the last element into the place of the one you don't want,
> then drops the last element of the array.
>
> If the relative ordering DOES matter, then you have to copy the later
> elements down the array and drop the last element.
This function worked quite well.
I ended up just using a normal array, because it made things easier than having a 2D array. The order of where the Blocks were in the array didn't matter.
I ended up doing this:
//Check for collision between blocks
for( int i = 0; i < level.length; i++ )
{
if( checkCollision( ball, level[i].p ) )
{
//remove the block
ballyVel = -ballyVel;
dropElement( level, i );
i--;
}
}
.....
//remove element from arrray
void dropElement(T)(ref T[] arr, size_t i)
{
assert( i < arr.length );
arr[i] = arr[$-1];
arr = arr[0..$-1];
}
More information about the Digitalmars-d-learn
mailing list