collision help!!!

BlitzMax Forums/BlitzMax Beginners Area/collision help!!!

Amon_old(Posted 2005) [#1]
I have an array that is filled with tiles. Now I have some tiles dropping from above that get added to the array when they hit the bottom of the screen. If I wanted it so that the tiles dropping would collide with the tiles already in the array how would I go about setting something like that up?

Like tetris, The tiles drop and get added to the array. Then the falling tiles collide with the tiles already in the array and they then immediately get added to the array at the current x,y locations.

Any help appreciated. :) I want some hints or tips before I post any code.

Thanks :)


deps(Posted 2005) [#2]
something like this? (assuming it is a tetris clone you are coding)
' psuedo code...

for x = 0 until 4
for y = 0 until 4
   if a_block[ block_type, rotation, x,y] <> 0 then
      if the_playing_field[ blockX+x, blockY+y ] <> 0 then
          ' BAM! This block collided with the ones already placed.
      endif
   endif
next
next




Amon_old(Posted 2005) [#3]
I think I've already tried that.

Heres the code that places the tiles:

	Function set_tiles()

		topLframe = frame1
		topRframe = frame2
		bottomLframe = frame3
		bottomRframe = frame4		
		
		If tilesY > GraphicsHeight()-116-64	
			tilesX = start_position
			setTile = True
			
		EndIf
			
		For Local b:brick = EachIn bricklist
		
		If setTile = True
		
			gamearea[tprXloc,tprYloc] = topRframe
			gamearea[tplXloc,tplYloc] = topLframe
			gamearea[blXloc,blYloc] = bottomLframe
			gamearea[brXloc,brYloc] = bottomRframe	
			brick.newbrick()
			setTile = False
			ListRemove bricklist,(b)
		EndIf		
		
			
			
		Next
		
			
	
	End Function


It places the tiles in the array when a condition is met. Note the locations of the tiles tprXloc etc.

The function below draws to the screen the tiles in the array.

Function draw_gamearea()

	For Local x:Int = 0 To arrX - 1
		For Local y:Int = 0 To arrY -1
			DrawImage tiles,gameareaX+x*32,gameareaY+y*32,gamearea[x,y]
		Next
	Next
		
End Function


I hope the code I posted helps. It's a tetris clone sort of.

ANymore help appreciated :)


deps(Posted 2005) [#4]
Well, the (psuedo) code I posted before is how I did it. What went wrong when you tried it?
DId you try something like this? (If I understand your code correctly)
' I dont know what value gamearea[] uses for non filled blocks. I assume -1 but change that to whatever value you use...
if gamearea[tprXloc,tprYloc] > -1 and gamearea[tplXloc,tplYloc] > -1 and gamearea[blXloc,blYloc] > -1 and gamearea[brXloc,brYloc] > -1 then
  set_tiles()
endif



Amon_old(Posted 2005) [#5]
hmm, it's doing something but not what I want. Can I send you the whole thing via email so you can have a look at it?


deps(Posted 2005) [#6]
Sure. But I can't guarantee a quick response. Must soon leave for work. Only 26 more minutes of sweet sweet freedom...


Amon_old(Posted 2005) [#7]
email with attatchment sent. Hope you can help. :)

26 mins of freedom eh, probably means you're going to work unlike me who's a bum. :)


deps(Posted 2005) [#8]
A bum eh? Are you walking around with a cardboard sign that says "Will code for food"? ;)

Got the email. going to take a look.

Edit:
Oooh. Pretty graphics!


Amon_old(Posted 2005) [#9]
A bum eh? Are you walking around with a cardboard sign that says "Will code for food"? ;)


If I did that I would starve to death. My coding isn't spectacular. :)


deps(Posted 2005) [#10]
Well, it does collide sometimes. But for some reason it just sits in the middle of the playing field and constantly creating a new block...
A problem with tprYloc,tplYloc,brYloc,blYloc?

But I can't track the problem right now. There's too many variables to follow and too little time. Work begins in one minute and I'm still sitting here. :)

And i found a bug. A bug I made. ;)
It should be
		If gamearea[tprXloc,tprYloc] <16 Or gamearea[tplXloc,tplYloc] <16 Or gamearea[blXloc,blYloc] <16 Or gamearea[brXloc,brYloc] <16

since you should be able to collide with just one of the corners... Sorry. :)


I will look some more when I'm home for lunch. Good luck until then.


Amon_old(Posted 2005) [#11]
Thanks mate. I've still a few things to try and I'll change the little mistake in the code.

Now get to work ;)


Amon_old(Posted 2005) [#12]
I got it working. Thanks :)


deps(Posted 2005) [#13]
Goodie! :)