// April 17 2012 - Tabs converted to 3 spaces.
#constant PANEL_ROWS 3
#constant PANEL_COLS 4
#constant DEPTH_SCORE 20
#constant DEPTH_PANEL 30
#constant DEPTH_WORK 40
#constant MAX_WORKOBJECTS 100
#constant FRAME_HIGHLIGHT 251
#constant FRAME_TRASHCAN 252
#constant STATE_SETUP 0
#constant STATE_INTRO 1
#constant STATE_DEMO 2
#constant STATE_MENU 3
#constant STATE_RUNNING 4
#constant STATE_EXIT 99
type displayType
physWidth#
physHeight#
virtWidth#
virtHeight#
iconSize#
textHeight#
lastFPS#
iconImage
highSprite
endtype
type touchType
pointDX#
pointDY#
pointWX#
pointWY#
spritePicked
objectPicked
pickOffsetX#
pickOffsetY#
endtype
type panelType
height#
speed#
isOpen
image
sprite
text
sound
iconMax
endtype
type WorkObjectType
isFree
objectID
sprite
endtype
type GameType
state
level
endtype
global numWorkObjects = 0
Initialise()
// Temporary Objects
imageRef = SafeloadImage( "finger.png" )
spriteRef = createSprite( imageRef )
// Main Loop
do
LoopStart()
select GameState()
case STATE_SETUP
// Setup Code
setGameState( STATE_RUNNING )
endcase
case STATE_INTRO
// Intro Code
endcase
case STATE_DEMO
// Demo Code
endcase
case STATE_MENU
// Menu Code
endcase
case STATE_RUNNING
// Running Code
checkGamePointer()
endcase
endselect
setSpritePosition( spriteRef , PointDX() , PointDY() )
PrintDiagnostics()
sync()
loop
// Loop Functions
function LoopStart()
display.lastFPS# = screenFPS()
panel.speed# = panelHeight() / (lastFPS() * 1.25)
touch.pointDX# = getPointerX()
touch.pointDY# = getPointerY()
touch.pointWX# = ScreentoWorldX(PointDX())
touch.pointWY# = ScreentoWorldY(PointDY())
endfunction
// Game Functions
function checkGamePointer()
if getPointerPressed() > 0
if PointDY() >= getTextY( panelText() ) and PointDY() < getSpriteY( panelSprite() )
ToggleTrayOpen()
elseif PointDY() < getTextY( panelText() )
touch.spritePicked = getSpriteHit( PointWX() , pointWY() )
if SpritePicked() > 0
touch.objectPicked = FindWorkObjectBySprite( SpritePicked() )
if ObjectPicked() > 0
touch.pickOffsetX# = PointWX() - getSpriteXByOffset( SpritePicked() )
touch.pickOffsetY# = PointWY() - getSpriteYByOffset( SpritePicked() )
endif
endif
endif
elseif getPointerReleased() > 0
if thisObjectPicked > 0
thisX# = PointWX() - PickOffsetX()
thisY# = PointWY() - PickOffsetY()
HideHighLight()
if WorldToScreenY( thisY#) >= getTextY( panelText() )
DelWorkObject( ObjectPicked() )
else
setSpritePositionByOffset( SpritePicked() , thisX# , thisY# )
setSpriteDepth( SpritePicked() , DEPTH_WORK - 1 )
thisObjectUnder = WorkObjectIsOver( ObjectPicked() )
if thisObjectUnder > 0
// This is where the merge objects code goes
endif
endif
endif
touch.spritePicked = 0
touch.objectPicked = 0
touch.pickOffsetX# = 0.0
touch.pickOffsetY# = 0.0
elseif getPointerState() > 0
if ObjectPicked() > 0
thisX# = PointWX() - PickOffsetX()
thisY# = PointWY() - PickOffsetY()
setSpritePositionByOffset( SpritePicked() , thisX# , thisY# )
setSpriteDepth( SpritePicked() , DEPTH_PANEL - 5 )
if WorldToScreenY( thisY#) >= getTextY( panelText() )
HighlightSprite( SpritePicked() , FRAME_TRASHCAN )
else
thisObjectUnder = WorkObjectIsOver( ObjectPicked() )
if thisObjectUnder > 0
HighlightSprite( WorkObjectSprite( thisObjectUnder ) , FRAME_HIGHLIGHT )
else
HideHighLight()
endif
endif
endif
endif
if panelIsOpen() = 1
if getSpriteY( panelSprite() ) > ( PhysHeight() - panelHeight() )
MovePanel( -panelSpeed() )
endif
else
if getSpriteY( panelSprite() ) < PhysHeight()
MovePanel( panelSpeed() )
endif
endif
endfunction
// Diagnostic Functions
function PrintDiagnostics()
printc( "Phy: " + str( PhysWidth() , 0) + " x " + str( PhysHeight() , 0 ))
printc( ", Vir: " + str( VirtWidth() , 1) + " x " + str( VirtHeight() , 1 ))
print( ", @ " + str ( lastFPS() , 2 ) + " fps" + chr(10) )
printc( "Pointer (Display): " )
print( str( PointDX() ) + " x " + str( PointDY() ) )
printc( "Pointer (World): " )
print( str( PointWX() ) + " x " + str( PointWY() ) )
printc( "Sprite: ")
print( str( getSpriteHit( PointDX() , PointDY() )))
printc( "Sprite Picked: ")
printc( str( SpritePicked() ))
printc( ", Object Picked: ")
printc( str( ObjectPicked() ))
printc( ", Over : " )
print( str( WorkObjectIsOver( ObjectPicked() ) ))
endfunction
// Panel Functions
function ToggleTrayOpen()
panel.isOpen = 1 - panelIsOpen()
if panelSound() > 0 then playSound( panelSound() )
endfunction
function MovePanel( distance# )
setSpriteY( panelSprite() , getSpriteY( panelSprite() ) + distance# )
setTextY( panelText() , getTextY( panelText() ) + distance# )
PositionPanelIcons()
endfunction
function PositionPanelIcons()
iconDepth = getSpriteDepth( PanelSprite() ) - 1
for icon = 1 to panelIconMax()
offset = icon - 1
col = offset mod PANEL_COLS
row = offset / PANEL_COLS
x = col * IconSize() + 2
y = row * IconSize() + getSpriteY( PanelSprite() ) + 2
setSpritePosition( panelIconSprite[ icon ] , x , y )
setSpriteDepth( panelIconSprite[ icon ] , iconDepth )
next icon
endfunction
// Load Functions
function SafeLoadImage( thisFileName$ )
if getFileExists( thisFileName$ )
thisImageRef = loadImage( thisFileName$ )
else
thisImageRef = 0
endif
endfunction thisImageRef
function SafeLoadSound( thisFileName$ )
if getFileExists( thisFileName$ )
thisSoundRef = loadSound( thisFileName$ )
else
thisSoundRef = 0
endif
endfunction thisSoundRef
// Base 96 Functions
function Base96Encode( thisValue )
lowValue = thisValue mod 96
highValue = ( thisValue / 96 ) mod 96
thisString$ = chr( highValue + 32 ) + chr( lowValue + 32 )
endfunction thisString$
function Base96Decode( thisString$ )
thisLen = len(thisString$)
if thisLen = 0
thisValue = 0
else
if thisLen = 1 then thisString$ = " " + thisString$
highValue = asc( left( thisString$ , 1 ) ) - 32
lowValue = asc( mid( thisString$ , 2, 1 ) ) - 32
thisValue = highValue * 96 + lowValue
endif
endfunction thisValue
function Base96Sort( thisString$ )
thisLen = len(thisString$)
if thisLen > 2 and (thisLen && 1) = 0
thisArraySize = thisLen / 2
dim tempArray[ thisArraySize ] as string
for i=1 to thisArraySize
tempArray[ i ] = mid( thisString$ , i*2 - 1 , 2)
next i
SortTempArray( thisArraySize )
thisString$ = ""
for i=1 to thisArraySize
thisString$ = thisString$ + tempArray[ i ]
next i
endif
endfunction thisString$
function SortTempArray( thisSize )
for i=1 to thisSize - 1
thisLow = i
for j = i + 1 to thisSize
if tempArray[j] < tempArray[thisLow] then thisLow = j
next j
if thisLowest <> i
temp$ = tempArray[i]
tempArray[i] = tempArray[thisLow]
tempArray[thisLow] = temp$
endif
next i
endfunction
// Work Object Functions
function TopWorkObject()
endfunction numWorkObjects
function WorkObjectValid( thisObject )
thisBool = ( thisObject > 0 and thisObject <= TopWorkObject() )
endfunction thisBool
function FirstFreeWorkObject()
for thisObject = 1 to TopWorkObject()
if WorkObjectIsFree( thisObject ) > 0 then exit
next thisObject
if thisObject > MAX_WORKOBJECTS then thisObject = 0
endfunction thisObject
function AddWorkObject( thisObjectID, thisSprite )
thisObject = FirstFreeWorkObject()
if thisObject > TopWorkObject() then numWorkObjects = thisObject
if WorkObjectValid( thisObject )
workObject[ thisObject ].isFree = 0
workObject[ thisObject ].objectID = thisObjectID
workObject[ thisObject ].sprite = thisSprite
endif
endfunction thisObject
function DelWorkObject( thisObject )
if WorkObjectValid( thisObject )
workObject[ thisObject ].isFree = 1
if WorkObjectSprite( thisObject ) > 0
thisSprite = WorkObjectSprite( thisObject )
workObject[ thisObject ].sprite = 0
if getSpriteExists( thisSprite ) then deleteSprite( thisSprite )
endif
while WorkObjectIsFree( TopWorkObject() ) = 1 and TopWorkObject() >= 0
dec numWorkObjects , 1
endwhile
endif
endfunction
function CreateWorkObjectSprite( thisObject , thisX , thisY )
if WorkObjectIsFree( thisObject ) = 0
if WorkObjectSprite( thisObject ) = 0 then workObject[ thisObject ].sprite = createSprite( IconImage() )
thisSprite = WorkObjectSprite( thisObject )
fixSpriteToScreen( thisSprite , 0 )
setSpriteSize( thisSprite , IconSize() , - 1)
setSpriteOffset( thisSprite , iconSize() / 2.0 , iconSize() / 2.0 )
setSpritePositionByOffset( thisSprite , thisX , thisY )
setSpriteDepth( thisSprite , DEPTH_WORK - 1 )
setSpriteAnimation( thisSprite , 64 , 64 , 252 )
setSpriteFrame( thisSprite , WorkObjectID( thisObject ) )
endif
endfunction
function WorkObjectIsOver( thisWorkObject )
thisSprite = WorkObjectSprite( thisWorkObject )
if thisSprite > 0
thisX# = getSpriteXByOffset( thisSprite )
thisY# = getSpriteYByOffset( thisSprite )
for thisObject = 1 to TopWorkObject()
if thisObject <> thisWorkObject
thisSprite = WorkObjectSprite( thisObject )
if thisSprite > 0
diffX# = abs( getSpriteXByOffset( thisSprite ) - thisX# )
diffY# = abs( getSpriteYByOffset( thisSprite ) - thisY# )
if diffX# < iconSize() and diffY# < iconSize() then exit
endif
endif
next thisObject
if thisObject > TopWorkObject() then thisObject = 0
else
thisObject = -1
endif
endfunction thisObject
function FindWorkObjectBySprite( thisSprite )
for thisObject = 1 to TopWorkObject()
if WorkObjectSprite( thisObject ) = thisSprite then exit
next thisObject
if thisObject > TopWorkObject() then thisObject = 0
endfunction thisObject
function HideHighLight()
if HighSprite() > 0
if getSpriteExists( HighSprite() ) then deleteSprite( HighSprite() )
display.highSprite = 0
endif
endfunction
function HighlightSprite( thisSprite , thisFrame )
if thisSprite > 0 and thisFrame > 0 and thisFrame < 253
if getSpriteExists( thisSprite )
HideHighLight()
display.highSprite = cloneSprite( thisSprite )
setSpriteFrame( HighSprite() , thisFrame )
setSpriteDepth( HighSprite() , getSpriteDepth( HighSprite() ) - 1)
endif
endif
endfunction
// Game State Functions
function SetGameState( thisState )
game.state = thisState
endfunction
// Initialisation Functions
function Initialise()
// Prepare Globals
global game as gameType
game.level = 0
game.state = STATE_SETUP
global touch as touchType
touch.pointDX# = 0.0
touch.pointDY# = 0.0
touch.pointWX# = 0.0
touch.pointWY# = 0.0
touch.spritePicked = 0
touch.objectPicked = 0
touch.pickOffsetX# = 0.0
touch.pickOffsetY# = 0.0
global display as displayType
display.physWidth# = getDeviceWidth()
display.physHeight# = getDeviceHeight()
display.virtWidth# = PhysWidth()
display.virtHeight# = PhysHeight()
display.iconSize# = PhysWidth() / PANEL_COLS
display.textHeight# = PhysHeight() / 20.0
display.highSprite = 0
display.iconImage = SafeloadImage( "objects.png" )
global panel as panelType
panel.iconMax = PANEL_ROWS * PANEL_COLS
panel.height# = IconSize() * PANEL_ROWS
panel.speed# = 0.0
panel.isOpen = 0
panel.Image = SafeloadImage( "panel.jpg" )
panel.sprite = createSprite( PanelImage() )
panel.text = createText( "Objects" )
panel.sound = SafeLoadSound("panel.wav")
setImageWrapU( PanelImage() , 1 )
setImageWrapV( PanelImage() , 1 )
uScale# = getImageWidth( PanelImage() ) / PhysWidth()
vScale# = getImageHeight( PanelImage() ) / PanelHeight()
setSpriteUVScale( PanelSprite() , uScale# , vScale# )
setSpriteSize( PanelSprite() , PhysWidth() , PanelHeight() )
setSpritePosition( PanelSprite() , 0 , PhysHeight() )
setSpriteDepth( PanelSprite() , DEPTH_PANEL)
setTextSize( panelText() , textHeight() )
setTextAlignMent( panelText() , 1)
setTextPosition( panelText() , PhysWidth() / 2.0 , PhysHeight() - TextHeight() )
setTextDepth( panelText() , DEPTH_PANEL - 1 )
// Prepare Arrays
dim panelIconSprite[ panelIconMax() ]
for icon = 1 to panelIconMax()
panelIconSprite[ icon ] = createSprite( 0 )
setSpriteSize( panelIconSprite[ icon ] , IconSize() - 4, IconSize() - 4)
setSpriteColor( panelIconSprite[ icon ] , 255 , 255 , 255 , 127 )
next icon
dim workObject[ MAX_WORKOBJECTS ] as WorkObjectType
for thisObject = 1 to MAX_WORKOBJECTS
workObject[ thisObject ].isFree = 1
workObject[ thisObject ].objectID = 0
workObject[ thisObject ].sprite = 0
next thisObject
setVirtualResolution( VirtWidth(), VirtHeight() )
PositionPanelIcons()
endfunction
// Return Functions - Game
function GameLevel()
endfunction game.level
function GameState()
endfunction game.state
// Return Functions - Display
function PhysWidth()
endfunction display.physWidth#
function PhysHeight()
endfunction display.physHeight#
function VirtWidth()
endfunction display.virtWidth#
function VirtHeight()
endfunction display.virtHeight#
function IconSize()
endfunction display.iconSize#
function TextHeight()
endfunction display.textHeight#
function LastFPS()
endfunction display.lastFPS#
function IconImage()
endfunction display.iconImage
function HighSprite()
endfunction display.highSprite
// Return Functions - Touch
function PointDX()
endfunction touch.pointDX#
function PointDY()
endfunction touch.pointDY#
function PointWX()
endfunction touch.pointWX#
function PointWY()
endfunction touch.pointWY#
function SpritePicked()
endfunction touch.spritePicked
function ObjectPicked()
endfunction touch.objectPicked
function PickOffsetX()
endfunction touch.pickOffsetX#
function PickOffsetY()
endfunction touch.pickOffsetY#
// Return Functions - Panel
function PanelHeight()
endfunction panel.height#
function PanelSpeed()
endfunction panel.speed#
function PanelIsOpen()
endfunction panel.isOpen
function PanelImage()
endfunction panel.image
function PanelSprite()
endfunction panel.sprite
function PanelText()
endfunction panel.text
function PanelSound()
endfunction panel.sound
function PanelIconMax()
endfunction panel.iconMax
// Return Functions - WorkObject Array
function WorkObjectIsFree( thisObject )
if WorkObjectValid( thisObject )
thisIsFree = workObject[ thisObject ].isFree
else
thisIsFree = -1
endif
endfunction thisIsFree
function WorkObjectID( thisObject )
if WorkObjectValid( thisObject )
thisObjectID = workObject[ thisObject ].objectID
else
thisObjectID = -1
endif
endfunction thisObjectID
function WorkObjectSprite( thisObject )
if WorkObjectValid( thisObject )
thisSprite = workObject[ thisObject ].sprite
else
thisSprite = -1
endif
endfunction thisSprite
//
Tuesday, 17 April 2012
Game States - Check
As I left you to create the last couple of functions without a guide, here's a complete code listing of the program as it stands now for you to check against.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment