Sorry, wenn ich mich bis hierhin undeutlich ausgedrückt habe...und jetzt wahrscheinlich mit diesem Quellcode die Regeln des Forums untergrabe.
Auuf jeden Fall möchte ich in diesem Abschnitt diesen kleinen graphischn Effekt erzeugen, wenn das Raumschiff oder ein Planet getroffen wird. Mir ist ber nicht so wirklich klar, wo ich es wie am besten mache. Ich hatte die Idee sich die Koordinaten des Schussvektors zunehmen und in dem Moment des Abschuss was erzeugen lasse. Nur fehlt mir dazu die Programmierfertigkeiten...
Ich hoffe man kann damit jetzt anfangen.
Vielen Dank und einen schönen Tag
#include "stdafx.h"
#include "Integrator.h"
#include <math.h>
#include "Raumschiff.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.141592654
void errbreak(char* message)
{
AfxMessageBox(message);
AfxAbort();
};
CIntegrator::CIntegrator(void)
{
pSz=NULL;
nistep=10;
steplen=5.0;
count=0;
maxcount=1500;
}
CIntegrator::~CIntegrator(void)
{
}
void CIntegrator::ComputeScalingData(void)
{
int i;
double gesmasse,ri,fmax;
if(!pSz) errbreak("CIntegrator::Initialize: scenario-pointer not yet present");
gesmasse=0;
for(i=0;i<pSz->np;i++) {
ri=pSz->PlanetenArray[i].radius;
gesmasse+=ri*ri*ri;
};
fmax=pow(gesmasse,1.0/3.0);
dt=sqrt(steplen/(nistep*nistep*fmax));//steplen of internal time-steps
vmax=0.5*sqrt(2.0/fmax);//fmax==radges
};
void CIntegrator::Initialize(CSzenario *pnSz, double v0, double alpha,int RSindex)
{
pSz=pnSz;
ComputeScalingData();
//start-coordinates
x=pSz->Raumschiffe[RSindex].x;
y=pSz->Raumschiffe[RSindex].y;
//start velocity
xalt=x-dt*v0*cos(alpha*PI/180.0)/vmax;
yalt=y-dt*v0*sin(-alpha*PI/180.0)/vmax;
count=0;
ImRohr=1;
}
int CIntegrator::Step(int& nxalt, int& nyalt, int &nx, int &ny)
/*
Rueckgabewerte:
0 = Raumschiff 0 getroffen
1 = Raumschiff 1 getroffen
-1 = nichts getroffen
2 = Planet getroffen oder außerhalb des Spielbereiches
*/
{
int i;
int result;
count++;
nxalt=(int)(x+0.5);
nyalt=(int)(y+0.5);
for(i=0;i<nistep;i++) {
result=InnerStep(nx,ny);
if(result!=-1) break;
};
return result;
}
int CIntegrator::InnerStep(int &nx, int &ny)
/*rueckgabewerte: wie step*/
{
double fx,fy;
double xneu,yneu;
int result;
GetForceVector(fx,fy);
xneu=2.0*x-xalt+dt*dt*fx;
yneu=2.0*y-yalt+dt*dt*fy;
xalt=x;
x=xneu;
yalt=y;
y=yneu;
nx=(int)(x+0.5);//runden
ny=(int)(y+0.5);
//abfrage des Abbruchkriteriums
result=RaumschiffGetroffen();
if(result!=-1) return result;
if(PlanetGetroffen()) return 2;
if(OutOfLimit()) return 2;
if(count>maxcount) return 2;
return -1;
}
void CIntegrator::GetForceVector(double& fx, double& fy) //Erzeugung des Schussvektors
{
int i;
double masse,r,vx,vy,abstand;
fx=0.0;
fy=0.0;
for(i=0;i<pSz->np;i++) {
r=pSz->PlanetenArray[i].radius;
masse=r*r*r;
vx=pSz->PlanetenArray[i].x-x;
vy=pSz->PlanetenArray[i].y-y;
abstand=sqrt(vx*vx+vy*vy);
fx+=masse*vx/(abstand*abstand*abstand);
fy+=masse*vy/(abstand*abstand*abstand);
};
void CspecialFX::Anzeigen(CDC *pDC)
{
if
abstand<0,65*kantenlänge;
{
CBrush mybrush(farbe),*pOld;
farbe=RGB(256,0,128)
pOld=pDC->SelectObject(&mybrush);
pDC->Rectangle((int)(&fx-5),(int)(&fy-5),(int)(&fx+5),(int)(&fy+5));
pDC->SelectObject(pOld);
}
else
return -1;
}
}
int CIntegrator::RaumschiffGetroffen(void)
/*prueft of geschoss noch im rohr des abschiessenden raumschiffes
prueft ob raumschiff getroffen
rueckgabewert: nr. des Raumschiffes 0 oder 1 falls getroffen
-1 sonst*/
{
int i;
double dx,dy,abstand;
double xr,yr,kl;
int drin[2];
for(i=0;i<2;i++) {
pSz->Raumschiffe[i].GetData(&xr,&yr,&kl);
dx=x-xr;
dy=y-yr;
abstand=sqrt(dx*dx+dy*dy);
if(abstand<0.65*kl) {
drin[i]=1;
} else {
drin[i]=0;
};
if(!ImRohr && drin[i]) return i;
};
if(!drin[0] && !drin[1]) ImRohr=0;
int CIntegrator::OutOfLimit(void)
/* rueckgabewert: 0 falls koordinaten innerhalb des limits
1 falls ausserhalb*/
{
double rand=0.5;
if(x<-pSz->xpix*rand || x>pSz->xpix*(1.0+rand) ||
y<-pSz->ypix*rand || y>pSz->ypix*(1.0+rand))
return 1;
return 0;
}
int CIntegrator::PlanetGetroffen(void)
/*reuckgabewert: 1 falls ein planet getroffen
0 falls nicht*/
{
int i;
double r,vx,vy,abstand;
for(i=0;i<pSz->np;i++) {
r=pSz->PlanetenArray[i].radius;
vx=pSz->PlanetenArray[i].x-x;
vy=pSz->PlanetenArray[i].y-y;
abstand=sqrt(vx*vx+vy*vy);
if(abstand<r) return 1;
};
return 0;
}