Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
#include "Entity.hpp" using namespace std; void Game(bool *error, vector<Attack> vector_list); void AttackEditor(bool *error, vector<Attack> &vector_list); int main() { bool error; int input; vector<Attack> attack_list; cout<<"BATTLE ARENA SYSTEM v0.1" <<"\n\n\nWhat are you gonna do?" <<"\n1. Play" <<"\n2. Edit Attacks" <<"\nPlease enter a number: "; cin>>input; switch (input) { case 1: Game(&error, attack_list); break; case 2: AttackEditor(&error, attack_list); break; default: break; } cout<<endl; return 0; } void Game(bool *error, vector<Attack> vector_list) { *error = false; while(*error == false) { ifstream input("Attack_List.cfd"); if(input.is_open() == false){cout<<"Failed to open: Attack_List.cfd"; *error = true; break;} cout<<"Loading files...\n"; input.read((char *) &vector_list, sizeof(vector_list)); //In der nächsten Zeile hakt es... for(int i=0;i<static_cast<int>(vector_list.size());i++){input.read((char *) &vector_list[i], sizeof(vector_list[i]));} //Das Programm ist abgestürzt; beim Debuggen taucht der Fehler auf: //Unbehandelte Ausnahme bei 0x0FD70E9A (msvcr110d.dll) in RPG_Battle_Arena.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00FCA508 cout<<"Sucessfully loaded files.\n"; input.close(); break; } Entity Player("Pwalb", 1250, 64, 600); Entity Enemy("Danarius", 24000, 0, 300); srand (time(NULL)); int input; cout<<"\n"<<Player.get_name()<<" - HP: "<<Player.get_int("e_curHP")<<", MP: "<<Player.get_int("e_curMP") <<"\n"<<Enemy.get_name()<<" - HP: "<<Enemy.get_int("e_curHP"); do{ //Player's turn cout<<"\n\nWhat are you gonna do?: "; cout<<"\n0. Quit"; cout<<"\n1. Attack"; cout<<"\n2. Heal"; cout<<"\n3. Energy Beam"; cout<<"\nPlease enter a number: "; cin>>input; switch(input) { case 0: cout<<"\nGame is closing..."; break; case 1: Player.cast_skill(vector_list[0], Enemy); break; case 2: Player.cast_skill(vector_list[1], Player); break; case 3: Player.cast_skill(vector_list[2], Enemy); break; default: cout<<"\nInvalid input, try again!"; continue; } if(input == 0){break;} if(Player.get_int("e_curHP") > Player.get_int("e_maxHP")){Player.set_stats(Player.get_int("e_maxHP"), Player.get_int("e_curMP"), Player.get_int("e_attack_damage"));} if(Player.get_int("e_curHP") <= 0) { Player.set_stats(0, Player.get_int("e_curMP"), Player.get_int("e_attack_damage")); cout<<"\n\nYou died! "<<Enemy.get_name()<<" wins the fight!"; input = 0; } if(Enemy.get_int("e_curHP") <= 0) { Enemy.set_stats(0, Enemy.get_int("e_curMP"), Enemy.get_int("e_attack_damage")); cout<<"\n\n"<<Enemy.get_name()<<" died! You win the fight!"; input = 0; } if(input == 0){break;} //Boss's turn Enemy.cast_skill(vector_list[0], Player); if(Player.get_int("e_curHP") <= 0) { Player.set_stats(0, Player.get_int("e_curMP"), Player.get_int("e_attack_damage")); cout<<"\n\nYou die! "<<Enemy.get_name()<<" wins the fight!"; input = 0; } if(Enemy.get_int("e_curHP") <= 0) { Enemy.set_stats(0, Enemy.get_int("e_curMP"), Enemy.get_int("e_attack_damage")); cout<<"\n\n"<<Enemy.get_name()<<" die! You win the fight!"; input = 0; } //Ab hier ist es das erste mal abgestürzt, danach nie wieder cout<<"\n\n"<<Player.get_name()<<" - HP: "<<Player.get_int("e_curHP")<<", MP: "<<Player.get_int("e_curMP") <<"\n"<<Enemy.get_name()<<" - HP: "<<Enemy.get_int("e_curHP"); }while(input != 0); } void AttackEditor(bool *error, vector<Attack> &vector_list) { *error=false; Attack *temp = NULL; temp = new Attack("Attack", 1.0f, 0.2f, 0); vector_list.push_back(*temp); temp = new Attack("Heal", -1.0f, 0.1f, 6); vector_list.push_back(*temp); temp = new Attack("Energy Beam", 4.0f, 0.2f, 4); vector_list.push_back(*temp); cout<<sizeof(vector_list)<<endl <<sizeof(vector_list[0])<<endl <<sizeof(vector_list[1])<<endl <<sizeof(vector_list[2])<<endl <<vector_list.size()<<endl; while(*error == false) { ofstream output("Attack_List.cfd"); if(!output.is_open()){cout<<"Failed to open: Attack_List.cfd"; *error = true; break;} cout<<"Saving files...\n"; output.write((char *) &vector_list, sizeof(vector_list)); for(int i=0;i<static_cast<int>(vector_list.size());i++){output.write((char *) &vector_list[i], sizeof(vector_list[i]));} cout<<"Sucessfully saved files.\n"; output.close(); break; } } |
Du schreibst den vector selbst und alle Elemente darin binär auf die Platte. Was ein "Attack" ist, weiß ich nicht, aber ein vector ist nicht viel mehr als ein paar Zeiger. Zeiger sind Adressen von allokiertem Speicher. Wenn Du die Adresse speicherst und beim nächsten Programmstart wieder lädst, wird die Adresse der Zahl nach rekonstruiert, aber nicht die Allokation, auf die der Zeiger ursprünglich gezeigt hat. Bitte speichere nur elementare Datentypen wie int oder float mittels read() oder write();
Der Rest des Codes enthält auch noch einige Aua-Momente, aber das kommt später.
Zitat
Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.
Administrator
Werbeanzeige