Qbasicnews.com
Calculate the dimension of an array for a sprite... - Printable Version

+- Qbasicnews.com (http://qbasicnews.com/newforum)
+-- Forum: Qbasic "like" compilers/interpreters (http://qbasicnews.com/newforum/forum-5.html)
+--- Forum: FB Discussion & Programming Help (http://qbasicnews.com/newforum/forum-15.html)
+--- Thread: Calculate the dimension of an array for a sprite... (/thread-9964.html)

Pages: 1 2


Calculate the dimension of an array for a sprite... - Clay Dragon - 04-17-2007

In QB for screen 13 it will take width*height+4 bytes. But I'm not so sure about that... I found an old QB tile engine that use only the half of the result of this calculation... why is it working anyway?

http://members.tripod.com/~qb4lamerz/files/tileeng3.zip

Also, I want to know how to do it in FB for screen 19?

Is it exactly the same?

Thanks!


Calculate the dimension of an array for a sprite... - Anonymous - 04-19-2007

It's the number of *bytes*. A QB integer is 2 bytes, hence needing half as many integers.

If you're ever planning to use FreeBASIC, don't even worry about calculating that, we introduced a function called imagecreate, which does the calculations for you if you give it the x, y.

Just saying.


Calculate the dimension of an array for a sprite... - wallace - 04-20-2007

Freebasic has solved that annoying little problem.

Code:
dim sprite as integer
sprite = imagecreate(width, height)

EDIT, Don't end you commands with a semicolon. My bad, too much C.


Calculate the dimension of an array for a sprite... - DrV - 04-20-2007

BASIC doesn't end lines with a semicolon...


Calculate the dimension of an array for a sprite... - Skyler - 04-20-2007

Yeah, that's C or something syntax, wallace...


Calculate the dimension of an array for a sprite... - Clay Dragon - 04-22-2007

Thanks everyone! Big Grin

Wallace, when I print the "Sprite" variable, it gives me a huge number! The number has seven figures even if my sprite is small as 20x20 or 100x100! Is that the dimension I have to give to my sprite in FB screen mode 19!?


Calculate the dimension of an array for a sprite... - BadMrBox - 04-23-2007

No, just write the height and width values.
Code:
dim sprite as integer
sprite = imagecreate(20, 20)



Calculate the dimension of an array for a sprite... - Clay Dragon - 04-23-2007

Thanks but when I compile the code below I got these errors:

Quote:C:\FreeBASIC\fbc -s gui -w 1 "Tileeng3.bas"
Tileeng3.bas(257) : error 14: Expected identifier, found: ','

PUT (x, y), Water1, PSET ' Show it...
^
Tileeng3.bas(259) : error 14: Expected identifier, found: ','

PUT (x, y), Tree1, PSET
^
Tileeng3.bas(261) : error 14: Expected identifier, found: ','

PUT (x, y), Grass1, PSET ' grass.
^

Build error(s)

So what's wrong with this code?

Code:
DEFINT A-Z                              ' All variables are default integers.
'$DYNAMIC                               ' Dynamically sort memory for more...

DECLARE SUB InitVars ()                 ' Initializes variables.
DECLARE SUB LoadMap ()                  ' Loads a map.
DECLARE SUB LoadTiles ()                ' Load the tiles by simple Bload.
DECLARE SUB MoveUp ()                   ' Handles moving `up' event.
DECLARE SUB MoveDown ()                 ' Handles moving `down' event.
DECLARE SUB MoveLeft ()                 ' Handles moving `left' event.
DECLARE SUB MoveRight ()                ' Handles moving `right' event.
DECLARE SUB PutPlayerPic ()             ' Puts the player pic.
DECLARE SUB PutTile (x, y, TileNumber)  ' Put a tile.
DECLARE SUB SetupPalette ()             ' Setup n!Media palette.
DECLARE SUB ShowMap ()                  ' Show the map...

TYPE WorldDataType                      ' WorldData holds generic world info.
Rows            AS INTEGER             ' Number of rows in world.
Cols            AS INTEGER             ' Number of cols in world.
TopRow          AS INTEGER             ' Current player row in world.
TopCol          AS INTEGER             ' Current player col in world
Action          AS INTEGER             ' So we only do things when needed.
AnimCycle       AS INTEGER             ' Which frame player is on.
Direc           AS INTEGER             ' What direction player is going in.
PlayerY         AS INTEGER             ' Adjusted player y pos for more 3d.
END TYPE

TYPE MapType                            ' Map type, easy to add tile values.
Tile            AS INTEGER             ' Identifies tile in any spot...
END TYPE

CONST North = 1, South = 2, East = 3, West = 4  ' Tracks dirs of player.
CONST True = -1, False = 0                      ' Boolean vals for easiness.
CONST TileDir$ = "Images"                       ' Tile directory.

Dim Shared Tree1 as Integer
Dim Shared Grass1 as Integer
Dim Shared Water1 as Integer

Rem DIM SHARED Tree1(129), Grass1(129), Water1(129) ' Tree, grass, water tiles.
DIM SHARED WorldData AS WorldDataType           ' WorldData variables.
DIM SHARED Map(-9 TO 60, -9 TO 60) AS MapType   ' The map, memory hog, reduce
                                                ' for more mem, smaller map.
SCREEN 13,,,1

Tree1 = imagecreate(16, 16)
Grass1 = imagecreate(16, 16)
Water1 = imagecreate(16, 16)

CALL InitVars                                   ' Initialize variables.
CALL LoadMap                                    ' Load a/the map.
CALL LoadTiles                                  ' Load tiles.

Call ShowMap                                    ' Show map...

DO                                              ' Main heart loop of program.
kbd$ = INKEY$                                  ' `Transparent' input.
IF kbd$ <> "" THEN                             ' If other than nothing...
  SELECT CASE kbd$                              ' ... find what key it is...
   CASE Chr$(255) + "H"                         ' Hit up arrow.
    CALL MoveUp                                 ' Call up events.
    WorldData.Action = True                     ' An action happened.
   CASE Chr$(255) + "P"                         ' Hit down arrow.
    CALL MoveDown                               ' Call down events.
    WorldData.Action = True                     ' An action happened.
   CASE Chr$(255) + "K"                         ' Hit left arrow.
    CALL MoveLeft                               ' Call left events.
    WorldData.Action = True                     ' An action happened.
   CASE Chr$(255) + "M"                              ' Hit right arrow.
    CALL MoveRight                              ' Call right events.
    WorldData.Action = True                     ' An action happened.

   CASE CHR$(27)                                ' ESC; end.
    END
  END SELECT
END IF

IF WorldData.Action = True THEN                ' If an action did happen...
  CALL ShowMap                                  ' Show the map since we moved.
  WorldData.Action = False                      ' No more action.
END IF                                         ' This is the spot where
                                                '  you would check if they
LOOP                                            '  hit a village or something.


MainMap:
DATA 40,40
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,-2,-2,-2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-2,-2,-2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1
DATA -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

REM $STATIC
SUB InitVars

WorldData.TopCol = 20                   ' Where they start in map (col).
WorldData.TopRow = 20                   ' Where they start in map (row).
WorldData.PlayerY = 96                  ' Y pixel location for player show.
                                        ' This is raised so it sorta looks
                                        ' like they are in front of the tile
                                        ' above them...
END SUB

SUB LoadMap

RESTORE MainMap                                 ' Read data from MainMap
READ WorldData.Rows, WorldData.Cols             ' Read row and column count.

FOR i = 1 TO WorldData.Rows
FOR j = 1 TO WorldData.Cols
  READ Map(j, i).Tile                           ' Read tile in...
NEXT j
NEXT i

END SUB

SUB LoadTiles

CHDIR TileDir$                          ' Goto tile directory.

BLoad "Grass1.bmp",VARPTR(Grass1)
BLoad "Water1.bmp",VARPTR(Water1)
BLoad "Tree1.bmp",VARPTR(Tree1)

CHDIR ".."                              ' Go back to initial dir.

END SUB

SUB MoveDown

WorldData.Direc = South

IF Map(WorldData.TopCol + 10, WorldData.TopRow + 7).Tile > 0 THEN
WorldData.TopRow = WorldData.TopRow + 1
END IF

END SUB

SUB MoveLeft

WorldData.Direc = West

IF Map(WorldData.TopCol + 9, WorldData.TopRow + 6).Tile > 0 THEN
WorldData.TopCol = WorldData.TopCol - 1
END IF

END SUB

SUB MoveRight

WorldData.Direc = East

IF Map(WorldData.TopCol + 11, WorldData.TopRow + 6).Tile > 0 THEN
WorldData.TopCol = WorldData.TopCol + 1
END IF

END SUB

SUB MoveUp

WorldData.Direc = North

IF Map(WorldData.TopCol + 10, WorldData.TopRow + 5).Tile > 0 THEN
WorldData.TopRow = WorldData.TopRow - 1
END IF

END SUB

SUB PutPlayerPic

LINE (160, WorldData.PlayerY)-STEP(15, 15), 15, B       ' Show `box' man.

END SUB

SUB PutTile (x, y, TileNumber)

SELECT CASE TileNumber                  ' Which tile to show?
CASE -2                                ' Negative tile (unwalkable)...
  PUT (x, y), Water1, PSET              ' Show it...
CASE -1
  PUT (x, y), Tree1, PSET
CASE 0, 1                              ' Anything undefined is by default
  PUT (x, y), Grass1, PSET              ' grass.
END SELECT

END SUB

SUB ShowMap

FOR i = 0 TO 19
FOR j = 0 TO 11
  CALL PutTile(i * 16, j * 16, Map(i + WorldData.TopCol, j + WorldData.TopRow).Tile)
NEXT j
NEXT i

CALL PutPlayerPic

END SUB



Calculate the dimension of an array for a sprite... - wallace - 04-23-2007

Not your code, it was mine.

Code:
dim sprite as integer ptr
sprite = imagecreate(width, height)

Image create returns a POINTER to the array, that was my mistake.

Looking at your code I do see one thing though, I'm pretty sure that if you declare your sprite as a pointer (like you need to be now) you don't need to VARPTR in your BLOAD.

Also, this doesn't really matter, but I would recommend using ENUMs rather than CONSTs for things like true and false, and the directions.


Calculate the dimension of an array for a sprite... - Clay Dragon - 04-26-2007

Everything works perfectly now! Thanks a lot Wallace! Big Grin