2009年8月11日 星期二

在加上一個laser_bullet class(雷射子彈)

原理就是取2點(enemy_king和body這2點),算出斜率

m=(yn-y)/(xn-x);
l*l=
(yn-y)*(yn-y)+(xn-x)*(xn-x); //畢士定理

取得xn和yn,詳細運算在下面程式,最後回傳成QLine



laser_bullet.h

------------------------------------------------------------------------------
#ifndef LASER_BULLET_H
#define LASER_BULLET_H

#include <QWidget>

class laser_bullet : public QWidget
{
public:
laser_bullet(QWidget *parent = 0);
void set_laser_x(int x1);
void set_laser_y(int y1);
void set_laser_x1(int x1);
void set_laser_y1(int y1);
int get_laser_x();
int get_laser_y();
QLine* path();
void set_laser_m();
int get_m();
private:
int xx;
int yy;
int xx1;
int yy1;
int laser_v;
int m;
int laser_length;

};

#endif // LASER_BULLET_H



laser_bullet.cpp
----------------------------------------------------------------------------
#include "laser_bullet.h"
#include <iostream>
#include <math.h>
#include <QLine>
using namespace std;
laser_bullet::laser_bullet(QWidget *parent)
{
laser_v=8;//laser速度
laser_length=50;
xx=0;
yy=0;

m=1;

}
void laser_bullet::set_laser_x(int x1)//一次只能一個
{
this->xx=x1;
}
//設y
void laser_bullet::set_laser_y(int y1)
{
this->yy=y1;
}
//取得x
void laser_bullet::set_laser_x1(int x1)//一次只能一個
{this->xx1=x1;}
void laser_bullet::set_laser_y1(int y1)//一次只能一個
{this->yy1=y1;}

int laser_bullet::get_laser_x()
{
return this->xx;
}
//取得y
int laser_bullet::get_laser_y()
{
return this->yy;
}


void laser_bullet::set_laser_m() //斜率
{
if( xx1-xx!=0 ){ //避免斜率無限大error
this->m=(yy1-yy)/(xx1-xx);
}

//cout << "m=" << m ;
}
int laser_bullet::get_m(){
return this->m;
}
QLine* laser_bullet::path()//enemy路徑運算
{
int xn;
int yn;

if(m<0 && sqrt(1+m*m)!=0) //斜率負時,y增加,x減少
{
yy = yy+laser_v; //y位移量,一定要在yn之前
xx = -laser_v/sqrt(m*m)+xx; //x位移量,一定要在xn之前
yn=yy-m*laser_length/sqrt(1+m*m); //laser長度的y點
xn=xx-laser_length/sqrt(1+m*m); //laser長度的x點

} //斜率正時,y增加,x增加
else
{
yy = yy+laser_v; //y位移量,一定要在yn之前
xx = laser_v/sqrt(m*m)+xx; //x位移量,一定要在xn之前
yn=yy+m*laser_length/sqrt(1+m*m); //laser長度的y點
xn=xx+laser_length/sqrt(1+m*m); //laser長度的x點

}


QLine *p;
p=new QLine; //一定要先初始化否則ERROR
*p=QLine (xx,yy,xn,yn);
return p; //回傳QLine

}

沒有留言: