Созданные ответы форума
-
АвторСообщения
-
А можно фрагмент кода, пожалуйста? В голове не укладывается, как это реализовать?
Столкновение с картой мне определять не нужно( работает по принципу checkCollisionWithMap). Определить нужно другое – с какой стороны шарик подлетел к кирпичику(который на карте желтый). Когда шарик подлетает сверху или снизу, я меняю значение движения y на обратное ему(Умножаю на -1). Но когда шарик влетает в боковую сторону кирпича, он проходит сквозь него и вылетает с другой стороны – это связано с тем что не меняю движение по х. Кирпич у меня воспринимается как единая коллижн модель, поэтому в любой точке пересечения меняется только у. Что бы менять х или у нужно придумать, как шарик поймет с какой стороны к кирпичу он подлетел.
И еще вопрос – можно ли при касании шариком кирпича, “Уничтожить кирпич”( закрасить в цвет фона, обнулить высоту и ширину коллижн модели)?
Вложения:
You must be logged in to view attached files.Пол, стены, потолок заданы “картой”, в которой границы вертикальные заданы буквами “А”, горизонтали – буквами “Б”. На этом основании шарик “знает” какой вектор менять на противоположный для формирования “отскока”.
Препятствия (кирпичи) сформированы как классы, представляют из себя начальную координату по X, Y к которой добавлены высота и ширина. Для формирования “отскока” необходимо шарику “понимать” с какой стороны он коснулся препятствия (снизу, сверху, слева-справа). А если говорить еще точнее, то нужно понимать это горизонтальная плоскость препятствия, или вертикальная?
Ммм. Здорово. А надо делать какое либо объявление для всех этих записей? void TXT(…) например?
Окей, спасибо всем! Вроде как разобрался( сам не понял как, но это, черт возьми, работает!). Шар летает по экрану рикошетит от его стенок =)
Значит переписал код твоего 21 урока под свои цели и вылезла новая ошибка – не инециализирована переменная i в цикле Collision для Ball
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169#include <SFML/Graphics.hpp>#include "map.h"//#include "Ball.h"using namespace sf;float offsetX=0, offsetY=0;class Entity{public:float dx, dy, x, y, speed,moveTimer;//добавили переменную таймер для будущих целейint w,h;//bool life, isMove, onGround;Texture texture;Sprite sprite;String name;Entity(Image &image, float X,float Y,int W,int H,String Name){x=X; y=Y; w=W; h=H; name = Name; moveTimer = 0;speed = 0; dx=0;dy=0;texture.loadFromImage(image);sprite.setTexture(texture);sprite.setOrigin(w / 2, h / 2);}};class Palka:public Entity{public:enum{left,right,stay} state;Palka(Image &image, float X, float Y,int W,int H,String Name):Entity(image,X,Y,W,H,Name){state=stay;if( name == "Plotik"){sprite.setTextureRect(IntRect(4,19,w,h));}}void control(){if(Keyboard::isKeyPressed){if (Keyboard::isKeyPressed(Keyboard::Left)) {state=left;speed = 0.0006;}if (Keyboard::isKeyPressed(Keyboard::Right)) {state = right; speed = 0.0006;}}}void Collision(float Dx,float Dy){for (int i=y/32; i<(y+h)/32; i++)for (int j=x/32; j<(x+w)/32; j++){if((TileMap[i][j] == 'B')||(TileMap[i][j] == 'C')){if (Dx>0){ x = j * 32 - w; }if (Dx<0){ x = j * 32 + 32; }}}}void update(float time){control();switch (state){case right:dx = speed; break;case left:dx = -speed;break;case stay: break;}x+=dx*time;Collision(dx, 0);sprite.setPosition(x+w/2, y + h / 2);}};class Ball:public Entity{public:Ball(Image &image, float X, float Y,int W,int H,String Name):Entity(image,X,Y,W,H,Name){if(name == "Ball"){sprite.setTextureRect(IntRect(0,0,w,h));dx = 0.0003;}}void Collision(float Dx,float Dy){for(int i;i<(y+h)/32;i++)for(int j;j<(x+w)/32;j++){if(TileMap[i][j] =='B'){if (Dy>0){ y = i * 32 - h; }//по Y вниз=>идем в пол(стоим на месте) или падаем. В этот момент надо вытолкнуть персонажа и поставить его на землю, при этом говорим что мы на земле тем самым снова можем прыгатьif (Dy<0){ y = i * 32 + 32; }//столкновение с верхними краями карты(может и не пригодиться)if (Dx>0){ x = j * 32 - w; dx = -0.1; sprite.scale(-1, 1); }//с правым краем картыif (Dx<0){ x = j * 32 + 32; dx = 0.1; sprite.scale(-1, 1); }// с левым краем карты}}}void update(float time){if(name=="Ball"){Collision(dx,0);x+=dx*time;sprite.setPosition(x + w / 2, y + h / 2);}}};int main(){RenderWindow window( VideoMode(1200, 800), "Test!");Image t;t.loadFromFile("fang.png");Image map_image;map_image.loadFromFile("map.png");Texture map;map.loadFromImage(map_image);Sprite s_map;s_map.setTexture(map);Image l;l.loadFromFile("ball.png");Palka p(t,0, 0,40,30,"Plotik");Ball Ball(l, 600,140,200,97,"Ball");Clock clock;//RectangleShape rectangle( Vector2f(32,32));while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();Event event;while(window.pollEvent(event)){if(event.type == Event::Closed)window.close();}p.update(time);Ball.update(time);window.clear(Color::White);for (int i=0; i<H; i++)for (int j=0; j<W ; j++){if (TileMap[i][j]=='B') s_map.setTextureRect(IntRect(0, 0, 32, 32));if (TileMap[i][j]=='A') s_map.setTextureRect(IntRect(64, 0, 32, 32));if (TileMap[i][j]==' ') continue;s_map.setPosition(j*32,i*32) ;window.draw(s_map);}window.draw(p.sprite);window.draw(Ball.sprite);window.display();}return 0;}Нет. Сейчас изучаю 20 и 21 уроки, мб что поможет. Как запущу, отпишусь.
Для движения по Х, да – я проверяю только для движения по горизонтали( rect.left). для движения по вертикали я использую rect.top.
<div id=”crayon-553ccc899b124779723178-85″ class=”crayon-line”>C++1234rect.top += dy * time;Collision();</div>
<div class=”crayon-line crayon-striped-line”>И я допустил ошибку в описании – приложен код полный с Y и отдельно class Ball с пуском по горизонтали</div> -
АвторСообщения