|
Page 1 of 1
|
[ 8 posts ] |
|
Author |
Message |
Coder A
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 |
|
 |
JohnWatson
Site Admin
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 |
|
 |
Coder A
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 |
|
 |
JohnWatson
Site Admin
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 |
|
 |
Coder A
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 |
|
 |
mightor
Site Admin
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 |
|
 |
Coder A
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.
Updates coming 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
|
Sat Mar 02, 2013 9:31 am |
|
 |
Coder A
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 |
|
|
|
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 forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|