   Blitzmax for somebody new to programming?
  Hey guys, I guess the title says it all.  I am new to programming, I fancy getting into making some small little games, and you never know in a few years time making some little Indie titles, nothing too crazy.I have a little experience in programming, I know a little syntax, and the idea behind game loops, classess etc to a basic level. I purchased Blitzmax but I really get the idea that this language is for people who have already spent a few years coding with more traditional languages, and choose Blitz as they can appreciate its time saving mechanics.Would this be a fair estimation?  I feel like if I spend my time learning Blitz, then I am not really learning core programming techniques, instead learning how to manipulate the library.  One example I ran into was trying to receive input from the user, blitz has no such cin >> statement, and I felt like everything was an uphill struggle.  Would I be better off getting my feet wet with something like Python->pygame?  How does pygame present itself to someone who would be new to programming?  Or maybe something like C-Allegro?Thanks guys.<Sorry for my terrible and rushed grammar.  Trying to get the post in before my net disconnects>   
  I haven't had any experience with Blitzmax but back when I began programming I got a book on a version of the Blitz language and really disliked it (and I was a beginner back then).I personally would suggest XNA Game Studio by Microsoft.  XNA is a wrapper over the DirectX framework to heavily simplify game development.  It utilizes the C# language so you would have to learn that, but you mentioned wanting to learn "core programming techniques" and you can do that with something like C#.  Take some time learning C# and then move into XNA slowly, making sure you understand what you're writing.  You can find XNA's website here.Whichever language/library you choose I would suggest learning the core language first.  Game development is typically a difficult programming field (lots and lots of techniques) and even though there are loads of tools out there created to make creating games easy, most will require some basic knowledge of core programming techniques.   ;Quote:Original post by KanchoI have a little experience in programming, I know a little syntax, and the idea behind game loops, classess etc to a basic level. I purchased Blitzmax but I really get the idea that this language is for people who have already spent a few years coding with more traditional languages, and choose Blitz as they can appreciate its time saving mechanics. Would this be a fair estimation?Not really, no. There are users of all skillsets using BlitzMax. Some are experienced, some are beginners. It's a hell of a lot less intimidating, obscure and labyrinthine than C++, which is good for beginners. It's true that - much like C# and Java - it's design emphasis is on making coding fun and quicker than certain other languages, but it's certainly not true that you need to be an experienced programmer to appreciate any of that.Quote:Original post by KanchoOne example I ran into was trying to receive input from the user, blitz has no such cin >> statement, and I felt like everything was an uphill struggle. That's an example of the precise opposite of what you claim. cin isn't part of the C++ language, it's part of the iostream library. Also, BlitzMax does have such a command. It's called Input, and it's well documented in the help files.Quote:Original post by KanchoI feel like if I spend my time learning Blitz, then I am not really learning core programming techniques, instead learning how to manipulate the library.  Would I be better off getting my feet wet with something like Python->pygame? Or maybe something like C-Allegro?Well not if you're intent on "learning core programming techniques" and avoiding "learning how to manipulate a library" since PyGame and Allegro are both libraries. Frankly, I'm not sure I see the distinction. There's not much you can do with any programming language without learning to manipulate libraries, particularly for game development. If you were learning C++, I'd expect that learning about the STL (Standard Template Library) would be a big part of that.Not to appear discouraging, but if you're finding BlitzMax too difficult, I can't see you having an easier time with Python or C. It sounds to me as though your real problem is that you want to be rushing through the basics far quicker than anyone really can when they're starting out, and you're getting frustrated at the lack of progress. Lack of progress is normal when you're learning, as is getting frustrated by it. You really have two options. Either stick with it and keep going until you get there, or find something with a completely different paradigm. Switching languages won't help you at this stage, it'll just make things even slower as you have to start all over again. Not to mention unlearning some of the things you just learned. If you want to switch paradigms, then consider something like GameMaker, Flash or MultiMedia Fusion, where you can get stuff up and on screen without actually having to learn much programming. Then you can come back to BlitzMax, C or Python when you've picked up some experience with that.   ;  I use Blitz 3D at the moment and while great for prototyping and making simple/dirty games it's not something I'd want to keep doing for much longer.That said I migrated from there to some basic C++ (shown below although I'd say its some pretty poor quality code and it's for a cross platform system) in about a week or two, once you've learned one language others come pretty quickly although I've forgotten much of it almost as quickly.It's a good language to start with though if you're interested with games design as you can really get to grips with algorithms such as game physics pretty quickly.#include <KD/kd.h>#include <KD/KHR_float64.h>#include <vector>#include <algorithm>#include <GLES/gl.h>EGLDisplay display = EGL_NO_DISPLAY;EGLSurface windowSurface = EGL_NO_SURFACE;EGLContext context = EGL_NO_CONTEXT;static KDboolean setupEGL();static void releaseEGL();class Plane {public:void UpdatePlane(); //Updates variablesfloat worldX, worldY; //Position of plane on a 'world' scale rather than on screen, 1 unit = 1mfloat bearing; //Y axis is effectively Northfloat velocity; // 1 unit is 30m/s (108kph) KDboolean firing;KDust waitFireTimer;/* Notes: * A Spitfire MkV's max speed is around 600kph * A good cruising speed for a sea plane would be around 400kph*/};void Plane::UpdatePlane() {//Update the Plane's positionfloat plusX, plusY;plusX = velocity * kdSinKHR(bearing);plusY = velocity * kdCosKHR(bearing);worldX += plusX;worldY += plusY;if (firing == KD_TRUE) {if (kdGetTimeUST() > waitFireTimer + 1000000000/5) {kdLogMessage("Fired. ");waitFireTimer = kdGetTimeUST();}}}class PlayerPlane : public Plane {public:PlayerPlane(float x, float y, float a);};PlayerPlane::PlayerPlane(float x, float y, float a) {this->worldX = x;this->worldY = y;this->bearing = a;this->velocity = 4;this->firing = KD_TRUE;this->waitFireTimer = kdGetTimeUST();}class EnemyPlane : public Plane {public:EnemyPlane(float x, float y, float a, float v);//Most of this is AI stuff};EnemyPlane::EnemyPlane(float x, float y, float a, float v) {this->worldX = x;this->worldY = y;this->bearing = a;this->velocity = v;}class Bullet {public:void UpdateBullet(); //Updates variablesBullet(float x, float y, float a, float v);float worldX, worldY; //Position of plane on a 'world' scale rather than on screenfloat bearing; //Y axis is effectively Northfloat velocity; };Bullet::Bullet (float x, float y, float a, float v) {this->worldX = x;this->worldY = y;this->bearing = a;this->velocity = v;}void Bullet::UpdateBullet() {//Update theBullet's positionfloat plusX, plusY;plusX = velocity * kdSinKHR(bearing);plusY = velocity * kdCosKHR(bearing);worldX += plusX;worldY += plusY;}class Factory{private:static std::vector<Bullet *> allBullets;static std::vector<Plane *> allPlanes;public:static Bullet *createBullet(float x, float y, float a, float v){Bullet *bullet = new Bullet(x, y, a, v);allBullets.push_back(bullet);return bullet;}  static EnemyPlane *createEnemyPlane(float x, float y, float a, float v){EnemyPlane *plane = new EnemyPlane(x, y, a, v);allPlanes.push_back(plane);return plane;}static PlayerPlane *createPlayer(float x, float y, float a){PlayerPlane *plane = new PlayerPlane(x, y, a);allPlanes.push_back(plane);return plane;}static void forEachBullet(void (*f)(Bullet *p)){std::for_each(allBullets.begin(), allBullets.end(), f);}static void forEachPlane(void (*f)(Plane *p)){std::for_each(allPlanes.begin(), allPlanes.end(), f);}};std::vector<Plane *> Factory::allPlanes;std::vector<Bullet *> Factory::allBullets;static KDTimer *timer;static void quit_callback(const KDEvent *e);static void timer_callback(const KDEvent *e);static void input_callback(const KDEvent *e);static void updateAllPlanes(Plane *p);static void updateAllBullets(Bullet *p);static void *gametimer;#define NANO_SECS_PER_SECOND 1000000000;static KDboolean keys[5];void *player;#define KEY_FIRE 0;// Main Program// ##################################################################KDint kdMain(KDint argc, const KDchar *const *argv){player = Factory::createPlayer(0,0,0);setupEGL();const KDEvent *e;/* set up a timer to redraw 30 times a second */KDint64 interval = (KDint64) 1000000000 / 30; timer = kdSetTimer(interval, KD_TIMER_PERIODIC_AVERAGE, gametimer);/* main event loop. */if (timer != KD_NULL) {/* Initialise Timer, Quit and Input callbacks. */kdInstallCallback(timer_callback, KD_EVENT_TIMER, gametimer);kdInstallCallback(quit_callback,  KD_EVENT_QUIT,  KD_NULL);kdInstallCallback(input_callback, KD_EVENT_INPUT, KD_NULL);while ((e = kdWaitEvent(-1))) {kdDefaultEvent(e);}}/* Deinitialise context */releaseEGL();return 0;}Unfortunately the OOP in Blitz is very simple, effectively a stack of structs, i.e each class only has variables attached to it, no operations, and no sub-classesAlso the same game in B3D (note C++ version was no-where near completed and I cut half of it out while this is the full game) And this is cruddy code, don't copy it; I managed to get a memory leak in Blitz somehow.Global GfxW = 640Global GfxH = 480Include "Menu.bb".NewGameGraphics GfxW,GfxH,0,1SetBuffer BackBuffer()ClsColor 0,67,171AutoMidHandle TrueSeedRnd MilliSecs()Type PlayerField X#,Y#,A,F#,Z#,H,LEnd TypeType BulletField X#,Y#,A,S,LEnd TypeType CloudField X#,Y#,SEnd TypeType EnemyField X#,Y#,A,R,Z#End TypeType ExplosionField X#,Y#,FEnd TypeType CarrierField X#,Y#,A,P,S,R,HEnd TypeConst Rotations = 90Global ShellExplosion = LoadImage ("Images/ShellFire.bmp")Global LandImg = LoadImage ("Images/Land.bmp")Global PlayerImg = LoadImage ("Images/Plane.bmp")Global EnemyImg = LoadImage ("Images/Enemy.bmp")Global ExplosionImg = LoadAnimImage("Images/Explosion.bmp",32,32,0,6)Global ShipImg = LoadImage ("Images/Ship.bmp")Global CarrierImg = LoadImage ("Images/Carrier.bmp")Global ShadowImg = LoadImage ("Images/Shadow.bmp")Global WaterTile = LoadImage("Images/Water.bmp")Global FuelWord = LoadImage ("Images/Fuel.bmp")Global AirspeedWord = LoadImage ("Images/Airspeed.bmp")Global SpeedWord = LoadImage ("Images/KPH.bmp")Global AltitudeWord = LoadImage ("Images/Altitude.bmp")Global HeightWord = LoadImage ("Images/Ft.bmp")Global CloudI = LoadImage ("Images/2x2 Cloud.bmp")Global CloudII = LoadImage ("Images/3x3 Cloud.bmp")Global CloudIII = LoadImage ("Images/4x4 Cloud.bmp")Global ArrowImg = LoadImage ("Images/Arrow.bmp")Global EnemyArrowImg = LoadImage ("Images/EnemyArrow.bmp")Global AllyArrowImg = LoadImage ("Images/AllyArrow.bmp")Global EnemyCarrierArrowImg = LoadImage ("Images/EnemyCarrierArrow.bmp")Global AllyCarrierArrowImg = LoadImage ("Images/AllyCarrierArrow.bmp")Global HUDImg = LoadImage ("Images/HUD.bmp")Global HUDPlaneImg = LoadImage ("Images/HUDPlane.bmp")Global PlayerDamageImg = LoadAnimImage ("Images/Damage.bmp",32,32,0,6)Global BulletImg = LoadImage("Images/Bullet.bmp")Global Number = LoadAnimImage ("Images/Numbers.bmp",10,13,0,10)Global FuelBarHolderImg = LoadImage("Images/FuelBar.bmp")Global FuelBarImg = LoadImage("Images/FuelRemaining.bmp")Global Propellor = LoadSound("Sound/Prop.wav")Global PlayerShellSound = LoadSound("Sound/Shot.wav")Global EnemyShellSound = LoadSound("Sound/Shot.wav")Global ExplosionSound = LoadSound("Sound/Explosion.wav")MaskImage ShellExplosion,0,67,171MaskImage LandImg,0,67,171MaskImage PlayerImg,0,67,171MaskImage EnemyImg,0,67,171MaskImage ShipImg,0,67,171MaskImage CarrierImg,0,67,171MaskImage ExplosionImg,0,67,171MaskImage ShadowImg,0,67,171MaskImage CloudI,0,67,171MaskImage CloudII,0,67,171MaskImage CloudIII,0,67,171MaskImage ArrowImg,0,67,171MaskImage EnemyArrowImg,0,67,171MaskImage AllyArrowImg,0,67,171MaskImage EnemyCarrierArrowImg,0,67,171MaskImage AllyCarrierArrowImg,0,67,171MaskImage HUDImg,0,67,171MaskImage HUDPlaneImg,0,67,171MaskImage PlayerDamageImg,0,67,171MaskImage BulletImg,0,67,171ResizeImage ShellExplosion,8 * GfxW / 1024,8 * GfxH / 768ResizeImage LandImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage PlayerImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage EnemyImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage ShipImg,32 * GfxW / 1024,192 * GfxH / 768ResizeImage CarrierImg,64 * GfxW / 1024,192 * GfxH / 768ResizeImage ExplosionImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage ShadowImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage CloudI,64 * GfxW / 1024,64 * GfxH / 768ResizeImage CloudII,96 * GfxW / 1024,96 * GfxH / 768ResizeImage CloudIII,128 * GfxW / 1024,128 * GfxH / 768ResizeImage ArrowImg,7 * GfxW / 1024,12 * GfxH / 768ResizeImage EnemyArrowImg,7 * GfxW / 1024,12 * GfxH / 768ResizeImage AllyArrowImg,7 * GfxW / 1024,12 * GfxH / 768ResizeImage EnemyCarrierArrowImg,7 * GfxW / 1024,12 * GfxH / 768ResizeImage AllyCarrierArrowImg,7 * GfxW / 1024,12 * GfxH / 768ResizeImage HUDImg,102 * GfxW / 1024,102 * GfxH / 768ResizeImage HUDPlaneImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage PlayerDamageImg,32 * GfxW / 1024,32 * GfxH / 768ResizeImage BulletImg,3 * GfxW / 1024,3 * GfxH / 768SoundVolume Propellor,0.5SoundVolume PlayerShellSound,0SoundVolume EnemyShellSound,0SoundVolume ExplosionSound,1Dim PlayerAngle(Rotations)PlayerRotate(Rotations)Dim EnemyAngle(Rotations)EnemyRotate(Rotations);Dim TurretAngle(Rotations);TurretRotate(Rotations)Dim ShadowAngle(Rotations)ShadowRotate(Rotations)Dim HUDPlaneAngle(Rotations)HUDPlaneRotate(Rotations)InitiateGame()Font = LoadFont("Arial",12 * GfxW / 640,0,0,0)SetFont FontWhile Not KeyDown(88)ClsUpdateBackground()UpdateShadows()UpdateCarriers()UpdateBullets()UpdateExplosions()UpdateEnemys()UpdatePlayer()UpdateHUD()UpdateClouds()UpdateStats()UpdateCollisions()Blah()FlipWendEnd.ExitGameEndFunction UpdatePlayer()For Player.Player = Each PlayerIf KeyDown(203) Then Player\A = Player\A - 1If KeyDown(205) Then Player\A = Player\A + 1If Player\A >= Rotations Then Player\A = 0If Player\A < 0 Then Player\A = Rotations - 1If KeyDown(200)Player\Z = Player\Z + 0.11ElsePlayer\Z = Player\Z - 0.11EndIfIf KeyDown(208)Player\Z = Player\Z - 0.5EndIfIf Player\Z < 2.5 Then Player\Z = 2.5If Player\Z > 7.5 Then Player\Z = 7.5Player\X = Player\X + Player\Z * Sin(Player\A * 360 / Rotations) * GfxW / 1024Player\Y = Player\Y - Player\Z * Cos(Player\A * 360 / Rotations) * GfxH / 768Player\F = Player\F - (Player\Z/750)SoundPitch Propellor,1000 * Player\Z + 1PlaySound PropellorDrawImage PlayerAngle(Player\A),GfxW / 2,GfxH / 2If KeyHit(57)Bullet.Bullet = New BulletBullet\A = Player\A : Bullet\S = 1Bullet\X = Player\X + GfxW / 2 : Bullet\Y = Player\Y + GfxH / 2EndIfNextEnd FunctionFunction UpdateEnemys()For Enemy.Enemy = Each EnemyFor Player.Player = Each PlayerDfX# = (Enemy\X - Player\X) - GfxW / 2 : DfY# = (Enemy\Y - Player\Y) - GfxH / 2Angle# = ATan2(DfX,-DfY) + 90NextIf Enemy\A < (Angle + 90)/4 Then Enemy\A = Enemy\A + 1If Enemy\A > (Angle + 90)/4 Then Enemy\A = Enemy\A - 1If Enemy\A >= Rotations Then Enemy\A = 0If Enemy\A < 0 Then Enemy\A = Rotations - 1If Enemy\Z < 2 Then Enemy\Z = 2If Enemy\Z > 5 Then Enemy\Z = 5Enemy\X = Enemy\X + Enemy\Z * Sin(Enemy\A * 360 / Rotations) * GfxW / 1024Enemy\Y = Enemy\Y - Enemy\Z * Cos(Enemy\A * 360 / Rotations) * GfxH / 768If MilliSecs() >= Enemy\R + 250Enemy\R = MilliSecs()Bullet.Bullet = New BulletBullet\A = Enemy\A : Bullet\S = 2 : Bullet\X = Enemy\X : Bullet\Y = Enemy\YFor Player.Player = Each PlayerNextEndIfFor Player.Player = Each PlayerDrawImage EnemyAngle(Enemy\A),Enemy\X - Player\X,Enemy\Y - Player\YNextNextEnd FunctionFunction UpdateBullets()For Bullet.Bullet = Each BulletBullet\X = Bullet\X + 10 * Sin(Bullet\A * 360 / Rotations) * GfxW / 1024Bullet\Y = Bullet\Y - 10 * Cos(Bullet\A * 360 / Rotations) * GfxH / 768Bullet\L = Bullet\L + 1For Player.Player = Each PlayerDrawImage BulletImg,Bullet\X - Player\X,Bullet\Y - Player\YIf Bullet\L >= 50DrawImage ShellExplosion,Bullet\X - Player\X,Bullet\Y - Player\YDfX# = (GfxW/2-(Bullet\X-Player\X)) : DfY# = (GfxH/2-(Bullet\Y-Player\Y))Hyp# = Sqr(DfX^2 + DfY^2) : SHyp# = Sqr((GfxW/2)^2 + (GfxH/2)^2) / 2If Not Bullet\S = 1 Then SoundVolume EnemyShellSound,1-1/(SHyp/Hyp)If Not Bullet\S = 1 Then PlaySound EnemyShellSoundIf Bullet\S = 1 Then SoundVolume PlayerShellSound,1-1/(SHyp/Hyp)If Bullet\S = 1 Then PlaySound PlayerShellSoundDelete BulletEndIfNextNextEnd FunctionFunction PlayerRotate(Degrees)For Frame = 0 To DegreesPlayerAngle(Frame) = CopyImage(PlayerImg)RotateImage PlayerAngle(Frame),Frame * 360 / DegreesNextEnd FunctionFunction EnemyRotate(Degrees)For Frame = 0 To DegreesEnemyAngle(Frame) = CopyImage(EnemyImg)RotateImage EnemyAngle(Frame),Frame * 360 / DegreesNextEnd FunctionFunction ShadowRotate(Degrees)For Frame = 0 To DegreesShadowAngle(Frame) = CopyImage(ShadowImg)RotateImage ShadowAngle(Frame),Frame * 360 / DegreesNextEnd FunctionFunction HUDPlaneRotate(Degrees)For Frame = 0 To DegreesHUDPlaneAngle(Frame) = CopyImage(HUDPlaneImg)RotateImage HUDPlaneAngle(Frame),Frame * 360 / DegreesNextEnd FunctionFunction UpdateBackground()For Player.Player = Each PlayerTileImage WaterTile,- Player\X,- Player\Y,0NextEnd FunctionFunction UpdateShadows()For Player.Player = Each PlayerFor Enemy.Enemy = Each EnemyDrawImage ShadowAngle(Enemy\A),Enemy\X+50*GfxW/1024-Player\X,Enemy\Y+75*GfxH/768-Player\YNextDrawImage ShadowAngle(Player\A),GfxW/2+50*GfxW/1024,GfxH/2+75*GfxH/768NextEnd FunctionFunction UpdateStats()For Player.Player = Each PlayerDrawImage FuelWord,25,10WriteNumber(Int(Player\F),55,10)DrawImage FuelBarHolderImg,105,27DrawImageRect FuelBarImg,105,27,0,0,2 * Player\F,10WriteNumber(Int(Player\Z*100),110,43) : DrawImage SpeedWord,155,43DrawImage AirspeedWord,50,43;WriteNumber(Player\L,110,60) : DrawImage HeightWord,155,60;DrawImage AltitudeWord,50,60;Color 100,75,50 : Rect 5,22,2 * Player\F,10NextEnd FunctionFunction UpdateHUD()For Player.Player = Each PlayerDrawImage HUDImg,GfxW-61*GfxW/1024,61*GfxH/768DrawImage HUDPlaneAngle(Player\A),GfxW-61*GfxW/1024,61*GfxH/768DrawImage PlayerDamageImg,GfxW-134*GfxW/1024,36*GfxH/768,Int(5 - (Player\L/2))Color 100,100,100Rect GfxW-161*GfxW/1024,10*GfxH/768,52*GfxW/1024,7*GfxH/768,0Color 50,50,50Rect GfxW-160*GfxW/1024,11*GfxH/768,50*GfxW/1024,5*GfxH/768Color 255-Player\L*25,Player\L*25,0Rect GfxW-160*GfxW/1024,11*GfxH/768,Player\L*5*GfxW/1024,5*GfxH/768For Enemy.Enemy = Each EnemyDfX# = GfxW / 2 - (Enemy\X - Player\X) : DfY# = GfxH / 2 - (Enemy\Y - Player\Y)Angle# = ATan2(DfX,-DfY) + 90Pointer = CopyImage(EnemyArrowImg) : RotateImage Pointer,Angle + 90DrawImage Pointer,GfxW-(61-Cos(Angle)*50)*GfxW/1024,(61+Sin(Angle)*50)*GfxH/768NextFor Carrier.Carrier = Each CarrierDfX# = GfxW / 2 - (Carrier\X - Player\X) : DfY# = GfxH / 2 - (Carrier\Y - Player\Y)Angle# = ATan2(DfX,-DfY) + 90If Not Carrier\S = 1 Then Pointer = CopyImage(EnemyCarrierArrowImg) If Carrier\S = 1 Then Pointer = CopyImage(AllyCarrierArrowImg) RotateImage Pointer,Angle + 90DrawImage Pointer,GfxW-(61-Cos(Angle)*50)*GfxW/1024,(61+Sin(Angle)*50)*GfxH/768NextNextEnd FunctionFunction WriteNumber(Num#,X,Y)NumStr$ = Num#For I = 0 To Len(NumStr) - 8DrawImage Number,X+10*I,Y,Int(Mid(NumStr,I + 1,1))NextEnd FunctionFunction UpdateClouds()For Cloud.Cloud = Each CloudFor Player.Player = Each PlayerIf Cloud\S = 2 Then DrawImage CloudI,Cloud\X - Player\X,Cloud\Y - Player\YIf Cloud\S = 3 Then DrawImage CloudII,Cloud\X - Player\X,Cloud\Y - Player\YIf Cloud\S = 4 Then DrawImage CloudIII,Cloud\X - Player\X,Cloud\Y - Player\YNextNextEnd FunctionFunction UpdateCollisions()For Player.Player = Each PlayerFor Bullet.Bullet = Each BulletIf Not Bullet\S = 1If ImagesCollide(PlayerAngle(Player\A),GfxW/2,GfxH/2,0,BulletImg,Bullet\X-Player\X,Bullet\Y-Player\Y,0)Delete Bullet : Player\L = Player\L - 1 : Goto NextBulletEndIfEndIfIf Not Bullet\S = 2For Enemy.Enemy = Each Enemy.EnemyIf ImagesCollide(BulletImg,Bullet\X-Player\X,Bullet\Y-Player\Y,0,EnemyAngle(Enemy\A),Enemy\X-Player\X,Enemy\Y-Player\Y,0)Delete Bullet : CreateExplosion(Enemy\X,Enemy\Y) : Delete Enemy : Goto NextBulletEndIfNextEndIf.NextBulletNextNextEnd FunctionFunction Blah()For Player.Player = Each PlayerIf Player\L < 0 Then InitiateGame()NextEnd FunctionFunction CreateExplosion(X,Y)Explosion.Explosion = New ExplosionExplosion\X = X : Explosion\Y = YExplosion\F = 0 : PlaySound ExplosionSound End FunctionFunction UpdateExplosions()For Explosion.Explosion = Each ExplosionExplosion\F = Explosion\F + 1If Explosion\F > 5 Then Delete Explosion : Goto NextExplosionFor Player.Player = Each PlayerDrawImage ExplosionImg,Explosion\X - Player\X,Explosion\Y - Player\Y,Explosion\FNext.NextExplosionNextEnd FunctionFunction UpdateCarriers()For Carrier.Carrier = Each CarrierIf MilliSecs() >= Carrier\R + 5000 And Carrier\P > 0Carrier\R = MilliSecs() : Carrier\P = Carrier\P - 1Enemy.Enemy = New EnemyEnemy\X = Carrier\X : Enemy\Y = Carrier\YEndIfFor Player.Player = Each PlayerDrawImage CarrierImg,Carrier\X - Player\X,Carrier\Y - Player\YWriteNumber(Carrier\P,Carrier\X - Player\X,Carrier\Y - Player\Y)NextNextEnd FunctionFunction InitiateGame()For Player.Player = Each PlayerDelete PlayerNextFor Enemy.Enemy = Each EnemyDelete EnemyNextFor Bullet.Bullet = Each BulletDelete BulletNextFor Cloud.Cloud = Each CloudDelete CloudNextFor Carrier.Carrier = Each CarrierDelete CarrierNextPlayer.Player = New PlayerPlayer\F = 100 : Player\L = 10Carrier.Carrier = New CarrierCarrier\X = Rnd(-32*32,32*32)*GfxW/1024 : Carrier\Y = Rnd(-32*32,32*32)*GfxH/768Carrier\S = 1Carrier.Carrier = New CarrierCarrier\X = Rnd(-32*32,32*32)*GfxW/1024 : Carrier\Y = Rnd(-32*32,32*32)*GfxH/768Carrier\S = 2 : Carrier\P = 10For I = 1 To 10Cloud.Cloud = New CloudCloud\X = Rnd(-32*32,32*32)*GfxW/1024 : Cloud\Y = Rnd(-32*32,32*32)*GfxH/768 : Cloud\S = Rnd(2,4)NextEnd Function [Edited by - Ending_Credits on June 2, 2009 11:04:36 AM];  In fact BlitzMax is actually an excellent language for games development.  Its cross platform (Mac, Linux and Windows) and the learning curve is not nearly as steep as it is for others.I know a variety of languages including C#, Java, VB, etc but I still use BlitzMax for games programming.  I just got BlitzMax after using Blitz3D for several years.  Max has everything you need for games development and a community of contributors that help along the way.  It has advanced types (similar to classes) with polymorphism and inheritance allowing for an Object Oriented approach, or you can stick to the procedural paradigm with the advanced data types.Cheers   ;  First you should ask opinions and such from people and then buy something.Not buy some compiler and then ask if it's good.You will waste your money doing so.   ;Quote:cin isn't part of the C++ language, it's part of the iostream library.cin is part of the standard library, which is part of the language as defined by the language's ISO specification.Quote:One example I ran into was trying to receive input from the user, blitz has no such cin >> statement, and I felt like everything was an uphill struggle.You believe this, I suspect, because you believe that C++ is somehow indicative of "the way things work." That's not really the case at all; cin is hardly a "core programming technique." C++ provides you a bunch of abstractions just like any other language will -- the same functionality will be achieved in different ways in different languages and different APIs. Try not to approach learning a new language too much from the perspective of the syntax and specifics of another language you know.Quote:I have a little experience in programming, I know a little syntax, and the idea behind game loops, classess etc to a basic level. I purchased Blitzmax but I really get the idea that this language is for people who have already spent a few years coding with more traditional languages, and choose Blitz as they can appreciate its time saving mechanics.There is absolutely nothing wrong or shameful or 'newbie' about using something like BlitzMax. Especially since you've purchased it, you should give yourself some time to use it. What is important to learn as a programmer is how to think like one, and how to think in general, and you can do that with any language and any development environment. Even Game Maker. Quote:Would I be better off getting my feet wet with something like Python->pygame? How does pygame present itself to someone who would be new to programming? Or maybe something like C-Allegro?Python would be a great choice (except, again, you already spent money on this Blitz thing, so give it some time). C would be a less-than-great choice.