View unanswered posts | View active topics It is currently Sat Aug 18, 2018 9:56 pm

 Page 1 of 1 [ 8 posts ]
 Print view Previous topic | Next topic
Physics Game
Author Message
Moderator

Joined: Thu Jan 03, 2013 5:10 pm
Posts: 207
Location: The plateau north of the Ohio River Valley, also known as Cave Country.
Physics Game
This is a little program I made up a couple of days ago. It's a projectile motion simulator, and it is still in its infancy, but I hope to improve it soon. Here's the first version:

 Code:typedef struct{   // Sz means sub zero.  Cu means current.   short xpossz; // X position of object at last interference   short ypossz; // Y position of object at last interference   float velosz; // velocity of object at last interference   short thetsz; // angle of travel at last interference   short timdif; //    short xposcu; // current X position   short yposcu; // current Y position   float velocu; // current total velocity   short thetcu; // current angle of travel   float velxcu; // current X velocity   float velycu; // current Y velocity}projectile;const float g = -9.8;short degrees = 30;task get_theta(){   while(true)   {      while(nNxtButtonPressed!=kLeftButton&&nNxtButtonPressed!=kRightButton)      {}      while(nNxtButtonPressed==kLeftButton)      {         degrees++;         if(degrees==360)            degrees = 0;         wait10Msec(5);      }      while(nNxtButtonPressed==kRightButton)      {         degrees--;         if(degrees==-1)            degrees = 359;         wait10Msec(5);      }      while(nNxtButtonPressed!=kNoButton)      {}   }}task main(){   nNxtExitClicks = 2;   projectile p1;   p1.xpossz = 10;   p1.ypossz = 10;   p1.timdif = 0;   p1.velosz = 40;   StartTask(get_theta);   short targetx;   short targety;   while(nNxtButtonPressed!=kExitButton)   {      targetx = abs(rand())%100;      targety = abs(rand())%64;      while(nNxtButtonPressed!=kEnterButton)      {         eraseDisplay();         nxtDrawCircle(targetx-6,targety+6,12);         nxtDrawLine(p1.xpossz,p1.ypossz,(cosDegrees(degrees)*10)+p1.xpossz,(sinDegrees(degrees)*10)+p1.ypossz);         nxtDisplayStringAt(0,7,"%d",degrees);         wait10Msec(1);      }      eraseDisplay();      nxtDrawCircle(targetx-6,targety+6,12);      p1.thetsz = degrees;      ClearTimer(T1);      p1.xposcu = p1.xpossz;      p1.yposcu = p1.ypossz;      float time;      while(p1.xposcu>-1&&p1.xposcu<100&&p1.yposcu>-1&&pow(p1.xposcu-targetx,2)+pow(p1.yposcu-targety,2)>25)      {         time = (float)time1[T1]/1000;         p1.xposcu = round(((p1.velosz*cosDegrees(p1.thetsz)*time)+p1.xpossz));         p1.yposcu = round((((g*(time*time))/2)+(p1.velosz*sinDegrees(p1.thetsz)*time)+p1.ypossz));         nxtSetPixel(p1.xposcu,p1.yposcu);      }      if(pow(p1.xposcu-targetx,2)+pow(p1.yposcu-targety,2)<=25)         nxtDisplayStringAt(0,63,":)");      else         nxtDisplayStringAt(0,63,":(");      nxtDisplayStringAt(69,7,"Next>");      while(nNxtButtonPressed==kNoButton)      {}   }   StopAllTasks();}

Gameplay:

1. Use the arrow buttons to aim at the target(circle).
2. Press enter to fire.
3. You get a smile for a hit, and a frown for a miss.
4. Press right to play again.

Like I said, It is very primitive. More stuff will hopefully come soon!

_________________
I'm not a robot! I'm british! ~ quote from an asparagus
I am not a robot! I am a unicorn! ~ quote from a robot

Fri Mar 01, 2013 4:55 pm

Joined: Thu May 24, 2012 12:15 pm
Posts: 722
Re: Physics Game
This is pretty awesome; I just tried it out and it worked flawlessly. How long did it take you to come up with this?

_________________
Check out our Blog! And our Facebook page!
Need help? Take a look at our updated help documentation and the ROBOTC Forums.

Fri Mar 01, 2013 5:04 pm
Moderator

Joined: Thu Jan 03, 2013 5:10 pm
Posts: 207
Location: The plateau north of the Ohio River Valley, also known as Cave Country.
Re: Physics Game
Thanks! It took an evening and a morning. I'm planning to incorporate rebounding off walls; then, I'll create levels and make it a full-blown game. That, however, could take a while

_________________
I'm not a robot! I'm british! ~ quote from an asparagus
I am not a robot! I am a unicorn! ~ quote from a robot

Fri Mar 01, 2013 5:08 pm

Joined: Thu May 24, 2012 12:15 pm
Posts: 722
Re: Physics Game
Definitely keep us updated; once you have it at a state you're comfortable with, we would like to publish it on our blog (with your permission, of course).

_________________
Check out our Blog! And our Facebook page!
Need help? Take a look at our updated help documentation and the ROBOTC Forums.

Fri Mar 01, 2013 5:19 pm
Moderator

Joined: Thu Jan 03, 2013 5:10 pm
Posts: 207
Location: The plateau north of the Ohio River Valley, also known as Cave Country.
Re: Physics Game
Neat! Yes, I will continue to post updated versions to this topic. You have my permission!

_________________
I'm not a robot! I'm british! ~ quote from an asparagus
I am not a robot! I am a unicorn! ~ quote from a robot

Fri Mar 01, 2013 5:22 pm

Joined: Wed Mar 05, 2008 8:14 am
Posts: 3654
Location: Rotterdam, The Netherlands
Re: Physics Game
Hey, that is very cool! I like the trace of the "bullet" as it travels. Nice work!

= Xander

_________________
| Professional Conduit of Reasonableness
| (Title bestowed upon on the 8th day of November, 2013)
| My Blog: I'd Rather Be Building Robots
| ROBOTC 3rd Party Driver Suite: [Project Page]

Sat Mar 02, 2013 2:11 am
Moderator

Joined: Thu Jan 03, 2013 5:10 pm
Posts: 207
Location: The plateau north of the Ohio River Valley, also known as Cave Country.
Re: Physics Game
Thank you! The trace of the bullet is basically where the bullet used to be, so as long as the screen is not erased the trace automatically stays up. It would actually be harder to get rid of the trace or have a trace of x length, but that's what I'm shooting for.

_________________
I'm not a robot! I'm british! ~ quote from an asparagus
I am not a robot! I am a unicorn! ~ quote from a robot

Sat Mar 02, 2013 9:31 am
Moderator

Joined: Thu Jan 03, 2013 5:10 pm
Posts: 207
Location: The plateau north of the Ohio River Valley, also known as Cave Country.
Re: Physics Game

O.K. , so I guess I spoke too "soon" ! But, here is some more:

 Code:typedef struct{   // Sz means sub zero.  Cu means current.   short xpossz; // X position of object at last interference   short ypossz; // Y position of object at last interference   float velosz; // velocity of object at last interference   float velxsz; // X velocity of object at last interference   float velysz; // Y velocity of object at last interference   short thetsz; // angle of travel at last interference   float timdif; // used in computing timecu   float timecu; // time since last interference   short xposcu; // current X position   short yposcu; // current Y position   float velocu; // current total velocity   short thetcu; // current angle of travel   float velxcu; // current X velocity   float velycu; // current Y velocity   bool intrsct; // if projectile is on wall   float gysz;   // g force felt by object along y axis at last interference   float gxsz;   // g force felt by object along x axis at last interference   float gycu;   // g force felt by object along y axis currently   float gxcu;   // g force felt by object along x axis currently}projectile;const float g = -9.8;short degrees = 30;task get_theta(){   while(true)   {      while(nNxtButtonPressed!=kLeftButton&&nNxtButtonPressed!=kRightButton)      {}      while(nNxtButtonPressed==kLeftButton)      {         degrees++;         if(degrees==360)            degrees = 0;         wait10Msec(5);      }      while(nNxtButtonPressed==kRightButton)      {         degrees--;         if(degrees==-1)            degrees = 359;         wait10Msec(5);      }      while(nNxtButtonPressed!=kNoButton)      {}   }}//---------------------------------------------------------------------------------------------------------------------//short get_thetcu(float velx, float vely){   short thetcugot =   velx == 0 ?      vely < 0 ?         270 :         90   :      velx < 0 ?         round(radiansToDegrees(atan(vely/velx))+180) :         round(radiansToDegrees(atan(vely/velx)));   if(thetcugot < 0)      thetcugot += 360;   return thetcugot;}//---------------------------------------------------------------------------------------------------------------------//void get_gs(projectile proj){   if(proj.xposcu<=32)   {      proj.gycu = 1*g;      proj.gxcu = 0;   }   else   {      if(proj.xposcu>=33&&proj.xposcu<=66)      {         proj.gycu = 0;         proj.gxcu = 0;      }      else      {         if(proj.xposcu>=67)         {            proj.gycu = 0;            proj.gxcu = 2 * g;         }      }   }}//---------------------------------------------------------------------------------------------------------------------//projectile p1;task main(){   nNxtExitClicks = 2;   p1.xpossz = 10;   p1.ypossz = 10;   p1.timdif = 0;   p1.velosz = 30;   p1.gxcu   = 0;   p1.gycu   = 1 * g;   StartTask(get_theta);   while(nNxtButtonPressed!=kEnterButton)   {      eraseDisplay();      nxtDisplayStringAt(0,7,"%d",degrees);      nxtInvertLine(p1.xpossz,p1.ypossz,(cosDegrees(degrees)*10)+p1.xpossz,(sinDegrees(degrees)*10)+p1.ypossz);      wait10Msec(1);   }   StopTask(get_theta);   alive();   eraseDisplay();   p1.thetsz = degrees;   ClearTimer(T1);   p1.xposcu = p1.xpossz;   p1.yposcu = p1.ypossz;   p1.gxcu = p1.gxsz;   p1.gycu = p1.gysz;   nxtDrawRect(0,63,99,0);   while(nNxtButtonPressed!=kExitButton)   {      p1.velxsz = (float)p1.velosz*cosDegrees(p1.thetsz);      p1.velysz = (float)p1.velosz*sinDegrees(p1.thetsz);      while(p1.xposcu>=0&&p1.xposcu<=99&&p1.yposcu>=0&&p1.gycu==p1.gysz&&p1.gxcu==p1.gxsz)      {         p1.timecu = (float)((time1[T1]-p1.timdif)/1000);         p1.xposcu = round(((p1.gxsz*p1.timecu*p1.timecu)/2)+(p1.velxsz*p1.timecu)+p1.xpossz);         p1.yposcu = round(((p1.gysz*p1.timecu*p1.timecu)/2)+(p1.velysz*p1.timecu)+p1.ypossz);         nxtSetPixel(p1.xposcu,p1.yposcu);         get_gs(p1);      }      // Calculate new information.      p1.xpossz = p1.xposcu;      p1.ypossz = p1.yposcu;      if(p1.thetsz<0)         p1.thetsz += 360;      p1.velxcu = p1.gxsz*p1.timecu+p1.velxsz;      p1.velycu = p1.gysz*p1.timecu+p1.velysz;      p1.gysz = p1.gycu;      p1.gxsz = p1.gxcu;      p1.thetsz = get_thetcu(p1.velxcu,p1.velycu);      p1.velosz = round(sqrt(pow(p1.velxcu,2)+pow(p1.velycu,2)) * 0.99);      p1.velxsz = (float)p1.velosz*cosDegrees(p1.thetsz);      p1.velysz = (float)p1.velosz*sinDegrees(p1.thetsz);      p1.timdif = time1[T1];      // New information has been calculated.   }   StopAllTasks();}

What got changed:

1. I have added the concept of different "gravity zones" on the screen. the first third has 1 y-g(g force felt along the y-axis) and 0 x-gs. The middle third has no gs at all. The rightmost third has 0 y-gs and 2 x-gs(the projectile curves back to the left).

2. More variables were added to the projectile struct compensate for the gravity zones.

3. I currently have not put the target functionality back into the game, but don't worry, it's just a matter of time(hopefully not that much time, heh heh).

I am sorry about the lack of comments. I do not promise to ever comment it.

Updates coming! (maybe not as soon as you'd like them!)

-Coder A

_________________
I'm not a robot! I'm british! ~ quote from an asparagus
I am not a robot! I am a unicorn! ~ quote from a robot

Thu Apr 11, 2013 5:48 pm
Display posts from previous:  Sort by
 Page 1 of 1 [ 8 posts ]

#### Who is online

Users browsing this forum: No registered users and 2 guests

 You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot post attachments in this forum

Search for:
 Jump to:  Select a forum ------------------ ROBOTC Applications    ROBOTC for LEGO MINDSTORMS       Third-party sensors    ROBOTC for CORTEX & PIC    ROBOTC for VEX IQ    ROBOTC for Arduino    Robot Virtual Worlds    Multi-Robot Communications    Issues and Bugs Competitions & Partners    Mini Urban Challenge    CS2N Robot Virtual Worlds Competitions       VEX Skyrise Competition 2014-2015       VEX Toss Up 2013-2014       FTC Block Party! 2013-2014    Competitions using VEX - BEST, TSA, VEX, and RoboFest!    FTC Programming    RoboCup Junior and Other ROBOT Competitions Virtual Brick Robotics Discussions    General Discussions    Project Discussions Off-Topic ROBOTC Forum & ROBOTC.net Suggestions/Feedback    ROBOTC Forums Suggestions/Comments    ROBOTC.net Suggestions/Comments       NXT Programming: Tips for Beginning with ROBOTC       VEX Programming: Tips for Beginning with ROBOTC    2013 Robotics Summer Of Learning       VEX Toss Up Programming Challenge       FTC Ring It Up! Programming Challenge    International Forums       Spanish Forums          ROBOTC for MINDSTORMS          ROBOTC for VEX       French Forums          ROBOTC pour Mindstorms          ROBOTC pour IFI VEX       Japanese Forums （日本語のフォーラム）       German Forums    2015 Spring Carnival Event    PLTW (Project Lead The Way)    Robotics Merit Badge    2014 Robotics Academy Summer of Learning