A Moment in Hindsight

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • A Moment in Hindsight

      Right off, this has been inspired by a post Rez made in the "Look Here" thread. Basically, Rez commented that he had the source code to an old Tetris clone somewhere, and I have a similar story of my own.

      My first "real" game was something that I wrote with my best friend Mark, which we titled "Ballistic". Inspired by a game that we played in 8th grade. It was a side-view tank shooter, where you entered the angle and power of your tank shell in attempts to hit the other player's tank. It supported 2-4 players, had a screen shake on each shell detonation, deformable terrain, randomly generated levels, and wind.

      Basically, since I've been visting home for the summer, I have had time to hang out with Mark (he still lives in my hometown). We were chatting about how it would be funny to find the game again and cry over how bad the source is and reminisce. Long story short, I was rummaging around in one of his many CD cases and found a pocket packed full of floppies. At the bottom of these was a floppy disk penned with the title "Ballistic". On it was the source code.

      I have yet to find a zip of the graphics library that we used and sadly do not yet have a working binary, but I can post the source (it's short) if anyone wants to cry with me, haha. I'm still trying to see if I can get a copy of the library.

      So how many of you have your "first" game or at least one you look on with loving memory?
      Feel you safe and secure in the protection of your pants . . . but one day, one day there shall be a No Pants Day and that shall be the harbinger of your undoing . . .
    • RE: A Moment in Hindsight

      Dood you should totally post this source.
      Mr.Mike
      Author, Programmer, Brewer, Patriot
    • Haha, ok, get ready to weep at this one. If it's too long, just edit it or let me know and I'll snip it out.

      NOTE: Looks like it didn't preserve the formatting... Not sure how to do this except for reformatting the whole thing (which I don't have time to do right now). If you want, I've attached the file to the post.

      C Source Code

      1. //TAKE NOTE: THIS PROGRAM WAS BUILT WITH THE CMU GRAPHICS PACKAGE v1.5. IT HAS BEEN OPTIMIZED FOR IT!!!!
      2. //Corbin Hart and Mark Wetter(additional thanks to Jonathan Myers for making the dynamic array struct thingie)
      3. //This is a Battle Tanks game that we felt inspired to make after we player a Mac version in 8th grade.
      4. //------------------------------------------------------------------
      5. // Thanks to Dave and Chris(for crushing our hopes and stealing our souls),
      6. // Crawfish, FFX, Angemina, Ceramic Lawn Statues that speak, The Aurochs,
      7. // Spam, (spam,spam,spam,spam*What do you mean you don't like spam?!*), Corbin's computer: Morgan, Mark's PS2
      8. // CorTek Software, Inc. (c), KNot Angemima, Brenda, Andrew, The Nose, and all other extraneous objects
      9. // pertaining to this project
      10. // (We stole this section from D&C)
      11. #pragma warning(disable:4786)//VC++ warning disabler for the new CMU
      12. #include "CMUGraphicsLib/CMUgraphics.h"
      13. #include <stdlib.h>
      14. #include <time.h>
      15. #include <math.h>
      16. #include <process.h>
      17. const double PI=atan(1.f)*4.;
      18. struct Tank
      19. {
      20. Tank():velocity(120),angle(90),destroyed(false){}
      21. int x;
      22. int y;
      23. int velocity;
      24. int angle;
      25. bool destroyed;
      26. };
      27. void initTerrain(window&);
      28. void shakeWindow(double,window&);
      29. void LaunchProjectile(Tank,window &,int);
      30. void DrawProjectile(int,int,window &);
      31. void BlastRadius(int,int,int,int,window &);
      32. void DrawSquare(int,int,int,window &);
      33. void drawPlayerStats(Tank,int,window &);
      34. void inputPlayerStats(Tank &,int,window &);
      35. void updateTurret(Tank,window &);
      36. inline void SetWind(int &);
      37. void DrawWind(window &,int);
      38. bool openingScreen(window &,int &,bool);
      39. bool checkTank(int,int,window &);
      40. Tank * placeTanks(int,window&);//WARNING: placeTanks returns a dynamic array!!!
      41. int main()
      42. {
      43. system("cls");
      44. int numTanks=0;
      45. int curTank=0;
      46. int tanksLeft;
      47. int wind=0;
      48. bool opened=0;
      49. Tank * playerTanks;
      50. window myWin(640,480,20,20);
      51. srand((unsigned)time(NULL));
      52. myWin.ChangeTitle("Ballistic 0.6.8");
      53. while (openingScreen(myWin,numTanks,opened))
      54. {
      55. opened=1;
      56. initTerrain(myWin);
      57. playerTanks=placeTanks(numTanks,myWin);
      58. SetWind(wind);
      59. DrawWind(myWin,wind);
      60. do {
      61. tanksLeft=0;
      62. for (int i=0; i<numTanks; i++)
      63. {
      64. if (playerTanks[i].destroyed==false)
      65. tanksLeft++;
      66. }
      67. for(curTank=0; curTank<numTanks; curTank++)
      68. {
      69. if(playerTanks[curTank].destroyed==false)
      70. {
      71. inputPlayerStats(playerTanks[curTank],curTank+1,myWin);
      72. LaunchProjectile(playerTanks[curTank],myWin,wind);
      73. }
      74. for(int curTank2=0; curTank2<numTanks; curTank2++)
      75. {
      76. myWin.SetBrush(BLACK);
      77. myWin.SetPen(BLACK);
      78. playerTanks[curTank2].destroyed=checkTank(playerTanks[curTank2].x,playerTanks[curTank2].y,myWin);
      79. }
      80. if(tanksLeft==1)
      81. curTank=numTanks;
      82. tanksLeft=0;
      83. for (int i=0; i<numTanks; i++)
      84. {
      85. if (playerTanks[i].destroyed==false)
      86. tanksLeft++;
      87. }
      88. }
      89. } while (tanksLeft>1);
      90. delete [] playerTanks;
      91. }
      92. return 0;
      93. }
      94. bool openingScreen(window &menuWin,int &numPlayers,bool open)
      95. {
      96. image titleImage("title.jpg", JPEG);
      97. image menuImage("menu.jpg", JPEG);
      98. bool done=0;
      99. int x,y;
      100. if (!open) {
      101. menuWin.DrawImage(titleImage,0,0);
      102. Sleep(2000);
      103. numPlayers=2;
      104. }
      105. menuWin.DrawImage(menuImage,0,0);
      106. menuWin.SetPen(YELLOW,5);
      107. menuWin.DrawRectangle(104,140,239,275,FRAME);
      108. do {
      109. menuWin.WaitMouseClick(x,y);
      110. if (x>109 && y>145 && x<234 && y<270)
      111. {
      112. numPlayers=2;
      113. menuWin.DrawImage(menuImage,0,0);
      114. menuWin.DrawRectangle(104,140,239,275,FRAME);
      115. }
      116. if (x>248 && y>145 && x<373 && y<270)
      117. {
      118. numPlayers=3;
      119. menuWin.DrawImage(menuImage,0,0);
      120. menuWin.DrawRectangle(243,140,378,275,FRAME);
      121. }
      122. if (x>385 && y>145 && x<510 && y<270)
      123. {
      124. numPlayers=4;
      125. menuWin.DrawImage(menuImage,0,0);
      126. menuWin.DrawRectangle(380,140,515,275,FRAME);
      127. }
      128. if (x>116 && y>362 && x<289 && y<425)
      129. {
      130. menuWin.SetPen(BLUE,1);
      131. return 1;
      132. }
      133. if (x>330 && y>360 && x<477 && y<423)
      134. {
      135. menuWin.SetPen(BLUE,1);
      136. return 0;
      137. }
      138. } while(1);
      139. }
      140. void initTerrain(window &Win)
      141. {
      142. Win.SetBrush(BLUE);
      143. Win.DrawRectangle(-1,-1,640,480,FILLED);
      144. int x,y;
      145. double A=rand()%10+30,B=((rand()%10)/500.),C=rand()%15+25,D=(rand()%10)/600.,E=rand()%20+37,F=(rand()%10)/500.,G=rand()%12+40,H=(rand()%10)/750.;
      146. Win.SetBrush(GREEN);
      147. Win.SetPen(GREEN);
      148. for(int i=0; i<640; i++)
      149. {
      150. x=i+1;
      151. y=A*sin(B*i)+C*cos(D*i)+E*pow(sin(F*i),2)+G*pow(cos(H*i),2)+320;
      152. Win.DrawRectangle(i,y,x,480,FILLED);
      153. }
      154. }
      155. void shakeWindow(double vibrate,window &shakeSurface)
      156. {
      157. image shaking;
      158. shakeSurface.StoreImage(shaking,0,0,640,480);
      159. do {
      160. shakeSurface.DrawImage(shaking,0,vibrate);
      161. vibrate*=-.8;
      162. Sleep(10);
      163. } while (vibrate<=-1 || vibrate >=1);
      164. shakeSurface.DrawImage(shaking,0,0);
      165. }
      166. void LaunchProjectile(Tank projectileTank, window &Win, int Wind)
      167. {
      168. int Xf=0,Yf=0;
      169. double time=0;
      170. double Vxo;
      171. double Vyo;
      172. double theta=projectileTank.angle;
      173. theta*=(PI/180.);
      174. Vyo=projectileTank.velocity*sin(theta);
      175. Vxo=projectileTank.velocity*cos(theta);
      176. int x,y;
      177. double theta2=projectileTank.angle*(PI/180);
      178. x=15*cos(theta2);
      179. if(theta2>PI)
      180. x=projectileTank.x-(15*cos(theta2));
      181. else
      182. x+=(projectileTank.x);
      183. y=15*sin(-theta2)+projectileTank.y;
      184. Win.SetBrush(BLACK);
      185. Win.SetPen(BLACK);
      186. do
      187. {
      188. if(theta>.5*PI)
      189. Xf=Vxo*(-cos(theta))*time+x+(time*Wind);
      190. else
      191. Xf=Vxo*cos(theta)*time+x+(time*Wind);
      192. Yf=Vyo*(sin(-theta))*time+(.5*20*pow(time,2))+(y-20);
      193. DrawProjectile(Xf,Yf,Win);
      194. time+=.01;
      195. } while((Win.GetGreen(Xf,Yf+5)!=1.0||Yf<0)&&Xf<640);
      196. BlastRadius(Xf,Yf,20,Wind,Win);
      197. }
      198. void DrawProjectile(int x, int y, window &projectileWin)
      199. {
      200. projectileWin.SetBrush(BLACK);
      201. projectileWin.SetPen(BLACK);
      202. projectileWin.DrawCircle(x,y,3);
      203. Sleep(1);
      204. projectileWin.SetBrush(BLUE);
      205. projectileWin.SetPen(BLUE);
      206. projectileWin.DrawCircle(x,y,3);
      207. }
      208. void BlastRadius(int x, int y, int radius, int wind, window &blastWin)
      209. {
      210. int i=0;
      211. for(i=1; i<=radius; i++)
      212. {
      213. blastWin.SetBrush(RED);
      214. blastWin.SetPen(ORANGE);
      215. blastWin.DrawEllipse(x-(2/3.)*i,y+i,x+(2/3.)*i,y-i);
      216. Sleep(5);
      217. }
      218. blastWin.SetBrush(BLUE);
      219. blastWin.SetPen(BLUE);
      220. blastWin.DrawEllipse(x-(2/3.)*radius,y+radius,x+(2/3.)*radius,y-radius);
      221. DrawWind(blastWin,wind);
      222. shakeWindow(20,blastWin);
      223. }
      224. Tank * placeTanks(int quantity,window &drawWin) {
      225. int temp=640/(quantity+1);
      226. Tank * tankCoords;
      227. tankCoords=new Tank[quantity];
      228. image tank("tank.jpg",JPEG);
      229. int x=0;
      230. int y;
      231. int addsub=0;
      232. for(int i=0; i<quantity; i++)
      233. {
      234. x+=(temp+(rand()%75-37));
      235. while(i!=0&&tankCoords[i-1].x==x)
      236. x+=(rand()%25+5);
      237. y=0;
      238. do {
      239. y++;
      240. } while(drawWin.GetGreen(x,y)!=1.0);
      241. tankCoords[i].x = x;
      242. tankCoords[i].y = y;
      243. drawWin.SetBrush(YELLOW);
      244. //drawWin.DrawTriangle(x-8,y+4,x+8,y+4,x,y-8);
      245. drawWin.DrawImage(tank,x-18,y-5);
      246. }
      247. return tankCoords;
      248. }
      249. bool checkTank(int tankX, int tankY, window &tankWin)
      250. {
      251. if(tankWin.GetBlue(tankX,tankY)==1.0)
      252. return true;
      253. else
      254. return false;
      255. }
      256. void drawPlayerStats(Tank statTank, int Player, window &statWin)
      257. {
      258. statWin.SetBrush(BLUE);
      259. statWin.SetPen(BLUE);
      260. statWin.DrawRectangle(0,0,150,100);
      261. statWin.SetPen(BLACK);
      262. statWin.SetFont(20,PLAIN,ROMAN);
      263. statWin.DrawString(5,5,"Player #");
      264. statWin.DrawInteger(70,5,Player);
      265. statWin.DrawString(5,25,"Velocity: ");
      266. statWin.DrawInteger(85,25,statTank.velocity);
      267. statWin.DrawString(5,45,"Angle: ");
      268. statWin.DrawInteger(85,45,statTank.angle-90);
      269. }
      270. void inputPlayerStats(Tank &inTank,int player,window &inWin)
      271. {
      272. char input;
      273. drawPlayerStats(inTank,player,inWin);
      274. image iTurrent;
      275. inWin.StoreImage(iTurrent,inTank.x-40,inTank.y-40,80,80);
      276. inWin.FlushKeyQueue();
      277. do {
      278. updateTurret(inTank,inWin);
      279. inWin.WaitKeyPress(input);
      280. if(int(input)==52&&inTank.angle<180)
      281. inTank.angle++;
      282. if(int(input)==54&&inTank.angle>0)
      283. inTank.angle--;
      284. if(int(input)==56)
      285. inTank.velocity++;
      286. if(int(input)==50&&inTank.velocity>0)
      287. inTank.velocity--;
      288. if(input=='x')
      289. exit(0);
      290. drawPlayerStats(inTank,player,inWin);
      291. inWin.DrawImage(iTurrent,inTank.x-40,inTank.y-40);
      292. inWin.FlushKeyQueue();
      293. } while(int(input)!=13);
      294. }
      295. void updateTurret(Tank turretTank, window &turretWin)
      296. {
      297. int x;
      298. int y;
      299. double theta=turretTank.angle*(PI/180);
      300. x=15*cos(theta);
      301. if(theta>PI)
      302. x=turretTank.x-(15*cos(theta));
      303. else
      304. x+=turretTank.x;
      305. y=25*sin(-theta)+turretTank.y;
      306. turretWin.SetPen(BLACK,2);
      307. turretWin.SetBrush(BLACK);
      308. turretWin.DrawLine(turretTank.x,turretTank.y,x,y);
      309. }
      310. inline void SetWind(int &Wind){Wind=rand()%30-15;}
      311. void DrawWind(window &windWin, int Wind)
      312. {
      313. windWin.SetPen(BLACK);
      314. windWin.SetBrush(BLACK);
      315. windWin.DrawTriangle(400,10,400,20,400+(1.5*Wind),15);
      316. windWin.SetFont(20,PLAIN,ROMAN);
      317. windWin.DrawInteger(410+abs(1.5*Wind),10,Wind);
      318. }
      Display All
      Files
      • ballistic.txt

        (9.06 kB, downloaded 491 times, last: )
      Feel you safe and secure in the protection of your pants . . . but one day, one day there shall be a No Pants Day and that shall be the harbinger of your undoing . . .
    • I've now found an older version of the graphics library we used, this one not supporting PNGs and only JPGs. So I thought to myself, "Self, I'll just convert the images we have to JPGs and it'll work!" The only problem is, I can't find the images either... though I do have hopes that I can find it resting with either my best friend, Mark, or some other old friends of mine...

      The saga continues.

      [Edit]
      So Mark not only had the images, but he had a compiled version as well. Enjoy!

      digitalannex.net/users/palin/Ballistic.zip
      [/Edit]
      Feel you safe and secure in the protection of your pants . . . but one day, one day there shall be a No Pants Day and that shall be the harbinger of your undoing . . .

      The post was edited 2 times, last by Tarviathun ().

    • RE: A Moment in Hindsight

      The .txt has formatting just fine, except for the use of the evil tab character. :P

      It plays pretty well! I don't have anyone to play against right now, so I just shot a few salvos at myself. It was very satisfying. :D

      Originally posted by Tarviathun
      So how many of you have your "first" game or at least one you look on with loving memory?


      My first game was a side-scrolling shooter like R-Type, called Linearity. The name comes from the initial idea I had of doing all the graphics with the Line() function... I gave up on that after a short time but stuck with the name because the gameplay is also decidedly linear. :P

      The idea for the gameplay was that you have 3 classes of weapons: lasers, blasters, and missiles. Lasers fire with the left mouse button, blasters with the right, and missiles with the space bar. (but you have to get a lock-on first by holding the cursor over an enemy for a couple seconds)

      One thing that's kinda neat is that you can have multiple instances of the same weapon type, and they all fire at the same time, so you can have Laser 0 and Laser 1 and you'll see a pretty light show of red and blue when you click. There's limited ammo for every weapon except your basic laser. Oh, and if you fire too much, the weapon overheats and you can't use it for a few seconds.

      There's only 3 levels, and then the game crashes because it tries to load the nonexistent level 4, and all the enemies look the same, and there's only 3 types of lasers and two types of blasters, and one type of missile.

      Phew! I never realized how complicated that was before...

      I've got the source for it, but I'm missing some of the graphics for the title screen for some reason. I'll post it when I either find the graphics or recreate them.

      And trust me that your source code is a shining example of perfection compared to the sanity-destroying monstrosity that is Linearity.
      (For example, I #include a .cpp!)
    • Haha, that sounds awesome. A lot more complex than my game. Any where that you have it lying around or some such?
      Feel you safe and secure in the protection of your pants . . . but one day, one day there shall be a No Pants Day and that shall be the harbinger of your undoing . . .
    • Here is a snippet of some of my oldest code, originally using my own ModeX asm graphics routines. Game was little like Jill of the Jungle, in fact the the prototype which this code is from even "borrowed" Jill. ;)

      There are some intresting things in there, like having a pointer to a member function which gets called to update the actor, and might change the pointer to a new member function, basicly a fixed state machine. Also I got the idea of a table with frame numbers, sprites, and sounds from hacking Doom II. 8) But if you look closely there are some goto's in there! Yuck! 8o

      // ACTOR.CPP
      // Description: Implements Actor and ActorManager classes.
      // Author: Nigel Atkinson.
      // Enviroment: Borland C++ 3.1, DOS 6.2 386SX 4MB RAM
      // Revision History:
      // 20 May 1998 Rev 1.0 First working incarnation, from scratch.
      // 17 Nov 1999 Ported to DJGPP / Allegro 3.1

      #include "Actor.h"
      #include "Frames.h"
      #include "data.h"

      // Actors
      #include "Frog.h"
      #include "Jill.h"
      #include "Water.h"

      void Actor::Update()
      {
      (this->*nextAction)();
      }

      void Actor::UpdateFrame()
      {
      frameCount--;
      if( frameCount == 0)
      {
      currentFrame = frames[currentFrame].next;
      frameCount = frames[currentFrame].frameCount;
      if( frames[currentFrame].sound )
      {
      play_sample((SAMPLE *)soundfx[frames[currentFrame].sound].dat,
      255,128,1000,0);
      }
      }
      }

      // Manager functions for editor and loading saving.
      void Actor::Loader( FILE *fp ) // Loads from fp
      {
      return;
      }

      void Actor::Saver( FILE *fp ) // Saves to fp
      {
      return;
      }

      char *Actor::Name() // Returns name for menu
      {
      return "Actor";
      }

      int Actor::ID() // Returns numeric id for loading and saving by manager
      {
      return ACTOR_ID;
      }

      int Actor::Dialog() // Displays a dialog to change actors properties (in editor)
      {
      return 0;
      }

      void ActorManager::InsertActor( Actor *newActor )
      {
      newActor->nextActor = firstActor;
      newActor->prevActor = NULL;

      if( firstActor )
      firstActor->prevActor = newActor;

      firstActor = newActor;

      if( lastActor == NULL )
      lastActor = newActor;

      return;
      }

      void ActorManager::DeleteActor( Actor *delActor )
      {
      Actor *iterActor;

      for( iterActor = firstActor; iterActor; iterActor = iterActor->nextActor )
      if( iterActor == delActor )
      break;

      if( iterActor )
      {
      if( iterActor == firstActor )
      firstActor = firstActor->nextActor;

      if( iterActor == lastActor )
      lastActor = lastActor->prevActor;

      if( iterActor->prevActor )
      iterActor->prevActor->nextActor = iterActor->nextActor;

      if( iterActor->nextActor )
      iterActor->nextActor->prevActor = iterActor->prevActor;

      delete iterActor;
      }
      }

      int ActorManager::LoadActors( FILE *fp, int numActors )
      {
      int id;
      Actor *newactor;

      while( numActors-- )
      {
      if( fread( &id, sizeof(id), 1, fp ) != 1)
      {
      return -1;
      }

      switch( id )
      {
      // Note we dont have any plain actors, only desendaints
      case FROG_ID:
      newactor = new Frog;
      break;
      case JILL_ID:
      newactor = new Jill;
      break;
      case WATER_ID:
      newactor = new Water;
      break;

      // Add new actor types here, and include there header file.
      default:
      newactor = NULL;
      break;
      }

      if( !newactor )
      return -1;

      newactor->Loader(fp); // New actor knows how much data to load for itself.

      InsertActor( newactor );
      }

      return 0;
      }

      void ActorManager::ShowAll()
      {
      Actor *iterActor;

      for( iterActor = firstActor; iterActor; iterActor = iterActor->nextActor )
      iterActor->Show();
      }

      void ActorManager::UpdateAll()
      {
      Actor *iterActor;

      iterActor = firstActor;

      while( iterActor )
      {
      if( iterActor->state == DELETED )
      {
      Actor *deleteMe = iterActor;

      // Move iteration ptr onwards so we don't end up with a wild ptr
      iterActor = iterActor->nextActor;

      DeleteActor( deleteMe );
      }
      else
      {
      iterActor->Update();
      iterActor = iterActor->nextActor;
      }
      }
      }

      void ActorManager::HideAll()
      {
      Actor *iterActor;

      for( iterActor = lastActor; iterActor; iterActor = iterActor->prevActor )
      iterActor->Hide();
      }

      void ActorManager::DeleteAll()
      {
      while( firstActor )
      DeleteActor( firstActor );
      }

      ActorManager::~ActorManager()
      {
      DeleteAll();
      }

      int ActorManager::CountAreaHits( int x, int y, int w, int d )
      {
      Actor *iterActor;
      int count = 0;
      int x2 = x + w;
      int y2 = y + d;

      // Loop trough each actor and prove that actor hasn't hit rather
      // than hit. Easier coding that way.

      for( iterActor = lastActor; iterActor; iterActor = iterActor->prevActor )
      {
      if( iterActor->x > x2 || iterActor->y > y2 )
      continue; // Totally above or to the left.
      if( iterActor->x+iterActor->width < x )
      continue; // Totally to the right
      if( iterActor->y+iterActor->height < y )
      continue; // Totally below

      count++;
      }

      return count;
      }

      Actor *ActorManager::GetActorHit( int x, int y, int w, int d, Actor *notme )
      {
      Actor *iterActor;
      int x2 = x + w;
      int y2 = y + d;
      int hit = 0;
      int stop = 0;

      // Loop trough each actor and prove that actor hasn't hit rather
      // than hit. Easier coding that way.

      iterActor = lastActor;
      while( iterActor && !stop )
      {
      hit = 1;
      if( iterActor == notme )
      {
      hit = 0; // Of course we hit ourselves!!! Why state the obvious?
      goto skippy;
      }

      if( iterActor->state == DORMANT )
      {
      hit = 0;
      goto skippy;
      }
      if( iterActor->x > x2 || iterActor->y > y2 )
      {
      hit = 0; // Totally above or to the left.
      goto skippy;
      }
      if( iterActor->x+iterActor->width < x )
      {
      hit = 0; // Totally to the right
      goto skippy;
      }
      if( iterActor->y+iterActor->height < y )
      hit = 0; // Totally below

      skippy:

      if( !hit )
      iterActor = iterActor->prevActor;
      else
      stop = 1;
      }

      if( hit )
      return iterActor;
      else
      return NULL;
      }

      #if 0

      int main(void)
      {
      // Lets test out these classes.
      ActorManager *actorMgr = new ActorManager;
      Actor *p;

      actorMgr->InsertActor( new Actor );
      actorMgr->InsertActor( p = new Actor );
      actorMgr->InsertActor( new Actor );

      actorMgr->UpdateAll();
      actorMgr->HideAll();

      p->Die();
      actorMgr->UpdateAll();
      actorMgr->HideAll();

      delete actorMgr;

      return 0;
      }

      #endif

      The post was edited 1 time, last by merlinblack ().