Forum: Fel i bil spel

Forum huvudsida -> Programmering -> Fel i bil spel

Sidor: 1

Till botten

Celeron 18:45 - 25:e September 2005 | Post #1
Medlem
Inlägg: 418


Skicka PM
Jag håller på med mitt första spel i DirectX. Det är ett bil spel som sedan ska byggas ut till ett nätverks spel med 2 lag och ett lag är några bilar med olika egenskaper. Det andra laget ska försöka förstöra bil-lagets bilar på något sätt. Felet blir när man ska rotera bilen. Efter att man har svängt runt lite så börjar man åka i en helt galen riktning (mest åt vänster). Här kommer koden iaf:

Klasser.h:
  1.  
  2. #ifndef _BILSPEL_KLASSER_H_
  3. #define _BILSPEL_KLASSER_H_
  4. enum TEXTURE{BilTexture,SkjutTexture};
  5. struct PicPlace
  6. {
  7. int x,y;
  8. int width,height;
  9. };
  10.  
  11. class Object
  12. {
  13. protected:
  14. float x;
  15. float y;
  16. PicPlace* Pics;
  17. int AntPics;
  18. int NowPic;
  19. int Update; //Hur ofta objektet ska uppdateras (i millisekunder)
  20. int LastUpdate; //När objektet uppdaterades senast (i millisekunder)
  21. TEXTURE texture;
  22. public:
  23. Object(int Upd,int AntalPics,const char* PicPositionFName);
  24. virtual ~Object()=0;
  25. int GetUpdate();
  26. int GetLastUpdate();
  27. };
  28.  
  29. class Bil: public Object
  30. {
  31. protected:
  32. float xDir;
  33. float yDir;
  34. float NowSpeed;
  35. float Acceleration;
  36. float Friction;
  37. float Brake;
  38. float TopSpeed;
  39. int Rotate;
  40. public:
  41. Bil(int,float,float,float,int,const char*);
  42. virtual ~Bil();
  43. float CountRotation();
  44. void ChangeXDirRight();
  45. void ChangeXDirLeft();
  46. void ChangeYDirRight();
  47. void ChangeYDirLeft();
  48. };
  49.  
  50. class Zipper: public Bil
  51. {
  52. private:
  53. public:
  54. Zipper();
  55. bool Update();
  56. bool Draw();
  57. };
  58. #endif


klassfunktioner.cpp:
  1.  
  2. #include "klasser.h"
  3. #include <fstream>
  4. #include <ctime>
  5. #include <windows.h>
  6. #include <d3d9.h>
  7. #include <d3dx9.h>
  8. #include "DIklass.h"
  9. using namespace std;
  10. extern LPD3DXSPRITE gSprite;
  11. extern LPDIRECT3DTEXTURE9 gBilTexture;
  12. extern Input Keyboard;
  13. //Object vägen
  14. Object::Object(int Upd,int AntalPics,const char* PicPostitonFName)
  15. {
  16. AntPics=AntalPics;
  17. if(AntPics<1)
  18. AntPics=1;
  19. Pics=new PicPlace[AntPics];
  20. ifstream ladda(PicPostitonFName);
  21. if(AntalPics>0)
  22. {
  23. for(int i=0; i<AntPics; i++)
  24. ladda >> Pics[i].x >> Pics[i].y >> Pics[i].width >> Pics[i].height;
  25. }
  26. Update=Upd;
  27. LastUpdate=clock();
  28. x=50;
  29. y=50;
  30. }
  31.  
  32. Object::~Object()
  33. {
  34. delete [] Pics;
  35. }
  36.  
  37. int Object::GetUpdate()
  38. {
  39. return Update;
  40. }
  41.  
  42. int Object::GetLastUpdate()
  43. {
  44. return LastUpdate;
  45. }
  46.  
  47. //Bil funktioner
  48. Bil::Bil(int Upd,float A,float F,float B,int AntalPics,const char* PPFN): Object(Upd,AntalPics,PPFN)
  49. {
  50. Rotate=0;
  51. xDir=0;
  52. yDir=-1.8;
  53. Acceleration=A;
  54. Friction=F;
  55. Brake=B;
  56. texture=BilTexture;
  57. NowSpeed=0;
  58. TopSpeed=5;
  59. }
  60.  
  61. Bil::~Bil()
  62. {}
  63.  
  64. ///1 grad=~0.0174 radianer
  65. float Bil::CountRotation()
  66. {
  67. return 0.0174*Rotate;
  68. }
  69.  
  70. ///Jag skulle hellre velat ha en algoritm här som räknade ut xDir och yDir efter Rotate,
  71. ///men jag kom inte på något smart sätt att lösa det på.
  72. void Bil::ChangeXDirRight()
  73. {
  74. if(Rotate<=90 && Rotate>=0)
  75. xDir+=0.02*5;
  76. else if(Rotate>90 && Rotate<180)
  77. xDir-=0.02*5;
  78. else if(Rotate<270 && Rotate>=180)
  79. xDir-=0.02*5;
  80. else if(Rotate>=270 && Rotate<=360)
  81. xDir+=0.02*5;
  82. }
  83.  
  84. void Bil::ChangeXDirLeft()
  85. {
  86. if(Rotate<=90 && Rotate>=0)
  87. xDir-=0.02*5;
  88. else if(Rotate>90 && Rotate<180)
  89. xDir+=0.02*5;
  90. else if(Rotate<270 && Rotate>=180)
  91. xDir+=0.02*5;
  92. else if(Rotate>=270 && Rotate<=360)
  93. xDir-=0.02*5;
  94. }
  95.  
  96. void Bil::ChangeYDirLeft()
  97. {
  98. if(Rotate<=90 && Rotate>=0)
  99. yDir-=0.02*5;
  100. else if(Rotate>90 && Rotate<180)
  101. yDir-=0.02*5;
  102. else if(Rotate<270 && Rotate>=180)
  103. yDir+=0.02*5;
  104. else if(Rotate>=270 && Rotate<=360)
  105. yDir+=0.02*5;
  106. }
  107.  
  108. void Bil::ChangeYDirRight()
  109. {
  110. if(Rotate<=90 && Rotate>=0)
  111. yDir+=0.02*5;
  112. else if(Rotate>90 && Rotate<180)
  113. yDir+=0.02*5;
  114. else if(Rotate<270 && Rotate>=180)
  115. yDir-=0.02*5;
  116. else if(Rotate>=270 && Rotate<=360)
  117. yDir-=0.02*5;
  118. }
  119.  
  120. //Zipper funktioner
  121. Zipper::Zipper(): Bil(20,0.3,0.1,0.6,1,"Zipper.txt") {}
  122.  
  123. bool Zipper::Update()
  124. {
  125. clock_t Tiden=clock();
  126. if((int)Tiden-Object::LastUpdate>=Object::Update) //Kollar om det är dags att uppdatera
  127. {
  128. Object::LastUpdate=clock();
  129. if(Keyboard.GetKey(DIK_S)) //Använder DirectInput
  130. NowSpeed+=Acceleration; //-kar hastigheten
  131. else if(Keyboard.GetKey(DIK_D))
  132. NowSpeed-=Brake; //Bromsar
  133. else
  134. NowSpeed-=Friction; //Rullar vidare, fast långsammare och långsammare
  135. if(Keyboard.GetKey(DIK_LEFT)) //Om vänster piltanjent är nertryckt
  136. {
  137. Rotate-=5; //Rotera åt vänster
  138. ChangeXDirLeft(); //,,ndrar xDir är vänster
  139. ChangeYDirLeft(); //,,ndrar yDir åt vänster
  140. }
  141. if(Keyboard.GetKey(DIK_RIGHT))
  142. {
  143. Rotate+=5;
  144. ChangeXDirRight();
  145. ChangeYDirRight();
  146. }
  147. if(Rotate<0) //Kollar så att Rotate inte är mindre än 0
  148. {
  149. int temp=Rotate;
  150. Rotate=360-temp;
  151. }
  152. else if(Rotate>360) //Kollar så att Rotate inte är mer än 360
  153. {
  154. int temp=Rotate;
  155. Rotate=0+(temp-360);
  156. }
  157. if(NowSpeed<0)
  158. NowSpeed=0;
  159. if(NowSpeed>TopSpeed)
  160. NowSpeed=TopSpeed;
  161. x+=xDir*NowSpeed; //Här "flyttas" x positionen
  162. y+=yDir*NowSpeed; //Här flyttas y positionen
  163. }
  164. Draw(); //Här ritas alltihop ut
  165. return true;
  166. }
  167.  
  168. bool Zipper::Draw()
  169. {
  170. RECT rc;
  171. rc.right=Pics[NowPic].x;
  172. rc.left=Pics[NowPic].width;
  173. rc.top=Pics[NowPic].y;
  174. rc.bottom=Pics[NowPic].height;
  175. D3DXVECTOR2 spriteCentre=D3DXVECTOR2(Pics[NowPic].width-(Pics[NowPic].width/2),Pics[NowPic].height-(Pics[NowPic].height/2));
  176. D3DXVECTOR2 trans=D3DXVECTOR2(x+32,y);
  177. float rotation=CountRotation();
  178. D3DXMATRIX mat;
  179. D3DXVECTOR2 scaling(1.0f,1.0f);
  180. D3DXMatrixTransformation2D(&mat,NULL,0.0,&scaling,&spriteCentre,rotation,&trans);
  181. gSprite->Begin(D3DXSPRITE_ALPHABLEND);
  182. gSprite->SetTransform(&mat);
  183. gSprite->Draw(gBilTexture,&rc,NULL,NULL,0xFFFFFFFF);
  184. gSprite->End();
  185. return true;
  186. }


Det blev lite mycket kod, men jag tror att det är fel i funktionerna som ändrar xDir och yDir. Skulle man kunna skriva det på något annat sätt? Rotate innehåller rotationen i grader.

-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/



Sidor: 1

Forum huvudsida -> Programmering -> Fel i bil spel
Atom feed

Du får inte posta i den här tråden | Till toppen