No Description

frog.cpp 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #include "frog.h"
  2. #include <QDebug>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <cassert>
  6. #include <QMessageBox>
  7. #include "mainwindow.h"
  8. #include "ui_mainwindow.h"
  9. // ~English/
  10. // Constructor for the frog class
  11. // ~Spanish
  12. // Constructor de la clase sapo
  13. frog::frog(QWidget *parent) : QWidget(parent) {
  14. Ysapo = 190;
  15. A = B = C = 0;
  16. myTimer= new QTimer(this);
  17. flag = xFlag = false;
  18. // ~English
  19. // These are the x positions of the background?
  20. temp = 580;
  21. temp2 = 0;
  22. backFlag = false;
  23. moved = false;
  24. showText = false;
  25. computeNenuPositions();
  26. }
  27. void frog::computeNenuPositions() {
  28. xnenu = -(rand() % 30);
  29. Xsapo = xnenu;
  30. initialX = Xsapo;
  31. xnenu2 = (rand() % 100) + 100;
  32. xnenu3 = xnenu2 + (rand() % 100) + 200;
  33. }
  34. void frog::reset(){
  35. flag = xFlag = false;
  36. Ysapo = 190;
  37. A = B = C = 0;
  38. temp = 580;
  39. temp2 = 0;
  40. backFlag = false;
  41. moved = false;
  42. showText = false;
  43. repaint();
  44. myTimer->stop();
  45. delete myTimer;
  46. myTimer = new QTimer;
  47. connect(myTimer, SIGNAL(timeout()), this, SLOT(animate()));
  48. computeNenuPositions();
  49. }
  50. void frog::paintEvent(QPaintEvent *){
  51. QPainter p(this);
  52. QString frogger = ":/images/Frogger1.png";
  53. QString frogger2 = ":/images/Frogger2.png";
  54. QString frogger3 = ":/images/Frogger3.png";
  55. QString leaf = ":/images/Nenufar1.png";
  56. QString back = ":/images/background.jpg";
  57. // Condiciones que permitian un rango de error (no caer en la x exacta de los nenufares)
  58. if(backFlag == true || (Xsapo <= (xnenu3 + 55) && Xsapo >= (xnenu3 - 55) && Ysapo == 190)
  59. || (Xsapo > xnenu && Ysapo == 190 && Xsapo < (xnenu2-55))
  60. || (Xsapo > xnenu2 && Ysapo == 190 && Xsapo < (xnenu3-55))
  61. || (Xsapo > xnenu3 && Ysapo == 190)){
  62. if (inter1Label == NULL) delete inter1Label;
  63. if (inter2Label == NULL) delete inter2Label;
  64. backFlag = true;
  65. myTimer->stop();
  66. delete myTimer;
  67. myTimer = new QTimer;
  68. QThread::msleep(5);
  69. connect(myTimer, SIGNAL(timeout()), this, SLOT(animate()));
  70. p.drawPixmap(temp2,-5,600,400,QPixmap(back));
  71. p.drawPixmap(temp,-5,600,400,QPixmap(back));
  72. p.drawPixmap(xnenu,250,125,60,QPixmap(leaf));
  73. p.drawPixmap(xnenu2,250,125,60,QPixmap(leaf));
  74. p.drawText(xnenu2+45,290,"x1 = " + QString::number(xnenu2));
  75. p.drawPixmap(xnenu3,250,125,60,QPixmap(leaf));
  76. p.drawText(xnenu3+45,290,"x2 = " + QString::number(xnenu3));
  77. Xsapo=Xsapo-1;
  78. xnenu=xnenu-1;
  79. xnenu2=xnenu2-1;
  80. xnenu3=xnenu3-1;
  81. // para que???
  82. temp= temp - 1;
  83. temp2 = temp2 -1;
  84. repaint();
  85. if(temp == 0 || xnenu3 == -10 || Xsapo == 0){
  86. backFlag = false;
  87. temp = 580;
  88. temp2 = 0;
  89. moved = true;
  90. showText = false;
  91. computeNenuPositions();
  92. }
  93. }
  94. else{
  95. QFont font = p.font();
  96. font.setBold(true);
  97. p.setFont(font);
  98. p.drawPixmap(temp2,-5,600,400,QPixmap(back));
  99. p.drawPixmap(temp,-5,600,400,QPixmap(back));
  100. p.drawPixmap(xnenu,250,125,60,QPixmap(leaf));
  101. p.drawPixmap(xnenu2,250,125,60,QPixmap(leaf));
  102. p.drawPixmap(xnenu3,250,125,60,QPixmap(leaf));
  103. showText = (Ysapo == 190 && Xsapo == xnenu2);
  104. if(showText){
  105. p.drawText(xnenu2+35,290,"x1 = " + QString::number(xnenu2));
  106. p.drawText(xnenu3+35,290,"x2 = " + QString::number(xnenu3));
  107. p.drawPixmap(xnenu,250,125,60,QPixmap(leaf));
  108. }
  109. else
  110. p.drawText(xnenu2+35,290,"x2 = " + QString::number(xnenu2));
  111. }
  112. // Cambiada la condicion para que sea exacta la caida en el nenufar
  113. if(Xsapo > (xnenu + 55) && Ysapo == 190 && Xsapo < (xnenu2-55)
  114. || (Xsapo > (xnenu2 + 55) && Ysapo == 190 && Xsapo < (xnenu3-55))
  115. || (Xsapo > (xnenu3 + 55) && Ysapo == 190)){
  116. // if(Ysapo == 190 && (Xsapo != xnenu && Xsapo != xnenu2 && Xsapo != xnenu3)){
  117. p.drawPixmap(Xsapo, Ysapo + 30, 100, 80, QPixmap(frogger3));
  118. }
  119. else if(Ysapo < 190){
  120. p.drawPixmap(Xsapo,Ysapo,100,100,QPixmap(frogger2));
  121. }else if(Ysapo == 190){
  122. qDebug() << "xsapo: " << Xsapo << "xnenu2: " << xnenu2;
  123. p.drawPixmap(Xsapo,Ysapo,100,100,QPixmap(frogger));
  124. if(!showText){
  125. p.drawText(xnenu+45,290,"x1 = " + QString::number(xnenu+10));
  126. }
  127. }
  128. }
  129. frog::~frog(){
  130. delete myTimer;
  131. }
  132. void frog::animate(){
  133. float interX1 = 0;
  134. float interX2 = 0;
  135. float y = 0;
  136. float xtemp = 0;
  137. float xEnd = 0;
  138. // ~English
  139. // use the functions implemented by the programmer to
  140. // compute the x-intercept.
  141. // ~Spanish
  142. // use las funciones implementadas por el programador para
  143. // computar el valor que intercepta la x
  144. interX1 = QuadraticMinus(A,B,C);
  145. interX2 = QuadraticPlus(A,B,C);
  146. if (interX1 > interX2) std::swap(interX1, interX2);
  147. if (moved) {
  148. moved = false;
  149. initialX = Xsapo;
  150. }
  151. xEnd = interX2 + initialX;
  152. y = 1;
  153. xtemp = 1;
  154. if(!xFlag){
  155. Ysapo = Ysapo - y;
  156. Xsapo = Xsapo + xtemp;
  157. }
  158. else if(xFlag){
  159. Ysapo = Ysapo + y;
  160. Xsapo = Xsapo + xtemp;
  161. }
  162. if(int(Xsapo) == int(xEnd/2)){
  163. xFlag = true;
  164. }
  165. repaint();
  166. if((int(Xsapo) == int(xEnd) && xFlag == true) || Ysapo == 190){
  167. Ysapo = 190;
  168. repaint();
  169. myTimer->stop();
  170. delete myTimer;
  171. myTimer = new QTimer;
  172. connect(myTimer, SIGNAL(timeout()), this, SLOT(animate()));
  173. initialX = Xsapo;
  174. xFlag = false;
  175. }
  176. }
  177. void frog::run(int aa, int bb, int cc){
  178. A = aa;
  179. B = bb;
  180. C = cc;
  181. // buttonCounter++;
  182. connect(myTimer, SIGNAL(timeout()), this, SLOT(animate()));
  183. myTimer->start(25);
  184. }