witam nie jestem profesjonalnym programista - od razu mowie :P
dzis napisalem sobie taki program for fun( z wieloma błędami ; P), z kolizjami, zderzaja sie ze soba kuleczki, a w zasadzie pilki, lecz borykam sie z problemem, dodawania wektorów, chodzi o to ze
gdy dodam do siebie 2 zmienne typu double wychodza kosmiczne rzeczy
podam na przykladzie
VX1 = VX1 + VX2;
zapodam cały program
#include <allegro.h>
#include <math.h>
using namespace std;
BITMAP * bitBuffer;
BITMAP * path;
const int RX = 1024 ;
const int RY = 768;
const int lo =25;
class kula
{
public:
double X;
double Y;
double VX;
double VY;
int color;
double Acc;
double Angle;
int crashed;
double A;
void Create(double _X, double _Y, double _VX, double _VY, int _color)
{
X = _X;
Y = _Y;
VX = _VX;
VY = _VY;
color = _color;
Acc = 0;
crashed = 0;
Angle = rand() % 360;
A= ((rand() % 720)-360)/100;
}
};
#include <cFps.h>
kula * o = new kula[lo];
void init();
void deinit();
int main() {
init();
cFps FPS;
srand ((int) time(NULL));
bitBuffer = create_bitmap(RX, RY);
BITMAP * pil = load_bitmap("pil.bmp",0);
path = create_bitmap(RX, RY);
for(int i = 0; i < lo; i++)
{
o[i].Create(10+rand() % 1024-50, 10+rand() % 768-50,
// o[i].Create(cos(3.14 * i/180)*100+320, sin(3.14 * i/180)*100+240,
(double)(rand() % 400-200)/100,(double)(rand() % 400-200)/100,
makecol(rand() % 255, rand() % 255,rand() % 255));
}
while (!key[KEY_ESC]) {
FPS.vCount(true, 999, 10, 10, makecol(255, 255, 255));
for(int i = 0; i < lo; i++)
{
//circlefill(bitBuffer, o[i].X, o[i].Y, 30, o[i].color);
//circle(bitBuffer, o[i].X, o[i].Y, 30, makecol(255, 255, 255));
rotate_sprite(bitBuffer, pil, o[i].X, o[i].Y, itofix(o[i].Angle));
//putpixel(path, o[i].X,o[i].Y, o[i].color);
o[i].X += o[i].VX;
o[i].Y += o[i].VY;
o[i].Angle += o[i].A;
if((o[i].X >= RX-15) || (o[i].X <= 0+15))o[i].VX = -o[i].VX;
if((o[i].Y >= RY-15) || (o[i].Y <= 0+15))o[i].VY = -o[i].VY;
if(o[i].Y < RY)o[i].VY+=o[i].Acc;
for(int x = 0; i < lo; x++)
{
if(x == i) break;
double dx = o[i].X - o[x].X;
double dy = o[i].Y - o[x].Y;
if (hypotf(dx, dy) < 30)
{
double tmpx = o[i].VX;
double tmpy = o[i].VY;
double tmpa = o[i].A;
o[i].VX += o[x].VX;//TU POJAWIA SIE PROBLEM
o[i].VY += o[x].VY; //ZMIENNE PRZYJMUJA BLYSKAWICZNIE KOSMICZNE WARTOSCI
o[i].A = o[x].A; // POMOCY :PP
o[x].VX+ = tmpx;//
o[x].VY += tmpy; //
o[x].A = tmpa;
}
}
}
blit(bitBuffer, screen, 0, 0, 0, 0, RX, RY);
clear_bitmap(bitBuffer);
}
deinit();
return 0;
}
END_OF_MAIN()
void init() {
int depth, res;
allegro_init();
depth = desktop_color_depth();
if (depth == 0) depth = 16;
set_color_depth(depth);
res = set_gfx_mode(GFX_DIRECTX_ACCEL, RX, RY, 0, 0);
if (res != 0) {
allegro_message(allegro_error);
exit(-1);
}
install_timer();
install_keyboard();
install_mouse();
/* add other initializations here */
}
void deinit() {
clear_keybuf();
/* add other deinitializations here */
}