Level editor, array out of range....

Started by
6 comments, last by shadowisadog 18 years, 3 months ago
OKay so I'm making a level editor for a 2d side scroller. I have it so if you click off the map area it will scroll in the direction of the side you clicked on. My problem is if you scroll to far up or to the right my map array that stores what tile is what goes out of range. I was able to fix the problem for when it scrolled to far down or left, but the solution doesn't seem to be the same for up and down. Heres the code, it in turing so it might not loook familir import GUI var win := Window.Open ("graphics:max;max,nobuttonbar") View.Set ("offscreenonly") const MAPTILEX := 100 %amount of x tiles in the entire map const MAPTILEY := 25 %amount of y tiles in the entire map const TILESIZEX := 32 %Size of x tile in pixels const TILESIZEY := 32 %Size of x tile in pixels const SCREENHIEGHT := 14 %number of tile up on screen at once const SCREENWIDTH := 22 %number of tile across on screen at once var map : array 1 .. MAPTILEX of array 1 .. MAPTILEY of int %saves what tile is in each location var tile, tile1 : int := 0 %current tile being drawn var mouseX, mouseY, mouseButton : int var disX, disY : int := 1 % This is the displacement for when the world is scrolled over tile1 := Pic.FileNew ("tile.bmp") proc Initialize_Map for x : 1 .. MAPTILEX %Goes through every tile on the x for y : 1 .. MAPTILEY %Goes through every tule on the y map (x) (y) := 0 %assigns them all to 0 (no tile) end for end for end Initialize_Map proc Draw_Map for x : 1 .. SCREENWIDTH %Goes through every tile on the x on the screen for y : 1 .. SCREENHIEGHT %Goes through every tile on the y on the screen tile := map (x + disX) (y + disY) %Makes current tile being drawn equal to corresponding tile in map ****THIS IS THE LINE WHERE THE ARRAY GOES OUT OF RANGE**** if tile > 0 then %Skips drawing if the tile is not walkable Pic.Draw (tile, (x * TILESIZEX) + 12, y * TILESIZEY + 12, picCopy) %draws tile end if Draw.Box (TILESIZEX + 12, TILESIZEY + 12, (TILESIZEX * (SCREENWIDTH + 1)) + 12, (TILESIZEY * (SCREENHIEGHT + 1)) + 12, brightred) end for end for end Draw_Map proc Place_Tiles Mouse.Where (mouseX, mouseY, mouseButton) if mouseButton > 0 then if mouseX > (TILESIZEX * (SCREENWIDTH + 1) + 12) then %If you click off the map and to the right the screen will scroll that way disX += 1 elsif mouseX < (TILESIZEX + 12) then %If you click off the map and to the left the screen will scroll that way disX -= 1 elsif mouseY > (TILESIZEY * (SCREENHIEGHT + 1) + 12) then %If you click off the map and to the top the screen will scroll that way disY += 1 elsif mouseY < (TILESIZEY + 12) then %If you click off the map and to the bottom the screen will scroll that way disY -= 1 else %if you click on the map the tile you click on wil be changed to walkable map ((round (((mouseX + 12) - TILESIZEX) / TILESIZEX)) + disX) ((round (((mouseY + 12) - TILESIZEY) / TILESIZEY)) + disY) := tile1 end if end if %This makes sure the array doesn't go out of range, if it does it sets it back to what it was before if disY < 1 then disY := 1 elsif disY > MAPTILEY then disY := MAPTILEY elsif disX < 1 then disX := 1 elsif disX > MAPTILEX then disX := MAPTILEX end if end Place_Tiles Initialize_Map loop cls GUI.SetBackgroundColor (black) Place_Tiles Draw_Map View.Update delay (0) end loop So any ideas, or questions about the code? [Edited by - JavaMava on January 19, 2006 4:13:13 PM]
Advertisement
Quote:Original post by JavaMava
%This makes sure the array doesn't go out of range, if it does it sets it back to what it was before
if disY < 1 then
disY := 1
elsif disY > MAPTILEY then
disY := MAPTILEY
elsif disX < 1 then
disX := 1
elsif disX > MAPTILEX then
disX := MAPTILEX
end if

I quickly scanned through. That doesn't look right to me.
Perhaps:
    %This makes sure the array doesn't go out of range, if it does it sets it back to what it was before    if disY < 1 then        disY := 1    elsif disY > MAPTILEY then        disY := MAPTILEY    if disX < 1 then        disX := 1    elsif disX > MAPTILEX then        disX := MAPTILEX    end if
I must be blind, but I swear the problem you pointed out and your solution to it are identicle.....
Note the "if" vs "elsif" in the third conditional.
Ahh sorry.

Anyways I just tried it and same problem as before. ANy ideas why it would work for left and bottome, but not top and right?
I forgot to tell you guuys where it goes out of range, maybe this will help...

tile := map (x + disX) (y + disY) %Makes current tile being drawn equal to corresponding tile in map ****THIS IS THE LINE WHERE THE ARRAY GOES OUT OF RANGE****
I figured it out, it was my logic was wrong.

if disY < 1 then
disY := 1
elsif disY > (MAPTILEY - SCREENHIEGHT) then
disY := (MAPTILEY - SCREENHIEGHT)
end if

if disX < 1 then
disX := 1
elsif disX > (MAPTILEX - SCREENWIDTH) then
disX := (MAPTILEX - SCREENWIDTH)
end if

is the proper way to do it, hahahaha.
why not just do min(max(val,minval),maxval)...... ;).

This topic is closed to new replies.

Advertisement