// Throws if the field or its class is not found. extern "C" void* j3StaticFieldLookup(UserClass* caller, uint32 index) { void* res = 0; UserConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { res = ctpInfo->ctpRes[index]; } else { UserCommonClass* cl = 0; UserClass* fieldCl = 0; const UTF8* utf8 = 0; Typedef* sign = 0; ctpInfo->resolveField(index, cl, utf8, sign); assert(cl->asClass() && "Lookup a field of something not an array"); JavaField* field = cl->asClass()->lookupField(utf8, sign->keyName, true, true, &fieldCl); fieldCl->initialiseClass(JavaThread::get()->getJVM()); void* obj = ((UserClass*)fieldCl)->getStaticInstance(); assert(obj && "No static instance in static field lookup"); void* ptr = (void*)((uint64)obj + field->ptrOffset); ctpInfo->ctpRes[index] = ptr; res = ptr; } return res; }
/*モードチェンジ*/ void TextClass::ModeChange(int &ModeFlag,int &ChangeFlag,UserClass &User){ //インスタンス化 MouseClass* Mouse = MouseClass::GetInstance(); AnimeClass Anime; static int Count = 0; const int AtherSelect = -1; //タイマー static int Timer = 0; if( WriteMode != NOTWINDOW ) Timer++; //モードチェンジ if( Mouse->GetState(MOUSE::LEFT) == TRUE ){ if( Select == GAME_MENU::SAVE ) ModeFlag = MODE::SAVE; if( Select == GAME_MENU::LOAD ) ModeFlag = MODE::LOAD; if( Select == GAME_MENU::BACKLOG ) WriteMode = BACKLOG; if( Select == GAME_MENU::CONFIG ) ModeFlag = MODE::CONFIG; if( Select == GAME_MENU::AUTO ) AutoFlag *= -1; ChangeFlag = TRUE; } //ウィンドウ非表示 /* if( Mouse->GetState( MOUSE::RIGHT) > 0 && WriteMode == NORMAL && Timer > 20 ){ WriteMode = NOTWINDOW; Timer = 0; } */ //バックログ if( Mouse->GetWheel() > 0 && WriteMode == NORMAL ) WriteMode = BACKLOG; //エンディングモードへ if( WriteMode == END ){ //&& Mouse->GetState(MOUSE::LEFT) > 10 ){ Select = AtherSelect; WriteMode = NORMAL; ModeFlag = MODE::END; //ModeFlag = MODE::OTHER; //User.SetPage( PAGE::TITLE ); } //タイトル画面へ if( WriteMode == TITLE ){ Count++; DrawBox(0,0,windowX,windowY,GetColor(0,0,0),TRUE); SetFontSize(100); ChangeFont("MS 明朝"); DrawString(windowX/3,windowY/3,"- FIN - ",GetColor(255,255,255)); User.SetBGMCode( GAME_BGM::STOP ); if( Count > 200 ){ WriteMode = NORMAL; ModeFlag = MODE::OTHER; User.SetPage( PAGE::TITLE ); Count = 0; } } }
extern "C" void* j3ResolveStaticStub() { JavaThread *th = JavaThread::get(); void* result = NULL; // Lookup the caller of this class. vmkit::StackWalker Walker(th); ++Walker; // Remove the stub. vmkit::FrameInfo* FI = Walker.get(); assert(FI->Metadata != NULL && "Wrong stack trace"); JavaMethod* caller = (JavaMethod*)FI->Metadata; // Lookup the method info in the constant pool of the caller. uint16 ctpIndex = caller->lookupCtpIndex(FI); assert(ctpIndex && "No constant pool index"); JavaConstantPool* ctpInfo = caller->classDef->getConstantPool(); CommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; ctpInfo->resolveMethod(ctpIndex, cl, utf8, sign); UserClass* lookup = cl->isArray() ? cl->super : cl->asClass(); assert(lookup->isInitializing() && "Class not ready"); JavaMethod* callee = lookup->lookupMethod(utf8, sign->keyName, true, true, 0); // Compile the found method. result = callee->compiledPtr(); // Update the entry in the constant pool. ctpInfo->ctpRes[ctpIndex] = result; return result; }
// Throws if the field is not found. extern "C" void* j3VirtualFieldLookup(UserClass* caller, uint32 index) { void* res = 0; UserConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { res = ctpInfo->ctpRes[index]; } else { UserCommonClass* cl = 0; const UTF8* utf8 = 0; Typedef* sign = 0; ctpInfo->resolveField(index, cl, utf8, sign); UserClass* lookup = cl->isArray() ? cl->super : cl->asClass(); JavaField* field = lookup->lookupField(utf8, sign->keyName, false, true, 0); ctpInfo->ctpRes[index] = (void*)(intptr_t)field->ptrOffset; res = (void*)(intptr_t)field->ptrOffset; } return res; }
UserClass* JnjvmClassLoader::constructClass(const UTF8* name, ClassBytes* bytes) { JavaObject* excp = NULL; llvm_gcroot(excp, 0); UserClass* res = NULL; lock2.lock(); classes->lock.lock(); res = (UserClass*) classes->map.lookup(name); classes->lock.unlock(); if (res == NULL) { TRY { const UTF8* internalName = readerConstructUTF8(name->elements, name->size); res = new(allocator, "Class") UserClass(this, internalName, bytes); res->readClass(); res->makeVT(); getCompiler()->resolveVirtualClass(res); getCompiler()->resolveStaticClass(res); classes->lock.lock(); assert(res->getDelegatee() == NULL); assert(res->getStaticInstance() == NULL); assert(classes->map.lookup(internalName) == NULL); classes->map[internalName] = res; classes->lock.unlock(); } CATCH { excp = JavaThread::get()->pendingException; JavaThread::get()->clearException(); } END_CATCH; }
// Throws if the method is not found. extern "C" uint32 j3VirtualTableLookup(UserClass* caller, uint32 index, uint32* offset, JavaObject* obj) { llvm_gcroot(obj, 0); uint32 res = 0; UserCommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; caller->getConstantPool()->resolveMethod(index, cl, utf8, sign); UserClass* lookup = cl->isArray() ? cl->super : cl->asClass(); JavaMethod* dmeth = lookup->lookupMethodDontThrow(utf8, sign->keyName, false, true, 0); if (!dmeth) { assert((JavaObject::getClass(obj)->isClass() && JavaObject::getClass(obj)->asClass()->isInitializing()) && "Class not ready in a virtual lookup."); // Arg, the bytecode is buggy! Perform the lookup on the object class // and do not update offset. lookup = JavaObject::getClass(obj)->isArray() ? JavaObject::getClass(obj)->super : JavaObject::getClass(obj)->asClass(); dmeth = lookup->lookupMethod(utf8, sign->keyName, false, true, 0); } else { *offset = dmeth->offset; } assert(dmeth->classDef->isInitializing() && "Class not ready in a virtual lookup."); res = dmeth->offset; return res; }
/*ゲームカウント初期化*/ void TextClass::InitGameCount(UserClass& User){ //ゲームカウント取得 SaveData = User.GetSaveData(); SceneCount = SaveData.SceneCount; TextCount = SaveData.TextCount; SerifCount = SaveData.SerifCount; User.SetBGMCode ( SaveData.BGMCode ); User.SetBackCode( SaveData.BackCode ); User.SetCharacterCode( SaveData.CharCode ); }
void tryIt(const String& filename) { try { UserClass u; u.f(filename); cout << " OK\n"; } catch (const BadFileName& e) { cout << " Finish recovering from bad-file-name\n"; } }
JavaObjectMethod* JavaObjectMethod::createFromInternalMethod(JavaMethod* meth, int i) { JavaObjectMethod* ret = 0; JavaString* str = 0; JavaObject* pArr = 0; JavaObject* eArr = 0; JavaObject* retTy = 0; ArraySInt8* ann = 0; ArraySInt8* pmAnn = 0; ArraySInt8* defAnn = 0; llvm_gcroot(ret, 0); llvm_gcroot(str, 0); llvm_gcroot(pArr, 0); llvm_gcroot(eArr, 0); llvm_gcroot(retTy, 0); llvm_gcroot(ann, 0); llvm_gcroot(pmAnn, 0); llvm_gcroot(defAnn, 0); // TODO: check parameter types Jnjvm* vm = JavaThread::get()->getJVM(); JnjvmClassLoader * classLoader = meth->classDef->classLoader; UserClass* Meth = vm->upcalls->newMethod; ret = (JavaObjectMethod*)Meth->doNew(vm); str = vm->internalUTF8ToStr(meth->name); pArr = meth->getParameterTypes(classLoader); eArr = meth->getExceptionTypes(classLoader); retTy = meth->getReturnType(classLoader); JavaString ** sig = getSignature(meth); ann = getAnnotations(meth); pmAnn = getParamAnnotations(meth); defAnn = getAnnotationDefault(meth); JavaObject* const* Cl = meth->classDef->getClassDelegateePtr(vm); vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, ret, Cl, /* declaring class */ &str, /* name */ &pArr, /* parameter types */ &retTy, /* return type */ &eArr, /* exceptions */ meth->access, /* modifiers */ i, /* slot */ sig, /* signature */ &ann, /* annotations */ &pmAnn, /* parameter annotations */ &defAnn); /* default annotations */ return ret; }
extern "C" JavaObject* nativeGetCallingClass() { JavaObject* res = 0; llvm_gcroot(res, 0); BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); UserClass* cl = th->getCallingClassLevel(2); if (cl != NULL) res = cl->getClassDelegatee(th->getJVM()); END_NATIVE_EXCEPTION return res; }
extern "C" JavaObject* Java_gnu_classpath_VMStackWalker_getCallingClass__() { JavaObject* res = 0; llvm_gcroot(res, 0); BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); UserClass* cl = th->getCallingClassLevel(2); if (cl != NULL) res = cl->getClassDelegatee(th->getJVM()); END_NATIVE_EXCEPTION return res; }
/*様々なテキストチェック*/ void TextClass::CheckText(UserClass &User){ //メニュー決定フラグを折っておく MenuEnterFlag = 0; const int AtherSelect = -1; //一回目フラグ static bool FirstFlag = FALSE; //シーンの終わりなら、次のシーンへ(カウント更新) if( TextCount >= LineMax[SceneCount] ){ SceneCount++; TextCount = 0; SerifCount = 0; //ユーザークラスに渡す SaveData.SceneCount = SceneCount; SaveData.TextCount = TextCount; SaveData.SerifCount = SerifCount; User.SetSaveData(SaveData); //アイキャッチを動作させる WriteMode = EYECATCH; } //シーンのはじめにアイキャッチを動作させる if( SceneCount == 0 && TextCount == 0 && FirstFlag == FALSE ){ Select = AtherSelect; WriteMode = EYECATCH; FirstFlag = TRUE; } if( TextCount > 0 ) FirstFlag = FALSE; }
/*コンフィグの未読スキップ許可設定*/ void TextClass::ReadUpdate(UserClass &User){ short int WriteData[2]; FILE *fp; int SkipFlag; //スキップフラグを取得 SkipFlag = User.GetSkipFlag(); //許可 if( SkipFlag == 0 ){ SkipPermitFlag = 1; //fp = fopen("./resource/data/read.dat","wb+"); //WriteData[0] = 999; //WriteData[1] = 999; //fwrite(WriteData,2,sizeof(short int),fp); //fclose(fp); } //禁止 if( SkipFlag == 1 ){ SkipPermitFlag = 0; /* fp = fopen("./resource/data/read.dat","wb+"); WriteData[0] = SceneCount; WriteData[1] = TextCount; fwrite(WriteData,2,sizeof(short int),fp); fclose(fp);*/ } }
extern "C" JavaObject* Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) { JavaObject* res = 0; llvm_gcroot(res, 0); BEGIN_NATIVE_EXCEPTION(0) JavaThread* th = JavaThread::get(); Jnjvm* vm = th->getJVM(); UserClass* cl = th->getCallingClassLevel(index); if (cl) res = cl->getClassDelegatee(vm); END_NATIVE_EXCEPTION return res; }
JavaObjectField* JavaObjectField::createFromInternalField(JavaField* field, int i) { JavaObjectField* ret = 0; JavaString* name = 0; ArraySInt8* ann = 0; llvm_gcroot(ret, 0); llvm_gcroot(name, 0); llvm_gcroot(ann, 0); // TODO: check parameter types Jnjvm* vm = JavaThread::get()->getJVM(); UserClass* Field = vm->upcalls->newField; ret = (JavaObjectField*)Field->doNew(vm); name = vm->internalUTF8ToStr(field->name); //type->Class JnjvmClassLoader* loader = field->classDef->classLoader; UserCommonClass * fieldCl = field->getSignature()->assocClass(loader); assert(fieldCl); JavaObject* const* type = fieldCl->getClassDelegateePtr(vm); JavaObject* const* Cl = field->classDef->getClassDelegateePtr(vm); JavaString** sig = getSignature(field); ann = getAnnotations(field); /* java.reflect.Field( * Class declaringClass, * String name, * Class type, * int modifiers, * int slot, * String signature, * byte[] annotations) */ vm->upcalls->initField->invokeIntSpecial(vm, Field, ret, Cl, &name, type, field->access, i, sig, &ann); return ret; }
/*キャラクタ描画*/ void TextGraphClass::DrawChar(UserClass &User){ //キャラクタ描画 switch( User.GetCharacterCode() ){ case GAME_CHAR::AI: DrawGraph(CharacterPoint[GRAPH::X],CharacterPoint[GRAPH::Y],CharacterHandle,TRUE); break; case GAME_CHAR::NOT: break; } }
int main() { SortStrategy* s = new ShellSort(); UserClass* c = new UserClass(s); c->sort(); // mit Shellsort sortieren //Algorithmus wechseln c->changeStrategy(new QuickSort()); c->sort(); // jetzt wird mit Quicksort sortiert // in C++ müssen wir selbst allozierte Speicherbereiche auch wieder freigeben: delete s; delete c; // ACHTUNG: Beim Aufruf von "c->changeStrategy(new QuickSort());" haben wir uns jedoch nicht // die Speicheradresse des neuen QuickSort-Objekt // gemerkt und können es somit auch nicht selbst wieder freigeben. D. h., hier würde ein Memory // Leak entstehen, wenn das Programm noch länger laufen würde. return 0; }
JavaObjectConstructor* JavaObjectConstructor::createFromInternalConstructor(JavaMethod * cons, int i) { JavaObjectConstructor* ret = 0; JavaObject* pArr = 0; JavaObject* eArr = 0; ArraySInt8* ann = 0; ArraySInt8* pmAnn = 0; llvm_gcroot(ret, 0); llvm_gcroot(pArr, 0); llvm_gcroot(eArr, 0); llvm_gcroot(ann, 0); llvm_gcroot(pmAnn, 0); Jnjvm* vm = JavaThread::get()->getJVM(); JnjvmClassLoader * classLoader = cons->classDef->classLoader; UserClass* Cons = vm->upcalls->newConstructor; pArr = cons->getParameterTypes(classLoader); eArr = cons->getExceptionTypes(classLoader); ret = (JavaObjectConstructor*)Cons->doNew(vm); JavaObject* const* Cl = cons->classDef->getDelegateePtr(); JavaString ** sig = getSignature(cons); ann = getAnnotations(cons); pmAnn = getParamAnnotations(cons); vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, ret, Cl, /* declaringClass */ &pArr, /* parameterTypes */ &eArr, /* checkedExceptions */ cons->access, /* modifiers */ i, /* slot */ sig, /* String signature */ &ann, /* annotations */ &pmAnn /* parameterAnnotations */ ); return ret; }
JavaString* JavaString::stringDup(const ArrayUInt16*& _array, Jnjvm* vm) { JavaString* res = 0; const ArrayUInt16* array = _array; llvm_gcroot(array, 0); llvm_gcroot(res, 0); UserClass* cl = vm->upcalls->newString; res = (JavaString*)cl->doNew(vm); // It's a hashed string, set the destructor so that the string // removes itself from the vm string map. Do this only if // internStringVT exists (in case of AOT). if (internStringVT) res->setVirtualTable(internStringVT); // No need to call the Java function: both the Java function and // this function do the same thing. JavaString::setValue(res, array); res->count = ArrayUInt16::getSize(array); res->offset = 0; res->cachedHashCode = 0; return res; }
/*現在のデータをセット*/ void TextClass::SetGameData(UserClass &User){ //時間関係 time_t now; struct tm *Date; time(&now); Date = localtime(&now); SaveData.SceneCount = SceneCount; SaveData.TextCount = TextCount; SaveData.SerifCount = SerifCount; SaveData.BGMCode = User.GetBGMCode(); SaveData.BackCode = User.GetBackCode(); SaveData.CharCode = User.GetCharacterCode(); SaveData.Year = Date->tm_year+1900; SaveData.Mon = Date->tm_mon+1; SaveData.Day = Date->tm_mday; SaveData.TextLength = Text[SceneCount][TextCount].size(); strcpy(SaveData.Text,Text[SceneCount][TextCount].c_str()); //現在カウントを更新 User.SetSaveData(SaveData); }
/*背景描画*/ void TextGraphClass::DrawBack(UserClass &User){ //背景描画 switch( User.GetBackCode() ){ case GAME_BACK::KAWARA: DrawGraph(GameBackPoint[GRAPH::X],GameBackPoint[GRAPH::Y],GameBackHandle[GAME_BACK::KAWARA],TRUE); break; case GAME_BACK::YOZORA: DrawGraph(GameBackPoint[GRAPH::X],GameBackPoint[GRAPH::Y],GameBackHandle[GAME_BACK::YOZORA],TRUE); break; case GAME_BACK::BLACK: DrawBox(0,0,windowX,windowY,GetColor(0,0,0),TRUE); break; } }
extern "C" void* j3ResolveVirtualStub(JavaObject* obj) { llvm_gcroot(obj, 0); JavaThread *th = JavaThread::get(); UserCommonClass* cl = JavaObject::getClass(obj); void* result = NULL; // Lookup the caller of this class. vmkit::StackWalker Walker(th); ++Walker; // Remove the stub. vmkit::FrameInfo* FI = Walker.get(); assert(FI->Metadata != NULL && "Wrong stack trace"); JavaMethod* meth = (JavaMethod*)FI->Metadata; // Lookup the method info in the constant pool of the caller. uint16 ctpIndex = meth->lookupCtpIndex(FI); assert(ctpIndex && "No constant pool index"); JavaConstantPool* ctpInfo = meth->classDef->getConstantPool(); CommonClass* ctpCl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; JavaMethod* origMeth = 0; ctpInfo->infoOfMethod(ctpIndex, ACC_VIRTUAL, ctpCl, origMeth); ctpInfo->resolveMethod(ctpIndex, ctpCl, utf8, sign); assert(cl->isSubclassOf(ctpCl) && "Wrong call object"); UserClass* lookup = cl->isArray() ? cl->super : cl->asClass(); JavaMethod* Virt = lookup->lookupMethod(utf8, sign->keyName, false, true, 0); if (isAbstract(Virt->access)) { JavaThread::get()->getJVM()->abstractMethodError(Virt->classDef, Virt->name); } // Compile the found method. result = Virt->compiledPtr(lookup); // Update the virtual table. assert(lookup->isResolved() && "Class not resolved"); assert(lookup->isInitializing() && "Class not ready"); assert(lookup->virtualVT && "Class has no VT"); assert(lookup->virtualTableSize > Virt->offset && "The method's offset is greater than the virtual table size"); ((void**)obj->getVirtualTable())[Virt->offset] = result; if (isInterface(origMeth->classDef->access)) { InterfaceMethodTable* IMT = cl->virtualVT->IMT; uint32_t index = InterfaceMethodTable::getIndex(Virt->name, Virt->type); if ((IMT->contents[index] & 1) == 0) { IMT->contents[index] = (word_t)result; } else { JavaMethod* Imeth = ctpCl->asClass()->lookupInterfaceMethodDontThrow(utf8, sign->keyName); assert(Imeth && "Method not in hierarchy?"); word_t* table = (word_t*)(IMT->contents[index] & ~1); uint32 i = 0; while (table[i] != (word_t)Imeth) { i += 2; } table[i + 1] = (word_t)result; } } return result; }
/*テキスト描画*/ void TextClass::WriteText(UserClass &User){ //変数宣言 static int WriteCount = 0; //書き込み時カウント static int WriteIndex[3] = {0,0,0}; //現在何文字目か static int WriteX = 0; //書き込みX軸座標 static int WriteY = 0; //書き込みY座標 static int OldTextCount; //前のテキストカウントを取得 static int WriteLine; //描画する行 int Length; //文字数 int TmpCount = 0; //一時カウンタ int LoopCount = 0; //ループ用カウンタ char WriteText[3]; //書き込み文字 //定数定義 const int DrawX = 250; //描画基準X座標 const int DrawY = windowY - windowY / 3 + 50; //描画基準Y座標 const int TextSpace = 14; //文字と文字の間隔 const int LineSpace = 40; //行と行の間隔 const int FontSize = 28; //フォントサイズ int DrawSpeed; //文字の描画速度 //文字の描画速度を取得 if( AutoFlag == 1 ) DrawSpeed = User.GetAutoTextSpeed(); else DrawSpeed = User.GetTextSpeed(); //テキストが進んだら変数初期化 if( TextCount != OldTextCount ){ memset(WriteIndex,0,sizeof(WriteIndex)); WriteCount = 0; WriteX = 0; WriteY = 0; WriteLine = 0; } //前のテキストカウントを取得(上の初期化のため) OldTextCount = TextCount; //フォントサイズ //SetFontSize(FontSize); //現在表示されている文字数だけ表示する(Lineは行数を示し、最大行数分ループする) for( int Line=0 ; Line<LineNo[SceneCount][SerifCount] ; Line++ ){ //描画が完了している行まで描画 if( Line <= WriteLine ){ LoopCount = 0; //ループカウンタ初期化 while( LoopCount <= WriteIndex[Line] ){ //書き込み可能文字数以下なら WriteX = LoopCount * TextSpace; //描画X座標更新 WriteText[0] = Text[SceneCount][TextCount+Line][LoopCount]; //1byte目代入 WriteText[1] = Text[SceneCount][TextCount+Line][LoopCount+1]; //2byte目代入 WriteText[2] = '\0'; //ヌル文字を代入 //DrawStringToHandle(DrawX+WriteX,DrawY + ( LineSpace * Line ),WriteText,GetColor(200,200,200),TextFontHandle); //一文字描画 DrawStringShadow(DrawX+WriteX,DrawY + ( LineSpace * Line ),WriteText,GetColor(233,233,233),GetColor(5,5,5)); LoopCount+=2; //一文字分カウントアップ } Length = Text[SceneCount][TextCount+Line].length()-2; //文字列の終端ならば、書き込み行数を更新 if( Length <= WriteIndex[Line] ){ WriteLine = Line+1; //文字列の終端ならば、書き込み行数を更新 }else if( WriteCount % DrawSpeed == 0 ) WriteIndex[Line]+=2; //もしも全文描画終了フラグが立っているならば,描画カウントを最大にする(文字数を代入) if( TextGraphEndFlag == 1 ){ WriteIndex[Line] = Length; } } } //描画タイミング動機用 WriteCount++; //テキストが全て描画されたら、全文描画終了フラグを立てる if( WriteLine == LineNo[SceneCount][SerifCount] ) TextGraphEndFlag = 1; }
/*アイキャッチ*/ void TextClass::EyeCatching(UserClass &User){ MouseClass* Mouse = MouseClass::GetInstance(); const int MinVol = 9000; const int FadeSpeed = 7; //static bool SoundBack = FALSE; static bool FirstFlag = FALSE; static bool PlayFlag = FALSE; static bool FadeFlag1 = FALSE; static bool FadeFlag2 = TRUE; static int FadeCount = 255; static int MovieVol; static int MovieHandle; static int TmpSoundCode; //音量取得 MovieVol = User.GetBGMVol() * 4; //現在のサウンドコードのバックアップ //if( SoundBack == FALSE ){ // TmpSoundCode = User.GetBGMCode(); // SoundBack = TRUE; //} //音楽停止 User.SetBGMCode( GAME_BGM::STOP ); //フェードアウト処理 if( FadeFlag1 == FALSE && FadeFlag2 == TRUE ){ SetDrawBright(FadeCount,FadeCount,FadeCount); FadeCount -= FadeSpeed; if( FadeCount <= 0 ) FadeFlag1 = TRUE; } //再生前の初期化 if( FirstFlag == FALSE && FadeFlag1 == TRUE ){ SetDrawBright(255,255,255); MovieHandle = LoadGraph("./resource/movie/eyecatch.ogv"); SetMovieVolumeToGraph( MinVol + MovieVol , MovieHandle ); PlayMovieToGraph( MovieHandle ); FirstFlag = TRUE; PlayFlag = TRUE; } //動画再生 if( PlayFlag == TRUE ){ DrawGraph(0,0,MovieHandle,TRUE); WaitTimer(17); } //再生中か判断 if( GetMovieStateToGraph(MovieHandle) != 1 && FadeFlag1 == TRUE ){ PlayFlag = FALSE; FirstFlag = FALSE; FadeFlag1 = FALSE; FadeFlag2 = FALSE; } //フェードイン if( FadeFlag2 == FALSE ){ SetDrawBright(FadeCount,FadeCount,FadeCount); FadeCount += FadeSpeed; if( FadeCount >= 255 ){ FadeFlag2 = TRUE; //SoundBack = FALSE; //User.SetBGMCode( TmpSoundCode ); WriteMode = NORMAL; } } //メッセージ描画 //DrawString(300,windowY - windowY / 3 + 50,"アイキャッチだよ、クリックで進むよっ!",GetColor(0,0,0)); //if( Mouse->GetState(MOUSE::LEFT) == 1 ){ // WriteMode = NORMAL; //} }
/*バックログから戻ったときに前の制御コードを取得*/ void TextClass::BackCheckControlCode(UserClass &User){ int TmpSceneCount,TmpTextCount; bool BGMFlag = FALSE; bool BackFlag = FALSE; bool CharFlag = FALSE; std::string BGMCode; std::string BackCode; std::string CharacterCode; TmpSceneCount = SceneCount; TmpTextCount = TextCount; //曲をいったん停止 User.SetBGMCode( GAME_BGM::STOP ); User.SetCharacterCode( GAME_CHAR::NOT ); while( TmpTextCount >= 0 ){ //音楽制御 if( Name[TmpSceneCount][TmpTextCount] == "音楽" && BGMFlag == FALSE){ //BGMコード受け取り BGMCode = Text[TmpSceneCount][TmpTextCount]; if( BGMCode == "回想" ) User.SetBGMCode( GAME_BGM::KAISOU1 ); if( BGMCode == "出会い" ) User.SetBGMCode( GAME_BGM::DEAI ); if( BGMCode == "別れ" ) User.SetBGMCode( GAME_BGM::WAKARE ); if( BGMCode == "無音" ) User.SetBGMCode( GAME_BGM::STOP ); if( BGMCode == "残響" ) User.SetBGMCode( GAME_BGM::TITLE); BGMFlag = TRUE; } //背景画像制御 if( Name[TmpSceneCount][TmpTextCount] == "背景" && BackFlag == FALSE ){ //背景コード受け取り BackCode = Text[TmpSceneCount][TmpTextCount]; if( BackCode == "暗闇" ) User.SetBackCode( GAME_BACK::BLACK ); if( BackCode == "川原" ) User.SetBackCode( GAME_BACK::KAWARA ); BackFlag = TRUE; } //キャラクタ画像制御 if( Name[TmpSceneCount][TmpTextCount] == "キャラ" && CharFlag == FALSE ){ //キャラクタコード受け取り CharacterCode = Text[TmpSceneCount][TmpTextCount]; if( CharacterCode == "藍" ) User.SetCharacterCode( GAME_CHAR::AI ); if( CharacterCode == "非表示" ) User.SetCharacterCode( GAME_CHAR::NOT ); CharFlag = TRUE; } //カウントを下げる TmpTextCount--; //もしテキストカウントが0を下回ったら各コードを初期化 if( TmpTextCount < 0 ){ if( BGMFlag == FALSE ) User.SetBGMCode( GAME_BGM::STOP ); if( BackFlag == FALSE ) User.SetBackCode( GAME_BACK::BLACK ); if( CharFlag == FALSE ) User.SetCharacterCode( GAME_CHAR::NOT ); } //全てのコードが確認されたら処理を抜ける if( BGMFlag == TRUE && BackFlag == TRUE && CharFlag == TRUE ) break; } }
/*制御コードチェック*/ void TextClass::CheckCotrolCode(UserClass &User){ //各種コード受け取り変数 std::string BGMCode; std::string BackCode; std::string EventCode; std::string CharacterCode; bool EventFlag = FALSE; do{ EventFlag = FALSE; //音楽制御 if( Name[SceneCount][TextCount] == "音楽" ){ //BGMコード受け取り BGMCode = Text[SceneCount][TextCount]; if( BGMCode == "回想" ) User.SetBGMCode( GAME_BGM::KAISOU1 ); if( BGMCode == "出会い" ) User.SetBGMCode( GAME_BGM::DEAI ); if( BGMCode == "別れ" ) User.SetBGMCode( GAME_BGM::WAKARE ); if( BGMCode == "無音" ) User.SetBGMCode( GAME_BGM::STOP ); if( BGMCode == "残響" ) User.SetBGMCode( GAME_BGM::TITLE); TextCount++; SerifCount++; EventFlag = TRUE; } //背景画像制御 if( Name[SceneCount][TextCount] == "背景" ){ //背景コード受け取り BackCode = Text[SceneCount][TextCount]; if( BackCode == "暗闇" ) User.SetBackCode( GAME_BACK::BLACK ); if( BackCode == "川原" ) User.SetBackCode( GAME_BACK::KAWARA ); if( BackCode == "夜空" ) User.SetBackCode( GAME_BACK::YOZORA ); TextCount++; SerifCount++; EventFlag = TRUE; } //キャラクタ画像制御 if( Name[SceneCount][TextCount] == "キャラ" ){ //キャラクタコード受け取り CharacterCode = Text[SceneCount][TextCount]; if( CharacterCode == "藍" ) User.SetCharacterCode( GAME_CHAR::AI ); if( CharacterCode == "非表示" ) User.SetCharacterCode( GAME_CHAR::NOT ); TextCount++; SerifCount++; EventFlag = TRUE; } //時間経過 if( Name[SceneCount][TextCount] == "イベント" ){ EventCode = Text[SceneCount][TextCount]; if( EventCode == "経過" ) OverTime(User); if( EventCode == "タイトルへ" ) WriteMode = TITLE; } //エンド if( Name[SceneCount][TextCount] == "エンド" ){ TextCount++; SerifCount++; WriteMode = END; } }while( EventFlag == TRUE ); }