BTC USD 84,458.3 Gold USD 4,298.38
Time now: Jun 1, 12:00 AM

Help>>game projectile motion c++

AZAM_PENJUAL_MESRA

Fun Poster
Messages
520
Joined
Jun 2, 2008
Messages
520
Reaction score
2
Points
15
salam,

aku ada project,
nak bertanya kat sini,
kepada yg expert programning tu,
boleh tak tolong ajar or bagi link rujukan untuk buat graphic projectile motion.

sekarang aku guna microsoft visual C++ 6.0.

arahan,

buat satu program yang mana
program tetapkan satu target,
user masukan data,
dan looping sampai user kene target.
:p
 
sori bro.takde yg expert kot kat sini..cuba tanye pakcik google..hehe
 
Last edited:
hah..ambik....jgn byk soal..

Code:
  sprintf( szTempTitle,"%u - %u", GetTickCount(), GetCurrentProcessId() );
  SetConsoleTitle( szTempTitle );
  Sleep( 40 );
  // handle for NT
  hConWnd = FindWindow( NULL, szTempTitle );
  SetConsoleTitle( szOriginalTitle );

  // may not work on WIN9x
  if ( os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
  {
    hConWnd = GetWindow( hConWnd, GW_CHILD );
    if ( hConWnd == NULL )  return 0;
    GetClassName( hConWnd, szClassName, sizeof ( szClassName ) );
    while ( strcmp( szClassName, "ttyGrab" ) != 0 )
    {
      hConWnd = GetNextWindow( hConWnd, GW_HWNDNEXT );
      if ( hConWnd == NULL )  return 0;
      GetClassName( hConWnd, szClassName, sizeof( szClassName ) );
    }
  }
  return hConWnd;
}


void clrscr(void) {										//function to clear screen
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD coord = {0, 0};
	DWORD count;
	
	GetConsoleScreenBufferInfo(hStdOut, &csbi);
	FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
	SetConsoleCursorPosition(hStdOut, coord);
}


void gotoxy(short x, short y) {      //rujukan utk gerakan coordinate
	HANDLE hConsoleOutput;
	COORD Cursor_Pos = {x, y};

	hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hConsoleOutput, Cursor_Pos);
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
 
sambunga..

Code:
void main ()
{
	srand((unsigned)time(0)); 

	 hConWnd = GetConsoleWndHandle();                  //support grafik sistem
	//x(t)=(ViCos@)t,y(t)=(-1/2)gt^2+(ViSin@)t+Si
	//pi=3.141593
	//H=y(tH),y'(t)=0==>tH=ViSin@/g
	//R=x(tR),y(t)=0==>t=[(-b(+/-)sqrt(b^2-4ac)]/(2a)
	

	 if(hConWnd){
	int i;
		 //////////////////////////////////////////////////////////////////////////////////////baru yg betul
	double dblInitialHeight,dblLaunchAngle,dblInitialSpeed;						//input
	double dblTimeInterval,dblTimeYAxisZero[2],dblTimeMaxRange,dblTimeMaxHeight;        //data for time
	double dblHeightMax,dblRangeMax;									    	//x and y axis
	const double PI=3.141593,g=32; //	g=32ft/s^2 = 9.81m/s^2  	                        //value for pi and gravity
	double dblA,dblB,dblC;									                    //for quadratic eqtn
	bool boolPlay = true;
	bool boolNew = true;
	while (boolPlay){


		if (boolNew){
			inttarget = (rand()%500)+(rand()%500);
			boolNew = false;
		}
	clrscr();

	cout<<"----------------------------------------------------------------"<<endl;
	cout<<"Program ini untuk menunjukkan 'Ballistic Projectile Motion Game'"<<endl;
	cout<<"----------------------------------------------------------------"<<endl;
	cout << "\n\nJarak Target: ";
	cout << inttarget-10 << " - " <<inttarget+10 << " ft";
	cout<<"\n\n";
	
	cout<<"masukkan nilai halaju awal(ft/s)= ";
	cin>>dblInitialSpeed;
	cout<<"masukkan jarak tinggi awal jika ade(0 jika tiada)(ft)= ";
	cin>>dblInitialHeight;
	cout<<"masukkan nilai darjah(degree)= ";				// limit angle adalah 0-90 degree only
	cin>>dblLaunchAngle;
	
	dblLaunchAngle=dblLaunchAngle*PI/180;										//change degree to radian
	


	dblA=-g/2; dblB=dblInitialSpeed*sin(dblLaunchAngle); dblC=dblInitialHeight;

	dblTimeYAxisZero[0]=(-dblB + sqrt(pow(dblB,2)-4*(dblA)*(dblC)))/(2*dblA);		//root utk dapatkan time max
	dblTimeYAxisZero[1]=(-dblB - sqrt(pow(dblB,2)-4*(dblA)*(dblC)))/(2*dblA);		//root ukt dapatkan time max

	if(dblTimeYAxisZero[0]<=0) {dblTimeMaxRange=dblTimeYAxisZero[1];}             //vice versa utk dapatkan nilai max time (utk dapatkan X max sebenarnya)
	if(dblTimeYAxisZero[1]<=0) {dblTimeMaxRange=dblTimeYAxisZero[0];}


	dblRangeMax=dblInitialSpeed*cos(dblLaunchAngle)*dblTimeMaxRange;  //largest value of height(max value of X-axis) ok

	dblTimeMaxHeight=dblB/g;   //time for maximum height //yang ni equation selepas pembezaan y= (y'=0)

	dblHeightMax=((-g/2)*pow(dblTimeMaxHeight,2)) + (dblB*dblTimeMaxHeight) + dblInitialHeight;  //the largest value for height(Y-axiz)
     
	dblTimeInterval=(dblTimeMaxRange/(intArray-1));  //to plot & make domain for time menjadi 500 bahagian

	dblYaxisValue[0]=((-g/2)*0*0) + (dblB*0) + dblInitialHeight;    // at time t=0
	dblXaxisValue[0]=dblInitialSpeed*cos(dblLaunchAngle)*0;			//at time t=0

//	cout<<"at time=0 value x,valuey= "<<dblXaxisValue[0]<<","<<dblYaxisValue[0]<<endl; //coordinate semasa time=0
///////////////////////////////////////////////////////////////////// code utk lakar grafik bermula
   for(i=1;i<intArray;i++)   //intArray =501
   {    
		dblYaxisValue[i]=((-g/2)*dblTimeInterval*dblTimeInterval) + (dblB*dblTimeInterval) + dblInitialHeight;  //utk cari coordinate y axis
		dblXaxisValue[i]=dblInitialSpeed*cos(dblLaunchAngle)*dblTimeInterval;                                   //utk cari coordinate x axis
	//	cout<<"at time"<<dblTimeInterval<<" value x["<<i<<"],y["<<i<<"]="<<dblXaxisValue[i]<<","<<dblYaxisValue[i]<<endl;  //for display every coordinate
		dblTimeInterval+=(dblTimeMaxRange/(intArray-1));  //untuk dapatkan turutan time (bukan i) dari 500 slot array
	}

	cout<<"sila tekan mana2 kunci untuk tembak"<<endl;
	getch();  //utk tunggu user tekan keyboard baru jalan

	//cout<<"sila tunggu sebentar..";
	//do{	clrscr();Draw(dblRangeMax,dblHeightMax);}while(getch()!='q');  //clear jawapan untuk lukis grafik selepasnya.
	// }
	clrscr();
	Draw(1000,350);  //clear jawapan untuk lukis grafik selepasnya.
	Sleep(1000);
	clrscr();


	if ((dblRangeMax<inttarget-10)||(dblRangeMax>inttarget+10)){
	//tak kena
		cout << "Sasaran tersasar!" << endl << endl;
		
	}
	else{
		cout << "Tahniah!"<< endl << endl;

		boolNew = true;
	}
	cout<<"masa jarak max="<<dblTimeMaxRange;
	cout<<endl;
	cout<<"jarak x max ="<<dblRangeMax;
	cout<<endl;
	cout<<"masa tinggi max="<<dblTimeMaxHeight;
	cout<<endl;
	cout<<"jarak y max ="<<dblHeightMax;
	cout<<endl;
	cout<<"sila tekan mana2 kunci untuk teruskan" <<endl;
	getch();  //utk tunggu user tekan keyboard baru jalan
			BCX_Circle(hConWnd,300,200,400,Black,Black); //Paint All black
		BCX_Circle(hConWnd,500,200,400,Black,Black); //Paint All black
		BCX_Circle(hConWnd,700,200,400,Black,Black); //Paint All black
	}
	}
}


int Draw(double dblRangeMax,double dblHeightMax)
{
	int intOriginX=40,intOriginY=25;
	Sleep(1000);																	//rehat 1 saat semasa tunggu grafik //milisecond
	
	gotoxy(3,1);printf("y"); gotoxy(69,23);printf("x");                   //utk tentukan nama paksi
	BCX_Line(hConWnd,intOriginX,300-intOriginY,intOriginX,intOriginY-10,Grey);			//y-axis
	BCX_Line(hConWnd,37,intOriginY-7,intOriginX,intOriginY-10,Grey);					//small arrow to y-axis hujung axis
	BCX_Line(hConWnd,43,intOriginY-7,intOriginX,intOriginY-10,Grey);					//small arrow to y-axis hujung axis
	BCX_Line(hConWnd,intOriginX,300-intOriginY,(intArray-1+50),300-intOriginY,Grey);    //x-axis
	BCX_Line(hConWnd,(intArray-1+50-3),300-intOriginY-3,(intArray-1+50),300-intOriginY,Grey); //small arrow at x-axis hujung axis
	BCX_Line(hConWnd,(intArray-1+50-3),300-intOriginY+3,(intArray-1+50),300-intOriginY,Grey); //small arrow at x-axis hujung axis

	//draw target
  

	for(int i=0;i<intArray;i++)
	{  
		int intDummy[2];

		intDummy[0]=int(dblXaxisValue[i]*(intArray-1)/dblRangeMax);
		if(((dblXaxisValue[i]*(intArray-1)/dblRangeMax)-intDummy[0])>=0.5) intDummy[0]+=1;//x position(scaling utk boleh masuk 500 slot)

		intDummy[1]=int((dblYaxisValue[i]*((intArray-1)/2))/dblHeightMax);  //utk jadikan scale y axis = 250 = (intArray-1)/2
		if((dblYaxisValue[i]*(intArray-1)/dblHeightMax)-intDummy[1]>=0.5)  intDummy[1]+=1;//y position(scaling)  //if guna utk bundar
		
	
		BCX_Circle(hConWnd,intOriginX+intDummy[0],275-intDummy[1],1,Red);  //lakar curve yg betul2
		BCX_Line(hConWnd,intOriginX+((inttarget-10)*(intArray-1)/1000),300-intOriginY,intOriginX+((inttarget+10)*(intArray-1)/1000),300-intOriginY,Green);  
		Sleep(5);
		
	
	}


	return 0;

}
 
Back
Top
Log in Register