SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › создание копии объекта при нажатии на его спрайт и ее передвижение
В этой теме 8 ответов, 2 участника, последнее обновление Mezotron 7 года/лет, 11 мес. назад.
-
АвторСообщения
-
как реализовать копирование объекта и перемещение его копии
C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697int main(){RenderWindow window(VideoMode(1280, 700), "Lesson 22. kychka-pc.ru");int count;float timer = 0;count = 0;Level lvl;//создали экземпляр класса уровеньlvl.LoadFromFile("map.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает.Image easyEnemyImage;easyEnemyImage.loadFromFile("B1.png");Image TowerImage;TowerImage.loadFromFile("B2.png");list<Entity*>entites;list<Entity*>::iterator it;Object e = lvl.GetObject("easyEnemy");list<Tower*>towers;list<Tower*>::iterator wit;Object tw = lvl.GetObject("tower");Object TowerObject = lvl.GetObject("tower1");Tower Tower1(TowerImage, "tower1", lvl, TowerObject.rect.left, TowerObject.rect.top, 32, 32);bool isMowe = false;float dX = 0;float dY = 0;Clock clock;while (window.isOpen()){ float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 1000;timer += time;if (timer >= 1000 && count < 10){entites.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, e.rect.left, e.rect.top, 32, 32));count++;timer -= 1000;}Vector2i pixelPos = Mouse::getPosition(window);Vector2f pos = window.mapPixelToCoords(pixelPos);Event event;while (window.pollEvent(event)){ if (event.type==Event::MouseButtonPressed)if (event.key.code==Mouse::Left)if (Tower1.sprite.getGlobalBounds().contains(pos.x, pos.y)){dX = pos.x - Tower1.sprite.getPosition().x + 10;dY = pos.y - Tower1.sprite.getPosition().y + 10;isMowe = true;}if (event.type == Event::MouseButtonReleased)//если отпустили клавишуif (event.key.code == Mouse::Left) //а именно левуюisMowe = false; //то не можем двигать спрайтTower1.sprite.setColor(Color::White);//и даем ему прежний цвет}if (isMowe){Tower1.sprite.setColor(Color::Green);Tower1.x = pos.x - dX;Tower1.y = pos.y - dY;}for (it = entites.begin(); it != entites.end();it++){(*it)->update(time);}Tower1.update(time);window.clear(Color(77, 83, 140));lvl.Draw(window);//рисуем новую картуfor (it = entites.begin(); it != entites.end(); it++){window.draw((*it)->sprite);}window.draw(Tower1.sprite);window.display();}return 0;}создай спрайт пустышку для отображения копии объекта возле курсора мышки
C++123456789101112131415161718192021Sprite pustishka(...)if (event.type==Event::MouseButtonPressed)if (event.key.code==Mouse::Left)if (Tower1.sprite.getGlobalBounds().contains(pos.x, pos.y)){dX = pos.x - Tower1.sprite.getPosition().x + 10;dY = pos.y - Tower1.sprite.getPosition().y + 10;isMowe = true;}if (event.type == Event::MouseButtonReleased) {if (event.key.code == Mouse::Left) {isMowe = false;Tower1.sprite.setColor(Color::White);towers.push_back(new Tower(...))}if(isMowe) {Tower1.sprite.setColor(Color::Green);Tower1.x = pos.x - dX;Tower1.y = pos.y - dY;window.draw(pustishka.sprite);}}Короче
C++1234567if (event.type == Event::MouseButtonReleased)if (event.key.code == Mouse::Left) {isMowe = false;towers.push_back( new Tower(...) )}if(isMowe) window.draw(pust.sprite);вместо … что то надо писать?
Когда ты нажимаешь кнопку мышки, устанавливаешь логическую на true, и пока она true – отображаешь спрайт пустышку с текстурой башенки, как отпускаешь кнопку мышки, создаёшь в позиции курсора новый объект листа (то есть башенку) и логическую устанавливаешь на false.
Пока она будет false, пустышка спрайт не будет отображаться.C++1if(isMowe) window.draw(pust.sprite);C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130#include <SFML/Graphics.hpp>#include "view.h"#include <iostream>#include <sstream>#include "iostream"#include "level.h"#include <vector>#include <list>#include "TinyXML/tinyxml.h"#include "Entity.h"#include "Enemy.h"#include "Tower.h"using namespace sf;int main(){RenderWindow window(VideoMode(1280, 700), "Lesson 22. kychka-pc.ru");int count;float timer = 0;count = 0;Level lvl;//создали экземпляр класса уровеньlvl.LoadFromFile("map.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает.Image easyEnemyImage;easyEnemyImage.loadFromFile("B1.png");Image TowerImage;TowerImage.loadFromFile("B2.png");list<Entity*>entites;list<Entity*>::iterator it;Object e = lvl.GetObject("easyEnemy");list<Tower*>towers;list<Tower*>::iterator wit;Object TowerObject = lvl.GetObject("tower1");//Object TowerObject = lvl.GetObject("tower1");//Tower Tower1(TowerImage, "tower1", lvl, TowerObject.rect.left, TowerObject.rect.top, 32, 32);bool isMowe = false;float dX = 0;float dY = 0;Clock clock;while (window.isOpen()){ float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 1000;timer += time;if (timer >= 1000 && count < 10){entites.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, e.rect.left, e.rect.top, 32, 32));count++;timer -= 1000;}Vector2i pixelPos = Mouse::getPosition(window);Vector2f pos = window.mapPixelToCoords(pixelPos);Texture pus;pus.loadFromFile("pust.png");Sprite pust;pust.setTexture(pus);pust.setTextureRect(IntRect(0, 0, 32, 32));Event event;while (window.pollEvent(event)){ if (event.type==Event::MouseButtonPressed)if (event.key.code==Mouse::Left)if (TowerObject.sprite.getGlobalBounds().contains(pos.x, pos.y)){dX = pos.x - TowerObject.sprite.getPosition().x + 16;dY = pos.y - TowerObject.sprite.getPosition().y + 16;isMowe = true;}if (event.type == Event::MouseButtonReleased)//если отпустили клавишуif (event.key.code == Mouse::Left) //а именно левуюisMowe = false; //то не можем двигать спрайтTowerObject.sprite.setColor(Color::White);//и даем ему прежний цветtowers.push_back(new Tower(TowerImage, "tower1", lvl, TowerObject.rect.left, TowerObject.rect.top, 32, 32));}if (isMowe){TowerObject.sprite.setColor(Color::Green);TowerObject.x = pos.x - dX;//тут матерится на xTowerObject.y = pos.y - dY;//тут на ywindow.draw(pust);}for (it = entites.begin(); it != entites.end();it++){(*it)->update(time);}for (wit = towers.begin(); wit != towers.end(); wit++){(*wit)->update(time);}//Tower1.update(time);window.clear(Color(77, 83, 140));lvl.Draw(window);//рисуем новую картуfor (it = entites.begin(); it != entites.end(); it++){window.draw((*it)->sprite);}for (wit = towers.begin(); wit != towers.end(); wit++){window.draw((*wit)->sprite);}// window.draw(Tower1.sprite);window.display();}return 0;}Где фигурные скобки?
и window.draw(pust); //(pust.sprite)
должен быть после window.clear();И что у тебя делает
Texture pus;pus.loadFromFile(“pust.png”);Sprite pust;pust.setTexture(pus);pust.setTextureRect(IntRect(0, 0, 32, 32));
Внутри главного цикла?
и вообще правильнее будет isMove
это исправил но ругается на x и y на 96 97 строчках
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104int main(){RenderWindow window(VideoMode(1280, 700), "Lesson 22. kychka-pc.ru");int count;float timer = 0;count = 0;Level lvl;//создали экземпляр класса уровеньlvl.LoadFromFile("map.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает.Image easyEnemyImage;easyEnemyImage.loadFromFile("B1.png");Image TowerImage;TowerImage.loadFromFile("B2.png");list<Entity*>entites;list<Entity*>::iterator it;Object e = lvl.GetObject("easyEnemy");list<Entity*>towers;list<Entity*>::iterator wit;Object tw1 = lvl.GetObject("tower1");bool isMove = false;float dX = 0;float dY = 0;Clock clock;while (window.isOpen()){ float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 1000;timer += time;if (timer >= 1000 && count < 10){entites.push_back(new Enemy(easyEnemyImage, "EasyEnemy", lvl, e.rect.left, e.rect.top, 32, 32));count++;timer -= 1000;}Vector2i pixelPos = Mouse::getPosition(window);Vector2f pos = window.mapPixelToCoords(pixelPos);Event event;while (window.pollEvent(event)){ if (event.type==Event::MouseButtonPressed)if (event.key.code==Mouse::Left)if (tw1.sprite.getGlobalBounds().contains(pos.x, pos.y)){dX = pos.x - tw1.sprite.getPosition().x + 16;dY = pos.y - tw1.sprite.getPosition().y + 16;isMove = true;}if (event.type == Event::MouseButtonReleased)//если отпустили клавишуif (event.key.code == Mouse::Left) //а именно левую{isMove = false; //то не можем двигать спрайтtw1.sprite.setColor(Color::White);//и даем ему прежний цветtowers.push_back(new Tower(TowerImage, "tower1", lvl, tw1.rect.left, tw1.rect.top, 32, 32));}}if (isMove){tw1.x = pos.x - dX;//<- тутtw1.y = pos.y - dY;//<- тут}for (it = entites.begin(); it != entites.end();it++){(*it)->update(time);}for (wit = towers.begin(); wit != towers.end(); wit++){(*wit)->update(time);}//Tower1.update(time);window.clear(Color(77, 83, 140));lvl.Draw(window);//рисуем новую картуfor (it = entites.begin(); it != entites.end(); it++){window.draw((*it)->sprite);}for (wit = towers.begin(); wit != towers.end(); wit++){window.draw((*wit)->sprite);}window.display();}return 0;}error C2039:’x': is not a member of ‘Object’
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.