Map Editor Questions
Blitz3D Forums/Blitz3D Beginners Area/Map Editor Questions
| ||
Few more general questions: a) Rather than use arrays to store tiles and maps, I was thinking of using Types for botht he tiles and the map data, allowing me to combine information. Is this more efficent/faster than using arrays? Or am I better off with separate collison maps/tiles? b) I wish to implement a Zoom function, allowing the user to Zoom out from their map (probably -2x, -4x, and -8x) - is there a graceful way of doing this? |
| ||
What kind of map? Tile based? 2D? 3D? |
| ||
a) also consider banks .. (but then again, I'm the banktype :) b) .. in Blitzplus it would be somewhat easier by having scalable canvasses .. but I assume you want blitz2d/3d :) So, dunno! |
| ||
It's a 2D map editor written in Blitz+ - at the moment I'm using arrays to store the maps, with tiles imported as a strip of images in a BMP... |
| ||
Well then just create an array of types... |
| ||
I guess for your average 2d tilemapped game an array is safe enough, and by far the easiest format to parse at run time when you are moving around/rendering the map. If the maps were *huge* with only a limited amount of the 'grid' populated with tiles then I guess you could look for a more optimal solution but I serious doubt that it would be a problem. Tn real terms the memory taken up storing a 2d map in an array is tiny compared to other resources such as graphics and samples. |
| ||
Ello Rik :) I guess I'm just trying to refine the way I code, make things a little more efficient. I've seen a few editors which use Types for each tile and so forth - I just assumed it was a more efficient way of doing things. I guess the format isn't that crucial - I can always put in export options to suit any requirement - but I get paranoid that my code is sloppy... :/ |
| ||
You don't even need to make a 2D tile editor. Just use one of the many available ones. Here's a good one: www.blitzbase.de/_mapeditor/ |
| ||
>> You don't even need to make a 2D tile editor. You're kind of missing the point - why should anyone make a platform game when there are dozens out there already? There are a number of reasons I chose to write my editor: a) good for learning new techniques b) useful to be able to change the way an editor exports data or add new features c) I need an editor that will integrate with my game so I can make changes in real time. So... back on topic... ;) |
| ||
As for me, I tend to favor the method that makes it easiest for the programmer. I really like types, so I make liberal use of them. Sometimes I use arrays of types, so that they can be indexed directly, but I don't often need to with the stuff I do; it's just as well to do an O(n/2) search through the list of types. I suggest trying both (or all three, if you want to take CS_TBL's advice). Most likely, you'll probably end up with a nice mix. And you certainly will learn the differences, pros/cons, etc, which is a goal of yours, unless I'm mistaken. As for the zoom thing, there is a graceful way. Basically, just resize the canvas. Check out this small example: Global w=CreateWindow("Canvas Resize / Zoom", 200, 200, 400, 400, 0, 3) Global c=CreateCanvas(0,0,ClientWidth(w),ClientHeight(w),w) CreateTimer(60) SetBuffer(CanvasBuffer(c)) Notify "Press mouse buttons to zoom in/out" Repeat Select WaitEvent() Case $803 : End Case $201 If EventData() = 1 Then zoom = zoom + 50 Else zoom = zoom - 50 If zoom < -150 Then zoom = -150 ; don't get too small EndIf SetGadgetShape(c,0-zoom,0-zoom,400+zoom*2,400+zoom*2) Case $4001 Render() End Select Forever Function Render() ;Cls ;if you want Color Rand(256), Rand(256), Rand(256) Rect(Rand(ClientWidth(c)), Rand(ClientHeight(c)), Rand(10), Rand(10), True) FlipCanvas(c) End Function |
| ||
Cheers Soja :) Back on the subject of Arrays and Types: in my editor, I wish to include a library of commonly-used brushes. Each brush is an array, and I want to use an index to access the relevant brush. Is it possible to have an array of arrays, or is this where Types come to the fore? |
| ||
An array of arrays is a multi-dimensional array. Dim a(100) Dim a(100, 100) Dim a(100, 100, 100) Dim a(100, 100, 100, 100) Whatever you want. I started a programming tutorial a while back (but didn't get very far). However, it just so happened that I started writing about arrays and types: http://myweb.arvig.net/rwolbeck1/programmingtutorial/reference/arrays.htm Here is some text on multi-dimensional arrays from the tutorial: Think of your array as a chess board. dim chess$(7,7) will give you 0-7 across and 0-7 down (64 square in total). So you can reference a point and see what's there or set what's there. chess$(5,5) = "Black Knight" chess$(1,2) = "White Queen" print chess$(3,3) Then you can take it even further and stack several chess boards on top of one another. dim chess$(7,7,2) This has stacked 3 chess boards on top on each other. You can now reference any squre on any board. This sets position 5,2 on chess board 1 chess$(5,2,1) = "White Bishop" print chess$(5,2,1) Sets position 2,1 on chess board 0... chess$(2,1,0) = "Black Pawn" You ready to take it even further... Well, lets have our stacked chess boards spanning across different rooms... dim chess$(7,7,2,9) You getting the idea? We now have 10 (0-9) rooms we are playing our 3 stacked chess games in. We can reference any square on any chess board in any room... chess$(5,1,2,7) = "Black Rook" So, in room 7, on board 2, at position 5,1 on that board there is now a black rook... Expand it further... Lets add any building... dim chess$(7,7,2,9,4) we now have x,y on the board, board number, room number, and building number which we can instantly reference... chess$(1,2,2,8,3) = "White Pawn" So the piece at 1,2 on board 2 in room 8 in building 3 is a white pawn. |
| ||
Cheers WolRon, that's a very nice explanation :) However, the problem still remains - what if I want to change the size of a particular element? The chessboard example assumes that all of the boards are the same size, whereas I need to have ones that can change size. I've been struggling with this for a couple of hours but can't find a way around it without using Types... |
| ||
Dim your array again to the size you want.. (note: the original contents will be lost) What you could consider: make a bank of banks! Each bankhandle costs you 4 bytes (1 int) .. if you create a bank of 40 bytes, then you can store 10 bankhandles in it.. each bankhandle is ofcourse a seperate bank of ANY size. You can easily resize a bank using ResizeBank and the contents wont get lost then .. But again, as I'm the banktype, I'm not exactly neutral in this advice :) |
| ||
Blimey - I never even knew Banks existed (someone somewhere take note and provide some comprehensive Blitz docs...!). So how do Banks work? Presumably I just access them like arrays? |
| ||
Ah, just found a tutorial by Krylar... :) |
| ||
Once you start working with banks, you'll want to use this for sure! http://www.blitzbasic.co.nz/Community/posts.php?topic=29266 (don't forget to include that minor SetCanvas function) |
| ||
Arrays are wastefull for a tile map where you may have very little data in most tiles, so types can help a good bit there. Also I find type much easier to use in a tile map, because it makes it alot easier to add new data to existing data without the need to x to the power of n the entire array. Types are plenty fast enough and the for loops on types make itterating through them a snap. I created a editor game map engine that supported unlimitted layers, in the game I was working on I used 10. I could do this because unlike DIM I did not need to allocate all that memory for unused tile positions. Im fairly sure I posted it to Blitz Coder at some time. It was over a year ago. So IMHO you should go types over arrays, unless the map is very simple and will not change much. |
| ||
Wolron, I wrote that... It's nice to see you're taking credit for something you didn't write. http://www.blitzbasic.com/Community/posts.php?topic=35512#388017 |
| ||
Umm, I didn't take credit for it. Here is some text on multi-dimensional arrays from the tutorial: Nowhere here does it say that I wrote it. |
| ||
I started a programming tutorial a while back (but didn't get very far). However, it just so happened that I started writing about arrays and types: "I started writing about arrays and types"That sounds like you wrote it to me. |
| ||
"I started writing about arrays and types" which I did...but I didn't say that I wrote that particular text that I copied to the screen. If you would like me to remove it from my tutorial then I will. I just thought that you did a well enough job explaining it that it wasn't necessary for me to rewrite it. Nor did I feel that it was necessary to include a page of names of people that I might have borrowed text from - people who to most readers would probably just be nobodys anyways. However, if you would like me to still use it in my tutorial but give you credit somewhere, then I can do that too. |
| ||
I love arrays - they're cuter than types. |
| ||
So back on topic... how do i create a library of "brush" arrays? Use a type for each brush, then within the type itself include an array? |