For those interested here is the source on what ive been working on so far
SetWindowTitle( "MyRallyX" )
SetWindowSize( 480, 320, 0 )
SetVirtualResolution(480,320)
SetOrientationAllowed( 0,0, 1, 1 )
//BackgroundTiles that get moved around
GLOBAL Block as integer[11,11]
Loadimage (1,"1.png")
Loadimage (2,"2.png")
Loadimage (3,"3.png")
Loadimage (4,"4.png")
Loadimage (5,"5.png")
Loadimage (6,"6.png")
Loadimage (7,"7.png")
Loadimage (8,"8.png")
Loadimage (9,"9.png")
Loadimage (10,"10.png")
Loadimage (11,"11.png")
Loadimage (28,"28.png")
Loadimage (29,"29.png")
loadimage (30,"background.png")
//created a background sprite because there is transparency with tiles
background=createsprite(30)
SetSpritePosition(background,0,0)
SetSpriteDepth (background , 9999 )
global taxi as integer
Loadimage (100,"taxi.png")
taxi=createSprite (100)
SetSpritePosition(taxi,295,160)
SetSpriteDepth (taxi , 1 )
SetSpriteCollideBits( taxi, 1 )
//load the tilemap
temp as integer
filename$="map.txt"
file = OpenToRead(filename$)
for y= 1 to 11
for x = 1 to 11
temp$=ReadLine(file)
temp=val(temp$)
Block[x,y]=createSprite(temp)
setSpriteSize(Block[x,y],128,128)
setSpritePosition(Block[x,y],(x-1)*128,(y-1) * 128)
SetSpriteDepth (Block[x,y] , 9998 )
SetSpriteGroup(Block[x,y],1)
next x
next y
CloseFile ( file )
type _point
x as float
y as float
endtype
global points as _point[-1]
global p as _point
global center as _point
center.x = 295+16
center.y = 160+32
p.x = 295-4
p.y = 160
points.insert(p)
p.x = 295+30
p.y = 160
points.insert(p)
p.x = 295-4
p.y = 160+60
points.insert(p)
p.x = 295+30
p.y = 160+60
points.insert(p)
angle as float = 1
setprintsize(10)
speed#=0
do
if GetRawKeyState(37) //left arrow pressed
TurnSprite(taxi,-1)
CollisionPointersMove(taxi,-1)
endif
if GetRawKeyState(39) //right arrow pressed
TurnSprite(taxi,1)
CollisionPointersMove(taxi,1)
endif
if GetRawKeyState(38) //up arrow key pressed
if speed#<5 then speed#=speed#+.025
endif
if GetRawKeyState(40) //Down arrow pressed
speed#=speed#-.025
if speed#<-5 then speed# =-5
endif
//movebackground tiles
for y = 1 to 11
for x = 1 to 11
moveInDirection(getSpriteAngle(taxi),block[x,y],-speed#)
next x
next y
//check for collision
for i = 0 to points.length
p = points[i]
if pickColor(p.x,p.y)<>"106,106,106"
//collision occured move background tiles back to last location
for y =1 to 11
for x =1 to 11
moveInDirection(getSpriteAngle(taxi),block[x,y],speed#)
next x
next y
endif
next i
Sync ()
loop
Function pickColor(X,Y)
rem prepare image grab area
clearScreen()
setScissor(X,Y,X+1,Y+1)
render()
rem get image
img = getImage(x,y,1,1)
rem create memblock
mem = createMemblockfromImage(img)
rem get memblock data
r = getMemblockbyte(mem,12)
g = getMemblockbyte(mem,13)
b = getMemblockbyte(mem,14)
s$ = str(r)+","+str(g)+","+str(b)
rem tidy up
deletememblock(mem)
deleteimage(img)
setScissor(0,0,getDeviceWidth(),getDeviceHeight())
clearScreen()
endfunction s$
rem turns a sprite by a set angle in relation to it's current angle
function turnSprite(spriteID,degrees#)
setSpriteAngle(spriteID,getSpriteAngle(spriteID)+degrees#)
endfunction
//moves background tiles 1 at a time
function moveInDirection(a# as float,spriteID as integer,amount# as float)
state=1
rem get display data
dw# = getVirtualWidth()
dh# = getVirtualHeight()
aspect# = (dw# / dh#)
if aspect# = 1.0
aspect# = getDisplayAspect()
else
aspect# = 1.0
endif
x# = getSpriteXbyOffset(SpriteID)
y# = getSpriteYbyOffset(SpriteID)
x=x#+sin(a#)*amount#
y=y#-cos(a#)*amount#*aspect#
SetSpritePositionByOffset(SpriteID,x,y)
if getSpriteY(spriteID) > 640 //GetVirtualHeight()
SetSpritePosition (spriteID, getSpriteX(spriteID) , GetSpriteY (spriteID)-1408)
endif
if getSpriteY(spriteID)<-(300)
SetSpritePosition (spriteID, GetSpriteX (spriteID) , GetSpriteY (spriteID)+1408)
endif
if getSpriteX(spriteID) > 640 //GetVirtualHeight()
SetSpritePosition (spriteID, getSpriteX(spriteID)-1408, GetSpriteY (spriteID))
endif
if getSpriteX(spriteID)<-(128+64)
SetSpritePosition (spriteID, GetSpriteX (spriteID) + 1408, GetSpriteY (spriteID))
endif
//462,634
endfunction state
function distance(p1 as _point, p2 as _point)
local d, dx, dy
dx = p1.x - p2.x
dy = p1.y - p2.y
d = sqrt(dx * dx + dy * dy)
endfunction d
function Difference(num1 as integer, num2 as integer)
diff = Abs(num1 - num2)
endfunction diff
function CollisionPointersMove(spriteId as integer, ammount as float)
for i=0 to points.length
p = points[i]
//SetSpritePosition(101+i,p.x,p.y)
r = distance(p, center) // calculate the distance from our point to the center of the screen
angle = atanfull(p.x - center.x, p.y - center.y) // Calculate the Angle to the center of the screen
angle=angle+ammount // Add one degree to the angle
p.x = center.x + r * cos(angle - 90)
p.y = center.y + r * sin(angle - 90)
SetSpritePosition(101+i,p.x,p.y)
points[i] = p
next
endfunction
the above changes has helped considerably
the collision part still needs some work
//check for collision
for i = 0 to points.length
p = points[i]
if pickColor(p.x,p.y)<>"106,106,106"
//collision occured move background tiles back to last location
for y =1 to 11
for x =1 to 11
moveInDirection(getSpriteAngle(taxi),block[x,y],speed#)
next x
next y
endif
next i
as it seems to send it backwards more than forwards lol but il get it. I used the same technique at first when I tried previous returning to the old position but it always overlapped the sprites
fubar