diff --git a/engine/src/engine.cpp b/engine/src/engine.cpp index 11856cc..47fc3c8 100644 --- a/engine/src/engine.cpp +++ b/engine/src/engine.cpp @@ -1 +1,29 @@ -#include "engine.h" \ No newline at end of file +#include "engine.h" + +enginend::theme DEFAULTTHEMECODE={ + .textfieldbg ={127,0,0,127}, + .background = {0,0,0,0}, + .border = {0,0,0,0}, + .booleanbutton = { + {0,200,0,180}, + {100,200,100,180}, + {100,255,100,255}, + {200,0,0,180}, + {200,100,100,180}, + {255,100,100,255}, + }, + .text = {255,255,255,255}, + .tint = {255,255,255,255}, + .button = { + {0,0,0,0}, + {255,255,255,80}, + {255,255,255,160} + }, + .buttontext = { + {255,255,255,255}, + {255,255,255,255}, + {255,255,255,255} + } + +}; +enginend::theme* enginend::DEFAULT=&DEFAULTTHEMECODE; \ No newline at end of file diff --git a/engine/src/scenes/node2d.h b/engine/src/scenes/node2d.h index ea60e0e..1590959 100644 --- a/engine/src/scenes/node2d.h +++ b/engine/src/scenes/node2d.h @@ -108,15 +108,14 @@ namespace enginend { protected: std::string result; public: - Font font; float fs; Color txc; std::string content; text(){fs=20;} - text(Texture2D* texture,Color txcol,Color color,float x,float y,float w,float h,Font f,float fsize,std::string txt): - font(f),fs(fsize),content(txt) + text(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,float fsize,std::string txt): + fs(fsize),content(txt) { - this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color;this->txc=txcol; + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->theme=theme; result=content; size_t initp=0; @@ -138,14 +137,14 @@ namespace enginend { } } void draw()override { - Vector2 minsize=MeasureTextEx(font,content.c_str(),fs,1); - Vector2 charsize=MeasureTextEx(font," ",fs,1); + Vector2 minsize=MeasureTextEx(this->theme->font,content.c_str(),fs,1); + Vector2 charsize=MeasureTextEx(this->theme->font," ",fs,1); float p=charsize.x>charsize.y?charsize.x/minsize.x:charsize.y/minsize.y; p=p*2; int minh=(minsize.y>size.y)?minsize.y:size.y; int minw=(minsize.x>size.x)?minsize.x:size.x; - DrawRectangle(pos.x-charsize.x,pos.y-charsize.y,minw+p,minh+p,c); - DrawTextEx(font,content.c_str(),pos,fs,1,txc); + DrawRectangle(pos.x-charsize.x,pos.y-charsize.y,minw+p,minh+p,this->theme->background); + DrawTextEx(this->theme->font,content.c_str(),pos,fs,1,this->theme->text); } void exit()override{this->tinted::exit();} }; @@ -154,12 +153,13 @@ namespace enginend { bool pressed; bool hover; const bool isboolean; + bool boolean=false; button():pressed(false),isboolean(false){} - button(Texture2D* texture,Color color,float x,float y,float w,float h,std::function f):func(f),pressed(false),isboolean(false){ - this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color; + button(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,std::function f):func(f),pressed(false),isboolean(false){ + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=theme->tint;this->theme=theme; } - button(Texture2D* texture,Color color,float x,float y,float w,float h,std::function f,bool isboolean):func(f),pressed(false),isboolean(true){ - this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color; + button(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,std::function f,bool isboolean):func(f),pressed(false),isboolean(isboolean){ + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=theme->tint;this->theme=theme; } void boot()override{this->tinted::boot();} void tick()override{ @@ -177,8 +177,24 @@ namespace enginend { } } void draw()override { - if(this->texture!=nullptr)DrawTexture(*texture,pos.x,pos.y,c); - else DrawRectangle(pos.x,pos.y,size.x,size.y,c); + + if (hover) { + if (pressed) { + c=isboolean?boolean? + this->theme->booleanbutton[5]:this->theme->booleanbutton[2]: + this->theme->button[2]; + }else { + c=isboolean?boolean? + this->theme->booleanbutton[4]:this->theme->booleanbutton[1]: + this->theme->button[1]; + } + }else { + c=isboolean?boolean? + this->theme->booleanbutton[3]:this->theme->booleanbutton[0]: + this->theme->button[0]; + } + if(this->texture!=nullptr)DrawTexture(*texture,pos.x,pos.y,this->theme->tint); + else DrawRectangle(pos.x,pos.y,size.x,size.y,this->theme->tint); } void exit()override{this->tinted::exit();} }; @@ -187,10 +203,9 @@ namespace enginend { Font font; int fs; Color txc; - labeledbutton(std::string name,Texture2D* texture,Color color,Color text, - float x,float y,float w,float h,std::function f, - Font fnt,int size):font(fnt),fs(size),txc(text){ - this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->c=color; + labeledbutton(std::string name,Texture2D* texture,enginend::theme* theme, + float x,float y,float w,float h,std::function f,int size):fs(size){ + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->texture=texture;this->theme=theme; this->func=f;this->pressed=false; this->label=name; } @@ -198,6 +213,22 @@ namespace enginend { void tick()override{this->button::tick();} void draw()override{ this->button::draw(); + + if (hover) { + if (pressed) { + txc=isboolean?boolean? + this->theme->booleantext[5]:this->theme->booleantext[2]: + this->theme->buttontext[2]; + }else { + txc=isboolean?boolean? + this->theme->booleantext[4]:this->theme->booleantext[1]: + this->theme->buttontext[1]; + } + }else { + txc=isboolean?boolean? + this->theme->booleantext[3]:this->theme->booleantext[0]: + this->theme->buttontext[0]; + } Vector2 tsize=MeasureTextEx(font,label.c_str(),fs,1); Vector2 tpos={ pos.x+(size.x-tsize.x)/2, @@ -235,19 +266,19 @@ namespace enginend { }; struct textfield :public text{ textfield(){} - textfield(Texture2D* texture,Color txcol,Color color,float x,float y,float w,float h,Font f,float fsize,std::string txt): - text(texture,txcol,color,x,y,w,h,f,fsize,txt){} + textfield(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,float fsize,std::string txt): + text(texture,theme,x,y,w,h,fsize,txt){} void boot()override{this->text::boot();} void tick()override{this->text::tick();} void draw()override{ Vector2 p=pos; - Vector2 charsize=MeasureTextEx(font," ",fs,0); - Vector2 minsize=MeasureTextEx(font,content.c_str(),fs,charsize.x/2); + Vector2 charsize=MeasureTextEx(this->theme->font," ",fs,0); + Vector2 minsize=MeasureTextEx(this->theme->font,content.c_str(),fs,charsize.x/2); float po=charsize.x>charsize.y?charsize.x/charsize.y:charsize.y/charsize.x;po=po*5; int minh=(minsize.y>size.y)?minsize.y:size.y; int minw=(minsize.x>size.x)?minsize.x:size.x; DrawRectangle(pos.x-(po/2),pos.y-(po/2),minw+(po*1.1),minh+(po*1.1),c); - DrawTextEx(font,content.c_str(),p,fs,charsize.x/2,this->txc); + DrawTextEx(this->theme->font,content.c_str(),p,fs,charsize.x/2,this->txc); } void exit()override{this->text::exit();} }; @@ -255,9 +286,9 @@ namespace enginend { bool active; int cpos; textinput():active(false),cpos(0){} - textinput(Texture2D* texture,Color txcol,Color color,float x,float y,float w,float h,Font f,float fsize):active(false),cpos(0){ - this->pos=Vector2{x,y};this->size=Vector2{x,y};this->texture=texture;this->c=color;this->font=f;this->content=""; - this->txc=txcol;this->fs=fsize; + textinput(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,float fsize):active(false),cpos(0){ + this->pos=Vector2{x,y};this->size=Vector2{x,y};this->texture=texture;this->theme=theme;this->content=""; + this->fs=fsize; } void boot()override{this->text::boot();} void tick()override{ @@ -291,8 +322,8 @@ namespace enginend { bool active; int cpos; textinputfield():active(false),cpos(0){} - textinputfield(Texture2D* texture,Color txcol,Color color,float x,float y,float w,float h,Font f,float fsize):active(false),cpos(0), - textfield(texture,txcol,color,x,y,w,h,f,fsize,""){} + textinputfield(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,float fsize):active(false),cpos(0), + textfield(texture,theme,x,y,w,h,fsize,""){} void boot()override{this->textfield::boot();} void tick()override{ this->textfield::tick(); diff --git a/engine/src/scenes/node2drelative.h b/engine/src/scenes/node2drelative.h index 18fbfae..bdb9c9b 100644 --- a/engine/src/scenes/node2drelative.h +++ b/engine/src/scenes/node2drelative.h @@ -187,7 +187,7 @@ namespace enginend{ } }; struct button :virtual public tinted{ - void(*func)(); + std::function func; bool pressed; bool hover; const bool isboolean; @@ -214,14 +214,14 @@ namespace enginend{ }else{ pressed=false; c=isboolean?boolean? - this->theme->booleanbutton[4]:this->theme->button[1]: + this->theme->booleanbutton[4]:this->theme->booleanbutton[1]: this->theme->button[1]; } }else{ hover=false; pressed=false; c=isboolean?boolean? - this->theme->booleanbutton[3]:this->theme->button[0]: + this->theme->booleanbutton[3]:this->theme->booleanbutton[0]: this->theme->button[0]; } } @@ -270,13 +270,13 @@ namespace enginend{ this->theme->buttontext[2]; }else { txc=isboolean?boolean? - this->theme->booleantext[4]:this->theme->buttontext[1]: - this->theme->button[1]; + this->theme->booleantext[4]:this->theme->booleantext[1]: + this->theme->buttontext[1]; } }else { txc=isboolean?boolean? - this->theme->booleantext[3]:this->theme->button[0]: - this->theme->button[0]; + this->theme->booleantext[3]:this->theme->booleantext[0]: + this->theme->buttontext[0]; } DrawTextEx(this->theme->font,label.c_str(),tpos,fs,1,txc); } diff --git a/engine/src/scenes/nodes.h b/engine/src/scenes/nodes.h index 814fdf5..e995e2f 100644 --- a/engine/src/scenes/nodes.h +++ b/engine/src/scenes/nodes.h @@ -30,8 +30,7 @@ void exit(){for (node* n: children){n->exit();}} }; - struct theme { - // in case if its a boolean button, it will use booleanbutton + typedef struct theme { Color booleanbutton[6],button[3],booleantext[6],buttontext[3],text,buttonborder[3],booleanborder[6],border,background ,textfieldbg ; @@ -42,4 +41,7 @@ Color tint; }; + extern enginend::theme* DEFAULT; + + } diff --git a/engine/test.cpp b/engine/test.cpp index a250e5d..fce4c43 100644 --- a/engine/test.cpp +++ b/engine/test.cpp @@ -16,8 +16,8 @@ public: s.nodes=std::list{ new nodes::colored(Color{255,255,255,255},0,0,500,500), - new nodes::textfield(nullptr,Color{255,127,127,255},Color{127,127,127,255} - ,100,100,220,32,GetFontDefault(),32, + new nodes::textfield(nullptr,enginend::DEFAULT + ,100,100,220,32,32, "welcome to enginend!\n" "hehe" ) diff --git a/games/endlauncher/src/main.cpp b/games/endlauncher/src/main.cpp index 0d6f7d6..647c037 100644 --- a/games/endlauncher/src/main.cpp +++ b/games/endlauncher/src/main.cpp @@ -5,6 +5,9 @@ #include #include +#include "../../../engine/src/scenes/nodes.h" +#include "../../../engine/src/scenes/nodes.h" +#include"themes.h" using namespace enginend; using namespace enginend::nodes; netio nete{}; @@ -60,10 +63,9 @@ private: }; struct logi: public virtual textfield { - logi(Texture2D* texture,Color textcol,Color color,float x,float y,float w,float h,Font f,float fs,std::string txt) { - this->pos=Vector2{x,y};this->size=Vector2{w,h};this->content=txt; - this->texture=texture;this->txc=textcol;this->c=color; - this->font=f; + logi(Texture2D* texture,enginend::theme* theme,float x,float y,float w,float h,float fs,std::string txt) { + this->pos=Vector2{x,y};this->size=Vector2{w,h};this->content=txt;this->theme=theme; + this->texture=texture; this->fs=fs; } void draw() override { @@ -83,11 +85,11 @@ struct logi: public virtual textfield { fc=Color{255,255,0,255}; } - DrawTextEx(font, str, charPos, (float)fs, spacing, fc); - charPos.x+=MeasureTextEx(font, str, (float)fs, spacing).x; + DrawTextEx(this->theme->font, str, charPos, (float)fs, spacing, fc); + charPos.x+=MeasureTextEx(this->theme->font, str, (float)fs, spacing).x; } } else { - DrawTextEx(font, line.c_str(), p, (float)fs, spacing, Color{0,255,255,255}); + DrawTextEx(this->theme->font, line.c_str(), p, (float)fs, spacing, Color{0,255,255,255}); } p.y+=(fs+2); @@ -138,44 +140,47 @@ public: menubtn[1]=LoadTexture("res/btnhover.png"); menubtn[2]=LoadTexture("res/btnpress.png"); selectedversion=nete.currentversion; - version= text (nullptr,Color{255,255,255,255},Color{0,0,0,0},96,16*17,1,1,information,20,"version: "+selectedversion); + enginend::DEFAULT->font=information; + GAMENAME.font=gamename; + CHANGELOG.font=changelog; + version= text (nullptr,enginend::DEFAULT,96,16*17,1,1,20,"version: "+selectedversion); SetTraceLogLevel(LOG_ERROR); - buttons[0]=new button(&menubtn[0], {255,255,255,255},468,58,96,16,nullptr); + buttons[0]=new button(&menubtn[0], enginend::DEFAULT,468,58,96,16,nullptr); buttonslabel[0]=LoadTexture("res/options.png"); - buttons[1]=new button(&menubtn[0], {255,255,255,255},468,58+(18*1),96,16,std::function([]() { + buttons[1]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*1),96,16,std::function([]() { OpenURL("http://kosumi.ddns.net:60000/"); })); buttonslabel[1]=LoadTexture("res/website.png"); - buttons[2]=new button(&menubtn[0], {255,255,255,255},468,58+(18*2),96,16,std::function([]() { + buttons[2]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*2),96,16,std::function([]() { OpenURL("http://kosumi.ddns.net:60001/"); })); buttonslabel[2]=LoadTexture("res/forums.png"); - buttons[3]=new button(&menubtn[0], {255,255,255,255},468,58+(18*3),96,16,std::function([]() { + buttons[3]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*3),96,16,std::function([]() { OpenURL("https://github.com/kin-fuyuki/allgames/issues"); })); buttonslabel[3]=LoadTexture("res/help.png"); - buttons[4]=new button(&menubtn[0], {255,255,255,255},468,58+(18*4),96,16,std::function([]() { + buttons[4]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*4),96,16,std::function([]() { nete.download(); })); buttonslabel[4]=LoadTexture("res/update.png"); - buttons[5]=new button(&menubtn[0], {255,255,255,255},468,58+(18*5),96,16,nullptr); + buttons[5]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*5),96,16,nullptr); buttonslabel[5]=LoadTexture("res/verify.png"); - buttons[6]=new button(&menubtn[0], {255,255,255,255},468,58+(18*6)+15,96,16,nullptr); + buttons[6]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*6)+15,96,16,nullptr); buttonslabel[6]=LoadTexture("res/versions.png"); - buttons[7]=new button(&menubtn[0], {255,255,255,255},468,58+(18*7)+17,96,16,std::function([]() { + buttons[7]=new button(&menubtn[0], enginend::DEFAULT,468,58+(18*7)+17,96,16,std::function([]() { quit(); })); buttonslabel[7]=LoadTexture("res/exit.png"); playbtn[0]=LoadTexture("res/playoff.png"); playbtn[1]=LoadTexture("res/playon.png"); - playbutton= new button(&playbtn[0], {255,255,255,255},406,(18*11)+17+9,153,59,std::function(playbuttonfunc)); + playbutton= new button(&playbtn[0], enginend::DEFAULT,406,(18*11)+17+9,153,59,std::function(playbuttonfunc)); currentscene->nodes=std::list{ new background(&bg,0,0,600,300), new textured(&buttonfore,3,36,62,62), new textured(&buttonlock,3,36+((62+4)*1),62,62), new textured(&buttonlock,3,36+((62+4)*2),62,62), new textured(&buttonlock,3,36+((62+4)*3),62,62), - new text(nullptr,Color{0,255,0,255},{0,0,0,0},232,19,1,1,gamename,16,"FORESPEND"), + new text(nullptr,&GAMENAME,232,19,1,1,16,"FORESPEND"), buttons[0],new textured(&buttonslabel[0],468,58,96,16), buttons[1],new textured(&buttonslabel[1],468,58+(18*1),96,16), buttons[2],new textured(&buttonslabel[2],468,58+(18*2),96,16), @@ -185,8 +190,8 @@ public: buttons[6],new textured(&buttonslabel[6],468,58+(18*6)+15,96,16), buttons[7],new textured(&buttonslabel[7],468,58+(18*7)+17,96,16), playbutton, - new logi(nullptr,Color{255,0,255,255},Color{0,0,0,0},90,58,466,159,changelog,8,nete.changelog), - new text(nullptr,Color{255,255,255,255},Color{0,0,0,0},96+16,(16*14)-3,1,1,information,20,"downloaded verified"), + new logi(nullptr,&CHANGELOG,90,58,466,159,8,nete.changelog), + new text(nullptr,enginend::DEFAULT,96+16,(16*14)-3,1,1,20,"downloaded verified"), &version, }; currentscene->boot(); diff --git a/games/endlauncher/src/themes.h b/games/endlauncher/src/themes.h new file mode 100644 index 0000000..7ddf90c --- /dev/null +++ b/games/endlauncher/src/themes.h @@ -0,0 +1,53 @@ +#pragma once +enginend::theme GAMENAME={ + .textfieldbg ={127,0,0,127}, + .background = {0,0,0,0}, + .border = {0,0,0,0}, + .booleanbutton = { + {0,200,0,180}, + {100,200,100,180}, + {100,255,100,255}, + {200,0,0,180}, + {200,100,100,180}, + {255,100,100,255}, + }, + .text = {0,255,0,255}, + .tint = {255,255,255,255}, + .button = { + {0,0,0,0}, + {255,255,255,80}, + {255,255,255,160} + }, + .buttontext = { + {255,255,255,255}, + {255,255,255,255}, + {255,255,255,255} + } + +}; +enginend::theme CHANGELOG={ + .textfieldbg ={127,0,0,127}, + .background = {0,0,0,0}, + .border = {0,0,0,0}, + .booleanbutton = { + {0,200,0,180}, + {100,200,100,180}, + {100,255,100,255}, + {200,0,0,180}, + {200,100,100,180}, + {255,100,100,255}, + }, + .text = {255,255,255,255}, + .tint = {255,255,255,255}, + .button = { + {0,0,0,0}, + {255,255,255,80}, + {255,255,255,160} + }, + .buttontext = { + {255,255,255,255}, + {255,255,255,255}, + {255,255,255,255} + } + +}; diff --git a/games/forespend/src/client/scenes/configmenu.cpp b/games/forespend/src/client/scenes/configmenu.cpp index 321cfa8..0bba678 100644 --- a/games/forespend/src/client/scenes/configmenu.cpp +++ b/games/forespend/src/client/scenes/configmenu.cpp @@ -33,4 +33,5 @@ enginend::group controls= enginend::group( { } -); \ No newline at end of file +); +