SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Сделать, чтобы событие нажатия клавиши обрабатывалось 1 раз
Помечено: c++ sfml event
В этой теме 5 ответов, 4 участника, последнее обновление MicroSDA 7 года/лет, 10 мес. назад.
Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
-
АвторСообщения
-
Делаю клон 2048, нажатие клавиши расценивается не как одно, а как очень много, зависит еще от того как долго жмёшь. Мне посоветовали через ивент сделать, тоже самое. Привожу на пример код игры
(Прикрепил текстуру если захотите запустить)
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185#include <SFML/Graphics.hpp>#include <iostream>#include <cstdlib>#include <string>#include <iomanip>using namespace sf;using namespace std;int gameField[5][5]={{0,2,2,2,2},{2,0,2,2,2},{0,2,2,2,2},{2,2,0,2,2},{0,2,2,2,2}};int v,vector,score,move=0,tmove;int ir,xr;void randomiz();int step(string vector){if(vector=="w"){for(int s=0;s<=5;s++){for(int i=0;i<=4;i++){//горизонтальfor(int x=1;x<=4;x++){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x-1][i] || gameField[x-1][i]==0){gameField[x-1][i]=gameField[x-1][i]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}} else if(vector=="s"){for(int s=0;s<=5;s++){for(int i=0;i<=4;i++){//горизонтальfor(int x=3;x>=0;x--){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x+1][i] || gameField[x+1][i]==0){gameField[x+1][i]=gameField[x+1][i]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}}else if(vector=="a"){for(int s=0;s<=5;s++){for(int x=0;x<=4;x++){//горизонтальfor(int i=1;i<=4;i++){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x][i-1] || gameField[x][i-1]==0){gameField[x][i-1]=gameField[x][i-1]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}}else if(vector=="d"){for(int s=0;s<=5;s++){for(int x=0;x<=4;x++){//горизонтальfor(int i=3;i>=0;i--){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x][i+1] || gameField[x][i+1]==0){gameField[x][i+1]=gameField[x][i+1]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}} else if(vector=="exit"){exit(0);}move++;cout<<move<<endl;randomiz();return 0;}void randomiz(){int tmp00=0, tmp04=0, tmp44=0, tmp40=0, u=0,z=0;while(u!=1){/*if(tmp00!=gameField[0][0]){break;}if(tmp04!=gameField[0][4]){break;}if(tmp44!=gameField[4][4]){break;}if(tmp40!=gameField[4][0]){break;}*/ir=rand()%5;xr=rand()%5;if(gameField[ir][xr]==0){gameField[ir][xr]=2;u++;}if(gameField[ir][xr]!=0){z++;if (z==5){break;}}}tmp00=gameField[0][0];tmp04=gameField[0][4];tmp44=gameField[4][4];tmp40=gameField[4][0];}void draw(){Clock clock;int q=0;RenderWindow window(sf::VideoMode(536, 640), "2048 epta");Image heroimage;heroimage.loadFromFile("images/2048.png");Texture herotexture;herotexture.loadFromImage(heroimage);Sprite herosprite;herosprite.setTexture(herotexture);herosprite.setTextureRect(IntRect(20,11,104,104));while (window.isOpen()) {float time=clock.getElapsedTime().asMicroseconds();clock.restart();time=time/800;Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}q=0;window.setKeyRepeatEnabled (false);if (event.type == sf::Event::KeyPressed){if (event.key.code == sf::Keyboard::Left) {step("a");}if(event.key.code == sf::Keyboard::Right){ step("d"); }if(event.key.code == sf::Keyboard::Up){ step("w"); }if(event.key.code == sf::Keyboard::Down){ step("s"); }//break;}window.clear(sf::Color(240,240,200));for(int i=0;i<5;i++){for(int w=0;w<5;w++){if (gameField[w][i]==0){herosprite.setTextureRect(IntRect(643,140,104,104));}if (gameField[w][i]==2){herosprite.setTextureRect(IntRect(20,11,104,104));}if (gameField[w][i]==4){herosprite.setTextureRect(IntRect(139,12,104,104));}if (gameField[w][i]==8){herosprite.setTextureRect(IntRect(262,12,104,104));}if (gameField[w][i]==16){herosprite.setTextureRect(IntRect(386,12,104,104));}if (gameField[w][i]==32){herosprite.setTextureRect(IntRect(518,13,104,104));}if (gameField[w][i]==64){herosprite.setTextureRect(IntRect(644,15,104,104));}if (gameField[w][i]==128){herosprite.setTextureRect(IntRect(19,138,104,104));}if (gameField[w][i]==256){herosprite.setTextureRect(IntRect(144,136,104,104));}if (gameField[w][i]==512){herosprite.setTextureRect(IntRect(266,137,104,104));}if (gameField[w][i]==1024){herosprite.setTextureRect(IntRect(392,136,104,104));}if (gameField[w][i]==2048){herosprite.setTextureRect(IntRect(521,138,104,104));}herosprite.setPosition(i*108,w*108);window.draw(herosprite);}}window.display();}}int main(){draw();return 0;}Вложения:
You must be logged in to view attached files.C++12345678sf::Event::KeyPressed // Если клавиша нажатаsf::Event::KeyReleased // Если клавиша отжата//Для одиночного, или безприрывное нажатия клавишь логические переменные в помощь.//Если нужно плавное движение, то обрабатывай логическую переменную по времени,//если однократное то в условии sf::Event::KeyPressed выполняешь действие//пока логика не true, устанавливаешь логику на true,//а в sf::Event::KeyReleased возвращаешь логику к false;Так надо было сделать? Всё равно не работает.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190#include <SFML/Graphics.hpp>#include <iostream>#include <cstdlib>#include <string>#include <iomanip>using namespace sf;using namespace std;int gameField[5][5]={{0,2,0,2,0},{2,0,2,2,2},{0,2,0,0,0},{2,0,0,2,2},{0,0,2,0,2}};bool a=false,d=false,w=false,s=false;int v,vector,score,move=0,tmove;int ir,xr;void randomiz();int step(){if(w==true){for(int s=0;s<=5;s++){for(int i=0;i<=4;i++){//горизонтальfor(int x=1;x<=4;x++){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x-1][i] || gameField[x-1][i]==0){gameField[x-1][i]=gameField[x-1][i]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}} else if(s==true){for(int s=0;s<=5;s++){for(int i=0;i<=4;i++){//горизонтальfor(int x=3;x>=0;x--){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x+1][i] || gameField[x+1][i]==0){gameField[x+1][i]=gameField[x+1][i]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}}else if(a==true){for(int s=0;s<=5;s++){for(int x=0;x<=4;x++){//горизонтальfor(int i=1;i<=4;i++){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x][i-1] || gameField[x][i-1]==0){gameField[x][i-1]=gameField[x][i-1]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}}else if(d==true){for(int s=0;s<=5;s++){for(int x=0;x<=4;x++){//горизонтальfor(int i=3;i>=0;i--){//вертикаль//на всякий случай) [строка][столбец]if(gameField[x][i]==gameField[x][i+1] || gameField[x][i+1]==0){gameField[x][i+1]=gameField[x][i+1]+gameField[x][i];gameField[x][i]=0;//draw();//system("cls");}}}}} else if(move=10000){exit(0);}move++;cout<<move<<endl;randomiz();}void randomiz(){int tmp00=0, tmp04=0, tmp44=0, tmp40=0, u=0,z=0;while(u!=1){/*if(tmp00!=gameField[0][0]){break;}if(tmp04!=gameField[0][4]){break;}if(tmp44!=gameField[4][4]){break;}if(tmp40!=gameField[4][0]){break;}*/ir=rand()%5;xr=rand()%5;if(gameField[ir][xr]==0){gameField[ir][xr]=2;u++;}if(gameField[ir][xr]!=0){z++;if (z==5){break;}}}tmp00=gameField[0][0];tmp04=gameField[0][4];tmp44=gameField[4][4];tmp40=gameField[4][0];}void draw(){Clock clock;int q=0;RenderWindow window(sf::VideoMode(536, 640), "2048 epta");Image heroimage;heroimage.loadFromFile("images/2048.png");Texture herotexture;herotexture.loadFromImage(heroimage);Sprite herosprite;herosprite.setTexture(herotexture);herosprite.setTextureRect(IntRect(20,11,104,104));while (window.isOpen()) {float time=clock.getElapsedTime().asMicroseconds();clock.restart();time=time/800;Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}q=0;window.setKeyRepeatEnabled (false);if (event.type == sf::Event::KeyPressed){a=false,d=false,w=false,s=false;if (event.key.code == sf::Keyboard::Left) {a=true;}if(event.key.code == sf::Keyboard::Right){ d=true; }if(event.key.code == sf::Keyboard::Up){ w=true; }if(event.key.code == sf::Keyboard::Down){ s=true; }//break;step();}window.clear(sf::Color(240,240,200));for(int i=0;i<5;i++){for(int w=0;w<5;w++){if (gameField[w][i]==0){herosprite.setTextureRect(IntRect(643,140,104,104));}if (gameField[w][i]==2){herosprite.setTextureRect(IntRect(20,11,104,104));}if (gameField[w][i]==4){herosprite.setTextureRect(IntRect(139,12,104,104));}if (gameField[w][i]==8){herosprite.setTextureRect(IntRect(262,12,104,104));}if (gameField[w][i]==16){herosprite.setTextureRect(IntRect(386,12,104,104));}if (gameField[w][i]==32){herosprite.setTextureRect(IntRect(518,13,104,104));}if (gameField[w][i]==64){herosprite.setTextureRect(IntRect(644,15,104,104));}if (gameField[w][i]==128){herosprite.setTextureRect(IntRect(19,138,104,104));}if (gameField[w][i]==256){herosprite.setTextureRect(IntRect(144,136,104,104));}if (gameField[w][i]==512){herosprite.setTextureRect(IntRect(266,137,104,104));}if (gameField[w][i]==1024){herosprite.setTextureRect(IntRect(392,136,104,104));}if (gameField[w][i]==2048){herosprite.setTextureRect(IntRect(521,138,104,104));}herosprite.setPosition(i*108,w*108);window.draw(herosprite);}}window.display();}}int main(){draw();return 0;}То что написал Heisenberg выше попробуй запихнуть в цикл событий while (window.pollEvent(event))
Да, всё заработало! Спасибо!
.
-
АвторСообщения
Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
Для ответа в этой теме необходимо авторизоваться.