SFML и C++ Уроки \ Разработка игр › Форумы › SFML готовые решения (сниппеты) и советы › Идея создания инвентаря через массив
Помечено: инвентарь
В этой теме 4 ответа, 3 участника, последнее обновление SadHermit 8 года/лет, 2 мес. назад.
-
АвторСообщения
-
Здравствуйте. Вот для курсовой делал инвентарь, он, конечно, не особо функциональный, но для начала сойдёт. Заранее извиняюсь за отсутствие стиля.
И так.
Для начала я создал .h файл, в котором(подобно уроку с картой) создал массивC++123456789101112131415#include <SFML/Graphics.hpp>#include <iostream>const int HEIGHT_INVENTORY = 7;const int WIDTH_INVENTORY = 11;sf::String TileInventory[HEIGHT_INVENTORY] = {"pblhs0nf "," b "," s "," f l "," p "," s s0 "," n ",};теперь загрузил картинку инвентаря
C++12345678Image quest_image;quest_image.loadFromFile("images/inventory.png");quest_image.createMaskFromColor(Color(0, 0, 0));Texture quest_texture;quest_texture.loadFromImage(quest_image);Sprite s_quest;s_quest.setTexture(quest_texture);s_quest.setTextureRect(IntRect(0, 0, 610, 381));загрузил её в windows.draw и приступил к заполнению самого инвентаря
Я создал сет иконок вооружения и брони ,и загрузил их в main()C++123456Image weaponimage;weaponimage.loadFromFile("images/weapon.png");Texture weapontexture;weapontexture.loadFromImage(weaponimage);Sprite weapon;weapon.setTexture(weapontexture);А теперь я прошёлся по массиву символов и вывел иконки на фоне инвентаря.
C++1234567891011121314151617if(p.inventory){for (int i = 0; i < HEIGHT_INVENTORY; i++)for (int j = 0; j < WIDTH_INVENTORY; j++){if (TileInventory[i][j] == ' ') weapon.setTextureRect(IntRect(289, 0, 32, 32));if (TileInventory[i][j] == 's') weapon.setTextureRect(IntRect(32, 0, 32, 32));if ((TileInventory[i][j] == '0')) weapon.setTextureRect(IntRect(64, 0, 32, 32));if ((TileInventory[i][j] == 'f')) weapon.setTextureRect(IntRect(96, 0, 32, 32));if ((TileInventory[i][j] == 'h')) weapon.setTextureRect(IntRect(128, 0, 32, 32));if ((TileInventory[i][j] == 'l')) weapon.setTextureRect(IntRect(160, 0, 32, 32));if ((TileInventory[i][j] == 'b')) weapon.setTextureRect(IntRect(192, 0, 32, 32));if ((TileInventory[i][j] == 'n')) weapon.setTextureRect(IntRect(224, 0, 32, 32));if ((TileInventory[i][j] == 'p')) weapon.setTextureRect(IntRect(0, 0, 32, 32));weapon.setPosition((view.getCenter().x + 312)+j*34, (view.getCenter().y-89)+i*43);window.draw(weapon);}}Вот и всё! Заранее заданный инвентарь готов, но увы взаимодействие я сделать не смог, мозгов не хватило. Есть небольшой прототип, который при нажатии лкм на иконку изменяет её, но он криво работает
C++123456789101112131415161718192021222324252627282930bool act=true;if (event.type == Event::MouseButtonPressed)//если нажата клавиша мышиif (event.key.code == Mouse::Left)//а именно леваяif (pos.x>view.getCenter().x+312&&pos.y>view.getCenter().y-89&&(pos.x<(view.getCenter().x+312)+11*34)&&(pos.y<(view.getCenter().y-89)+7*43)){if(act){if(act)for (int i = floor((pos.y-view.getCenter().y-89) / 43);i<7; i++)//if(il!=i)if(act)for (int j = floor((pos.x-(view.getCenter().x+312 ))/ 34);j<11; j++)//if(j!=jl||i!=il)if (((TileInventory[i][j] == '0')||(TileInventory[i][j] == 's'))){//jl=j;TileInventory[i][j] = ' ';act=false;}break;}break;}break;if (event.type == Event::MouseButtonReleased)if (event.key.code == Mouse::Left)act=true;}И спасибо Павлу Букрееву за создание столь замечательного сайта.
ИнвентарьТебе спасибо за такую замечательную тему и подробность))
Может когда-нибудь захочешь написать что нибудь в свободной базе знаний – wiki sfml , вот ссылка
https://kychka-pc.ru/wiki/svobodnaya-baza-znanij-sfml
Реализовал взаимодействие со всеми иконками,теперь при нажатии на иконку она изменяется на белую По мере разработки буду дополнять код.
C++1234567891011121314151617181920212223242526272829303132333435if (event.type == Event::MouseButtonPressed)//если нажата клавиша мышиif (event.key.code == Mouse::Left)//а именно леваяif (pos.x>view.getCenter().x+312&&pos.y>view.getCenter().y-89&&(pos.x<(view.getCenter().x+312)+11*34)&&(pos.y<(view.getCenter().y-89)+7*43)){if(act){if(act)for (int i = floor((pos.y-view.getCenter().y-89) / 43);i<7; i++)////if(il!=i)if(act)for (int j = floor((pos.x-(view.getCenter().x+312 ))/ 34);j<11; j++)a=floor((pos.y-(view.getCenter().y-89))/43);b=floor((pos.x-(view.getCenter().x+312 ))/ 34);//if(j!=jl||i!=il)if (((TileInventory[a][b] == '0')||(TileInventory[a][b] == 's')||(TileInventory[a][b] == 'h')||(TileInventory[a][b] == 'f')||(TileInventory[a][b] == 'b')||(TileInventory[a][b] == 'l')||(TileInventory[a][b] == 'p')||(TileInventory[a][b] == 'n'))){//jl=j;TileInventory[a][b] = ' ';act=false;// dX = pos.x - (view.getCenter().x + 312)+j*34;//делаем разность между позицией курсора и спрайта.для корректировки нажатия// dY = pos.y - (view.getCenter().y-89)+i*43;//тоже самое по игрекуgoto U;isMove = true;//можем двигать спрайт}}break;}break;U:if (event.type == Event::MouseButtonReleased)if (event.key.code == Mouse::Left)act=true;isMove = false;}Всё, вот вам полностью реализованный инвентарь. a,b,c,d заранее оглашены в int main()
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192if (event.type == Event::MouseButtonPressed)//если нажата клавиша мышиif (event.key.code == Mouse::Left)//а именно леваяif (pos.x>view.getCenter().x+312&&pos.y>view.getCenter().y-89&&(pos.x<(view.getCenter().x+312)+11*34)&&(pos.y<(view.getCenter().y-89)+7*43)){for (int i = floor((pos.y-view.getCenter().y-89) / 43);i<7; i++)////if(il!=i)if(act)for (int j = floor((pos.x-(view.getCenter().x+312 ))/ 34);j<11; j++)a=floor((pos.y-(view.getCenter().y-89))/43);b=floor((pos.x-(view.getCenter().x+312 ))/ 34);//if(j!=jl||i!=il)if (TileInventory[a][b] == '0'){z='0';isMove = true;}if (TileInventory[a][b] == 's'){z='s';isMove = true;}if (TileInventory[a][b] == 'h'){z='h';isMove = true;}if (TileInventory[a][b] == 'f'){z='f';isMove = true;}if (TileInventory[a][b] == 'b'){z='b';isMove = true;}if (TileInventory[a][b] == 'l'){z='l';isMove = true;}if (TileInventory[a][b] == 'p'){z='p';isMove = true;}if (TileInventory[a][b] == 'n'){z='n';isMove = true;}TileInventory[a][b] = ' ';}}if (event.type == Event::MouseButtonReleased)//если отпустили клавишуif (event.key.code == Mouse::Left){ //а именно левуюisMove = false; //то не можем двигать спрайif (pos.x>view.getCenter().x+312&&pos.y>view.getCenter().y-89&&(pos.x<(view.getCenter().x+312)+11*34)&&(pos.y<(view.getCenter().y-89)+7*43)){for (int i = floor((pos.y-view.getCenter().y-89) / 43);i<7; i++)//for (int j = floor((pos.x-(view.getCenter().x+312 ))/ 34);j<11; j++)c=floor((pos.y-(view.getCenter().y-89))/43);d=floor((pos.x-(view.getCenter().x+312 ))/ 34);TileInventory[c][d] = z;}else TileInventory[a][b] = z;}А что еще подключено? А то у меня quest не распознает вообще никак
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.