#include "klasser.h"
#include <fstream>
#include <ctime>
#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include "DIklass.h"
using namespace std;
extern LPD3DXSPRITE gSprite;
extern LPDIRECT3DTEXTURE9 gBilTexture;
extern Input Keyboard;
//Object vägen
Object::Object(int Upd,int AntalPics,const char* PicPostitonFName)
{
AntPics=AntalPics;
if(AntPics<1)
AntPics=1;
Pics=new PicPlace[AntPics];
ifstream ladda(PicPostitonFName);
if(AntalPics>0)
{
for(int i=0; i<AntPics; i++)
ladda >> Pics[i].x >> Pics[i].y >> Pics[i].width >> Pics[i].height;
}
Update=Upd;
LastUpdate=clock();
x=50;
y=50;
}
Object::~Object()
{
delete [] Pics;
}
int Object::GetUpdate()
{
return Update;
}
int Object::GetLastUpdate()
{
return LastUpdate;
}
//Bil funktioner
Bil::Bil(int Upd,float A,float F,float B,int AntalPics,const char* PPFN): Object(Upd,AntalPics,PPFN)
{
Rotate=0;
xDir=0;
yDir=-1.8;
Acceleration=A;
Friction=F;
Brake=B;
texture=BilTexture;
NowSpeed=0;
TopSpeed=5;
}
Bil::~Bil()
{}
///1 grad=~0.0174 radianer
float Bil::CountRotation()
{
return 0.0174*Rotate;
}
///Jag skulle hellre velat ha en algoritm här som räknade ut xDir och yDir efter Rotate,
///men jag kom inte på något smart sätt att lösa det på.
void Bil::ChangeXDirRight()
{
if(Rotate<=90 && Rotate>=0)
xDir+=0.02*5;
else if(Rotate>90 && Rotate<180)
xDir-=0.02*5;
else if(Rotate<270 && Rotate>=180)
xDir-=0.02*5;
else if(Rotate>=270 && Rotate<=360)
xDir+=0.02*5;
}
void Bil::ChangeXDirLeft()
{
if(Rotate<=90 && Rotate>=0)
xDir-=0.02*5;
else if(Rotate>90 && Rotate<180)
xDir+=0.02*5;
else if(Rotate<270 && Rotate>=180)
xDir+=0.02*5;
else if(Rotate>=270 && Rotate<=360)
xDir-=0.02*5;
}
void Bil::ChangeYDirLeft()
{
if(Rotate<=90 && Rotate>=0)
yDir-=0.02*5;
else if(Rotate>90 && Rotate<180)
yDir-=0.02*5;
else if(Rotate<270 && Rotate>=180)
yDir+=0.02*5;
else if(Rotate>=270 && Rotate<=360)
yDir+=0.02*5;
}
void Bil::ChangeYDirRight()
{
if(Rotate<=90 && Rotate>=0)
yDir+=0.02*5;
else if(Rotate>90 && Rotate<180)
yDir+=0.02*5;
else if(Rotate<270 && Rotate>=180)
yDir-=0.02*5;
else if(Rotate>=270 && Rotate<=360)
yDir-=0.02*5;
}
//Zipper funktioner
Zipper::Zipper(): Bil(20,0.3,0.1,0.6,1,"Zipper.txt") {}
bool Zipper::Update()
{
clock_t Tiden=clock();
if((int)Tiden-Object::LastUpdate>=Object::Update) //Kollar om det är dags att uppdatera
{
Object::LastUpdate=clock();
-
if(Keyboard.GetKey(DIK_S)) //Använder DirectInput
NowSpeed+=Acceleration; //-kar hastigheten
else if(Keyboard.GetKey(DIK_D))
NowSpeed-=Brake; //Bromsar
else
NowSpeed-=Friction; //Rullar vidare, fast långsammare och långsammare
-
if(Keyboard.GetKey(DIK_LEFT)) //Om vänster piltanjent är nertryckt
{
Rotate-=5; //Rotera åt vänster
ChangeXDirLeft(); //,,ndrar xDir är vänster
ChangeYDirLeft(); //,,ndrar yDir åt vänster
}
if(Keyboard.GetKey(DIK_RIGHT))
{
Rotate+=5;
ChangeXDirRight();
ChangeYDirRight();
}
if(Rotate<0) //Kollar så att Rotate inte är mindre än 0
{
int temp=Rotate;
Rotate=360-temp;
}
else if(Rotate>360) //Kollar så att Rotate inte är mer än 360
{
int temp=Rotate;
Rotate=0+(temp-360);
}
-
if(NowSpeed<0)
NowSpeed=0;
if(NowSpeed>TopSpeed)
NowSpeed=TopSpeed;
-
x+=xDir*NowSpeed; //Här "flyttas" x positionen
y+=yDir*NowSpeed; //Här flyttas y positionen
}
Draw(); //Här ritas alltihop ut
return true;
}
bool Zipper::Draw()
{
RECT rc;
rc.right=Pics[NowPic].x;
rc.left=Pics[NowPic].width;
rc.top=Pics[NowPic].y;
rc.bottom=Pics[NowPic].height;
-
D3DXVECTOR2 spriteCentre=D3DXVECTOR2(Pics[NowPic].width-(Pics[NowPic].width/2),Pics[NowPic].height-(Pics[NowPic].height/2));
D3DXVECTOR2 trans=D3DXVECTOR2(x+32,y);
float rotation=CountRotation();
D3DXMATRIX mat;
D3DXVECTOR2 scaling(1.0f,1.0f);
D3DXMatrixTransformation2D(&mat,NULL,0.0,&scaling,&spriteCentre,rotation,&trans);
gSprite->Begin(D3DXSPRITE_ALPHABLEND);
gSprite->SetTransform(&mat);
gSprite->Draw(gBilTexture,&rc,NULL,NULL,0xFFFFFFFF);
gSprite->End();
return true;
}
-