Reflections
BlitzPlus Forums/BlitzPlus Programming/Reflections
| ||
It seems like I have been advancing pretty well with learning BlitzBasic within the last few months (from scratch). So far, it’s doing everything that I’ve wanted it to do. But, my thought is it seems like I’m doing many things the long way; for example, if one looks at my code below, I made the borders in my game out of actual images that I made with PAINT, and uploaded them. It seems like making those borders take forever; it took a day to make those. Does it usually take that long? I’m making and organizing the code in such a way that makes sense to me (simply because I’m a beginner). It seems like the code that I put together doesn’t look like everybody else code, but looks like maybe a longer route to go. Thus, I was wondering what are some thoughts on this? Things still seem to be going pretty good even though I’ve been doing it my way. Graphics 1600,1000 ;************************************************************888 ;Load Visual Images HENRY = LoadAnimImage ("Move2.PNG",400,370,0,13) BACKGROUND = LoadImage ("RoomWithNoDoorsOpened.png") ;*************************************************************888 ;Load Game Boundries HENRYUPCLUTCH = LoadImage ("Henry'sUpClutch.png") HENRYDOWNCLUTCH = LoadImage ("Henry'sDownClutch.png") HENRYRIGHTCLUTCH = LoadImage ("Henry's Right Clutch.png") HENRYLEFTCLUTCH = LoadImage ("Henry's LeftClutch.png") UPLIMIT = LoadImage ("Uplimit.png") UPOPENDOORCLUTCH = LoadImage ("Upopendoorclutch.png") GOINDOOR = LoadImage ("Leftlimit.png") LEFTLEFTLIMIT = LoadImage ("LeftLeftLimit.png") GOINSIDECLUTCH = LoadImage ("Goinsideclutch.png") UPGOINSIDECLUTCH = LoadImage ("Upgoinsideclutch.png") ;*************************************************************888 ;Miscellaneous Loads MUSIC_FOR_SCENE_1 = LoadSound ("Bells and Whistles.wav") ;*************************************************************888 ;Types to Each Character Type HENRY Field x,y Field frame End Type Type BACKGROUND Field x,y Field Image End Type Type HENRYUPCLUTCH Field x,y End Type Type HENRYDOWNCLUTCH Field x,y End Type Type HENRYRIGHTCLUTCH Field x,y End Type Type HENRYLEFTCLUTCH Field x,y End Type Type UPLIMIT Field x,y End Type Type GOINDOOR Field x,y End Type Type LEFTLEFTLIMIT Field x,y End Type Type UPOPENDOORCLUTCH Field x,y End Type Type GOINSIDECLUTCH Field x,y End Type Type UPGOINSIDECLUTCH Field x,y End Type ;********************************************************************************* ;Set Character Variables H.HENRY = New HENRY H\X = 585 H\Y = 400 H\frame = 0 ;Instead of Henry actually colliding with certain objects, this invisible object remains ABOVE Henry and is used to ;make it seem like Henry is actually colliding with an object HCU.HENRYUPCLUTCH = New HENRYUPCLUTCH HCU\X = 390 HCU\Y = 160 ;This invisible object remains BELOW HENRY and is used to ;make it seem like Henry is actually colliding with an object HDU.HENRYDOWNCLUTCH = New HENRYDOWNCLUTCH HDU\X = 390 HDU\Y = 460 ;This invisible object remains to the RIGHT of HENRY and is used to ;make it seem like Henry is actually colliding with an object HDR.HENRYRIGHTCLUTCH = New HENRYRIGHTCLUTCH HDR\X = 300 HDR\Y = 300 ;This invisible object remains to the LEFT of HENRY and is used to ;make it seem like Henry is actually colliding with an object HDL.HENRYLEFTCLUTCH = New HENRYLEFTCLUTCH HDL\X = 500 HDL\Y = 290 ;This invisible border keeps HENRY on the ground when the invisible HENRYUPCLUTCH character collides with it. Otherwise, ;when the "up" arrow key is pressed, HENRY will go up without limit UPL.UPLIMIT = New UPLIMIT UPL\X = 430 UPL\Y = 105 ;This invisible border switches the next scene and changes the background (That is, because the HENRYLEFTCLUTCH collides with ;this border, it gives the illusion that HENRY actually went inside the door) GID.GOINDOOR = New GOINDOOR GID\X = -120 GID\Y = 180 ;If the HENRYLEFTCLUTCH character (the invisible border that stays at that stays at HENRY's left) collides with LEFTLIMIT, it ;keeps HENRY from going too far off the screen to the left. Otherwise, HENRY will go to the left without limit. LLL.LEFTLEFTLIMIT = New LEFTLEFTLIMIT LLL\X = -230 LLL\Y = 200 ;The BACKGROUND for the first scene b.BACKGROUND = New BACKGROUND b\x = -1100 b\y = 90 b\image = BACKGROUND ;This opens the door when HENRYUPCLUTCH collides with the UPLIMIT border UPODC.UPOPENDOORCLUTCH = New UPOPENDOORCLUTCH UPODC\X = 480 UPODC\Y = 110 ;When HENRYUPCLUTCH collides with this, then UPGIN.UPGOINSIDECLUTCH = New UPGOINSIDECLUTCH UPGIN\X = 480 UPGIN\Y = 85 GIN.GOINSIDECLUTCH = New GOINSIDECLUTCH GIN\X = -190 GIN\Y = 230 ;************************************************************************ ;Miscellaneous PlaySound MUSIC_FOR_SCENE_1 LoopSound MUSIC_FOR_SCENE_1 ;********************************************************************8888 While Not KeyDown (1) Cls ;When the right arrow key is pressed, it moves HENRY and his collision borders to the right (collision borders are ;the invisible borders that collide with other invisible borders to make changes in the environment, and keeps HENRY from ;going off screen, etc) If KeyDown(205) HCU\X = HCU\X + 3 HDU\X = HDU\X + 3 HDR\X = HDR\X + 3 HDL\X = HDL\X + 3 H\X = H\X + 3 h\frame = h\frame + 1 If h\frame > 2 Then h\frame = 0 EndIf EndIf ;When the left arrow key is pressed, it moves HENRY and his collision borders (described above) ;to the Left If KeyDown(203) HCU\X = HCU\X - 3 HDU\X = HDU\X - 3 HDR\X = HDR\X - 3 HDL\X = HDL\X - 3 H\X = H\X - 3 h\frame = h\frame + 1 If h\frame > 12 Then h\frame = 6 EndIf EndIf ;This moves HENRY and his invisible collision borders up If KeyDown (200) HCU\Y = HCU\Y - 3 HDU\Y = HDU\Y - 3 HDR\Y = HDR\Y - 3 HDL\Y = HDL\Y - 3 H\Y = H\Y - 3 EndIf ;This moves HENRY and his invisible collision borders down If KeyDown (208) HCU\Y = HCU\Y + 3 HDU\Y = HDU\Y + 3 HDR\Y = HDR\Y + 3 HDL\Y = HDL\Y + 3 H\Y = H\Y + 3 EndIf ;Tiles the background image TileImage (b\image,b\x,b\y) ;Draws Henry onto the screen DrawImage (HENRY,h\x,h\y) ;These DrawImage commands in this section below will actually be deleted when the game is finished. These are put here in ;for reference while I'm making the game so that I can see where the borders are. DrawImage(HENRYUPCLUTCH,HCU\X,HCU\Y) DrawImage (HENRYDOWNCLUTCH, HDU\X,HDU\Y) DrawImage (HENRYRIGHTCLUTCH,HDR\X,HDR\Y) DrawImage (HENRYLEFTCLUTCH,HDL\X,HDL\Y) DrawImage (UPLIMIT,UPL\X,UPL\Y) DrawImage (GOINDOOR,GID\X,GID\Y) DrawImage (LEFTLEFTLIMIT,LLL\X,LLL\Y) DrawImage (UPOPENDOORCLUTCH, UPODC\X,UPODC\Y) DrawImage (GOINSIDECLUTCH,GIN\X,GIN\Y) DrawImage (UPGOINSIDECLUTCH,UPGIN\X,UPGIN\Y) ;When HENRY's invisible clutch collides with the invisible UPLIMIT border, ;it'll open a door that I will eventually put into the game. If ImagesCollide (HENRYUPCLUTCH,HCU\X,HCU\Y,0,UPLIMIT,UPL\X,UPL\Y,0) Then h\y = 290 HCU\Y= 50 HDR\Y = 176 HDL\Y = 200 HDU\Y = 350 EndIf If ImagesCollide (HENRYRIGHTCLUTCH,HDR\X,HDR\Y,0, LEFTLEFTLIMIT,LLL\X,LLL\Y,0) Then h\x = 50 HDR\X = -225 HDL\X = -20 HCU\X = -150 HDU\X = -150 If KeyDown (205) HCU\X = HCU\X + 3 HDU\X = HDU\X + 3 HDR\X = HDR\X + 3 HDL\X = HDL\X + 3 H\X = H\X + 3 EndIf EndIf Flip Wend |
| ||
You could greatly reduce the size and complexity of your code by simply using less types and type instances. For example, you have a new type and a instance of that type for each clutch that Henry has. However, you know that these places will always be the same in comparison to the others; every time you move Henry you increment or decrement the values by the same amount. Another issue you'll run into is that when you remove those draw images, ImagesCollide will never return true because they are not drawn. A better solution would be to use bounding boxes to determine your collisions. Basically, rather than check if the actual images are colliding, you assign a box around each of your objects and see if the boxes overlap. Although this is not a perfect collision, for most implementations of games it is close enough that it will work. Lets have an example. Say your Henry image is 50x100 pixels, and your door is 200x200 pixels. We'll assume that H\x and H\y are Henry's x and y coordinates, and D\x and D\y are the doors coordinates. Both will correspond to the top left corner of the image, as usual. Now we draw an imaginary box around the images, one being 50x100 and the other 200x200. To calculate if these boxes overlap, we want to see if: 1. Henry's X is <= than the Door's X plus its width (its right edge) 2. Henry's X plus his width (the right edge) is >= the Door's X 3. Henry's Y is <= than the Door's Y plus its height (its bottom edge) 4. Henry's Y plus his height (the bottom edge) is >= the Door's Y The code would look something like this: If h\x<=d\x+200 And h\x+50>=d\x And h\y<=d\y+200 And h\y+100>=d\y ;Collision! EndIf Draw some boxes in paint and look at the conditions. You'll notice that all the colliding ones meet this, whereas boxes that do not overlap fail at least one of the conditions. It's certainly an easier thing to visualize than to write about. Its really late so I hope that is all correct, and I hope it makes a little sense. Basically, simplify collisions, and you simplify your code immensely. |
| ||
Sauer, Thanks, that way worked and and I think that way is a better way than using the ImageCollide command and it seems like a way to control collisions better too. I tried what you said with an example code that's below that is set up like this: HENRY = LoadImage ("Eatum.png") DOOR = LoadImage("Door.png") Type HENRY Field x,y End Type Type DOOR Field x,y End Type h.HENRY = New HENRY h\x = 150 h\y = 300 d.DOOR = New DOOR d\x = 300 d\y = 300 While Not KeyDown (1) Cls If KeyDown (205) Then h\x = h\x + 3 EndIf If KeyDown (203) Then h\x = h\x - 3 EndIf If KeyDown (200) Then h\y = h\y - 3 EndIf If KeyDown (208) Then h\y = h\y + 3 EndIf DrawImage (HENRY,h\x,h\y) DrawImage (DOOR,d\x,d\y) If h\x<=d\x + 100 And h\x+100>=d\x And h\y <=d\y+150 And h\y+100>=d\y Then Text 100,100, "You made it in" ;Collision! EndIf Flip Wend It might take some getting used to since it's an invisible rectangle, but it's still pretty good. |