help rotating turret using mouse

Started by
1 comment, last by corner 17 years ago
Im trying to get my turret to roate as according to where the mouse is.In other words i want my turrer to face my mouse pointer, where ever it is on the screen, whilst still in the same poistion. and i also have a problem getting my bulle to fire at the mouse pointer void init() { allegro_init(); install_timer(); install_mouse(); install_keyboard(); set_color_depth(32); set_gfx_mode(GFX_AUTODETECT,ResX,ResY,0,0); screen_buffer=create_bitmap(ResX,ResY); select_mouse_cursor(MOUSE_CURSOR_ALLEGRO); } void spawn_bullet(double x,double y) { for(int i=0;i<Max_objs;i++) if(obj.status == 0) { obj.status = 1; obj.AItype=2; obj.size = 8; obj.angle=10; obj.ptrSprite=3; obj.positionX = x+16; obj.positionY= y+16; //obj.desX; //obj.desY; i=Max_objs; } } void spawn_turret() { for(int i=0;i<Max_objs;i++) if(obj.status == 0) { obj.status=1; obj.AItype=3; obj.ptrSprite=4; obj.size = 64; obj.angle=0; obj.positionX=50; obj.positionY=59; obj.sides=2;// 1=foe; 2=friend i=Max_objs; } } void AICalcXY(int i) { double dx,dy; dx=sin(obj.angle); dy=cos(obj.angle); dx*=obj.speed; dy*=obj.speed; obj.positionX+=dx; obj.positionY+=dy; } void AICalcAngle(int i) { double dx=obj.desX-obj.positionX;//+obj.size/2 -obj.positionX; double dy=obj.desY-obj.positionY; if(dx==0)dx=1; if(dy==0)dy=1; double newAngle=atan2(dy,dx); newAngle=(newAngle/M_PI)*180; while(newAngle<0) { newAngle+=360; } obj.angle=newAngle; } void AIbullet(int i) { AICalcAngle(i); AICalcXY(i); } void AIturret(int i) { AICalcAngle(i); } void ai() { for(int i=0;i<Max_objs;i++) { if(obj.AItype==1) //AIexplosion(i); if(obj.AItype==3) AIturret(i); if(obj.AItype==4) AIbullet(i); } } void drawsprite(int arrPos) { double topLeftX=obj[arrPos].positionX; double topLeftY=obj[arrPos].positionY; double BtmRX=topLeftX+obj[arrPos].size; double BtmRY=topLeftY+obj[arrPos].size; int sX,sY;//source X int cX,cY; if(topLeftX<0) { sX=-topLeftX; topLeftX=0; } else { sX=0; } if(topLeftY<0) { sY=-topLeftY; topLeftY=0; } else { sY=0; } if(BtmRX>ResX) { BtmRX=ResX; } if(BtmRY>ResY) { BtmRY=ResY; } cX=BtmRX-topLeftX; cY=BtmRY-topLeftY; int pX = (int)(obj[arrPos].angle/10)*obj[arrPos].size; if(cX>0 && cY>0) { for(int y=0;y<cY;++y) for(int x=0;x<cX;++x) { int col=getpixel(sprite[obj[arrPos].ptrSprite],x+sX+pX,y+sY); putpixel(screen_buffer,topLeftX+x,topLeftY+y,col); } } } void rotate() { BITMAP* temp1, *temp2; temp1=load_bitmap("shooter.bmp",NULL); sprite[4]=create_bitmap(64*36,64); temp2=load_bitmap("bullet.bmp",NULL); sprite[3]=create_bitmap(8*36,8); for (int rotNr=0; rotNr<36;rotNr++) { rotate_sprite(sprite[3],temp2,rotNr*8,0,itofix(7.1*rotNr)); rotate_sprite(sprite[4],temp1,rotNr*64,0,itofix(7.1*rotNr)); } } void window() { for(int i=0;i<Max_objs;i++) drawsprite(i); } void mouse() { if (mouse_b & 1) { for(int i=0;i<Max_objs;i++) { if(obj.sides==2) spawn_bullet(obj.positionX,obj.positionY); i=Max_objs; } for(int x=0;x<Max_objs;x++) { if(obj[x].AItype==2) obj[x].desX=mouse_x; obj[x].desY=mouse_y; x=Max_objs; } } } void passive_to_active() { show_mouse(screen_buffer); blit(screen_buffer,screen,0,0,0,0,ResX,ResY); clear_to_color(screen_buffer,makecol(0,0,0)); show_mouse(NULL); } void fse() { ai(); mouse(); window(); passive_to_active(); } int main() { init(); rotate(); spawn_turret(); while(!key[KEY_ESC]) { fse(); } } END_OF_MAIN()
Advertisement
Put your code into [source] tags so that it's rather easier to read (source colouring, the formatting's kept and only so much on screen at one time).

Here's some C++-style pseudocode for you, though:

MousePosition = GetMousePosition(); // Get screen-space co-ords of mouse
ScreenToWorldCoordinates(MousePosition); // Convert to world space
int xToMouse = MousePosition.x - TurretPosition.x;
int yToMouse = MousePosition.y - TurretPosition.y;
// Normalize direction
int length = sqrt((x * x) + (y * y));
xToMouse /= length;
yToMouse /= length;

FireDirection(xToMouse, yToMouse);

EDIT: Or if you want an angle (in radians): FireDirection(atan2(yToMouse, xToMouse));.

EDIT2: Fixed odd expression (*= 1 / length rather than simply /= length). Don't know quite what I was thinking.

[Edited by - TheUnbeliever on April 23, 2007 11:23:13 AM]
[TheUnbeliever]
thanks ill go try it now.
But what about getting my bullet to move.

This topic is closed to new replies.

Advertisement