Skip to content

Instantly share code, notes, and snippets.

@rikkun2X
Created November 5, 2023 04:59
Show Gist options
  • Save rikkun2X/9d36d1341f8b1aa7d120f99e42e8f8f1 to your computer and use it in GitHub Desktop.
Save rikkun2X/9d36d1341f8b1aa7d120f99e42e8f8f1 to your computer and use it in GitHub Desktop.
//HyperCrasherDream
# include <Siv3D.hpp>
struct stick{
Point P1;
Point P2;
};
struct wheel{
int size;
};
struct MachineToEdit{
double TotalLength = 0.0;
Array<stick> sticks;
HashTable<Point, wheel> wheels;
Optional<Point> SpoonJoint = none;
};
struct WheelAndJoint{
P2Body wheel;
P2WheelJoint joint;
};
struct MachineInWorld{
Array<P2Body> sticks;
HashTable<Point, WheelAndJoint> wheels;
HashTable<Point, P2Body> points;
Array<P2DistanceJoint> distancejoints;
P2Body Spoon;
P2PivotJoint SpoonJoint;
};
const MachineInWorld EmptyMachineInWorld;
const MachineToEdit EmptyMachineToEdit;
constexpr double StepTime = (1.0 / 3000.0);
constexpr double Gravity = 980;
P2World world{Gravity};
void DrawSpoon(const Optional<Point> P){
if(P){
Line{(*P).x*40+400, (*P).y*40+300, (*P).x*40+440, (*P).y*40+290}.draw(5, Palette::Silver);
Line{(*P).x*40+440, (*P).y*40+290, (*P).x*40+540, (*P).y*40+290}.draw(5, Palette::Silver);
Line{(*P).x*40+540, (*P).y*40+290, (*P).x*40+560, (*P).y*40+310}.draw(5, Palette::Silver);
Line{(*P).x*40+560, (*P).y*40+310, (*P).x*40+580, (*P).y*40+310}.draw(5, Palette::Silver);
Line{(*P).x*40+580, (*P).y*40+310, (*P).x*40+620, (*P).y*40+290}.draw(5, Palette::Silver);
}
}
MachineToEdit FileToEditData(FilePath FP){
MachineToEdit EditData;
TextReader reader{FP};
while(not reader){TextReader reader{FP};}
String line;
reader.readLine(line);
while(line != U"end"){
const Array<String> items = line.split(',');
EditData.sticks << stick{Point{Parse<int>(items[0]), Parse<int>(items[1])}, Point{Parse<int>(items[2]), Parse<int>(items[3])}};
reader.readLine(line);
}
reader.readLine(line);
while(line != U"end"){
const Array<String> items = line.split(',');
EditData.wheels.emplace(Point{Parse<int>(items[0]), Parse<int>(items[1])}, wheel{Parse<int>(items[2])});
reader.readLine(line);
}
reader.readLine(line);
const Array<String> itemss = line.split(',');
EditData.SpoonJoint = Point{Parse<int>(itemss[0]), Parse<int>(itemss[1])};
return EditData;
}
void EditDataToFile(MachineToEdit EditData, FilePath FP){
TextWriter writer{FP};
while(not writer){TextWriter writer{FP};}
for(stick s : EditData.sticks){
writer << s.P1.x << U"," << s.P1.y << U"," << s.P2.x << U"," << s.P2.y;
}
writer << U"end";
for(auto&& [P, W] : EditData.wheels){
writer << P.x << U"," << P.y << U"," << W.size;
}
writer << U"end";
writer << (*EditData.SpoonJoint).x << U"," << (*EditData.SpoonJoint).y;
return;
}
MachineInWorld EditDataToBodyData(MachineToEdit EditData, P2Filter Filter, bool IsFriend = true){
MachineInWorld BodyData = EmptyMachineInWorld;
if(IsFriend){
for(int i = 0; i < EditData.sticks.size(); i++){
BodyData.sticks << world.createRect(P2BodyType::Dynamic, Vec2{(EditData.sticks[i].P1.x+EditData.sticks[i].P2.x)*20+400,(EditData.sticks[i].P1.y+EditData.sticks[i].P2.y)*20+300}, Vec2{6.0,sqrt(pow(EditData.sticks[i].P1.x-EditData.sticks[i].P2.x,2.0)+pow(EditData.sticks[i].P1.y-EditData.sticks[i].P2.y,2.0))*40}, P2Material{8.0, 0.1, 0.3}, Filter).setAngle(atan2(double(EditData.sticks[i].P2.x-EditData.sticks[i].P1.x), double(EditData.sticks[i].P1.y-EditData.sticks[i].P2.y)));
BodyData.points.emplace(EditData.sticks[i].P1, world.createRect(P2BodyType::Dynamic, Vec2{EditData.sticks[i].P1.x*40+400,EditData.sticks[i].P1.y*40+300}, 10, P2Material{8.0, 0.1, 0.3}, Filter).setFixedRotation(true));
BodyData.distancejoints << world.createDistanceJoint(BodyData.sticks[i], BodyData.points[EditData.sticks[i].P1].getPos(), BodyData.points[EditData.sticks[i].P1], BodyData.points[EditData.sticks[i].P1].getPos(), 0.0).setDamping(50.0).setStiffness(40000.0).setMaxLength(1.0);
BodyData.points.emplace(EditData.sticks[i].P2, world.createRect(P2BodyType::Dynamic, Vec2{EditData.sticks[i].P2.x*40+400,EditData.sticks[i].P2.y*40+300}, 10, P2Material{8.0, 0.1, 0.3}, Filter).setFixedRotation(true));
BodyData.distancejoints << world.createDistanceJoint(BodyData.sticks[i], BodyData.points[EditData.sticks[i].P2].getPos(), BodyData.points[EditData.sticks[i].P2], BodyData.points[EditData.sticks[i].P2].getPos(), 0.0).setDamping(50.0).setStiffness(40000.0).setMaxLength(1.0);
}
for(auto&& [P, W] : EditData.wheels){
P2Body Wheel = world.createCircle(P2BodyType::Dynamic, Vec2{P.x*40+400, P.y*40+300}, W.size, P2Material{5.0, 0.3, 3.0}, Filter);
BodyData.points.emplace(P, world.createRect(P2BodyType::Dynamic, Vec2{P.x*40+400,P.y*40+300}, 10, P2Material{8.0, 0.1, 0.3}, Filter).setFixedRotation(true));
BodyData.wheels.emplace(P, WheelAndJoint{Wheel, world.createWheelJoint(BodyData.points[P], Wheel, Wheel.getPos(), Vec2{0, -1}).setLinearStiffness(18.0, 0.4).setLimits(-W.size+3, W.size-3).setLimitsEnabled(true).setMotorEnabled(true)});
}
BodyData.Spoon = world.createPolygon(P2Dynamic, Vec2{0, 0}, LineString{Vec2{(*EditData.SpoonJoint).x*40+400, (*EditData.SpoonJoint).y*40+300}, Vec2{(*EditData.SpoonJoint).x*40+440, (*EditData.SpoonJoint).y*40+290}, Vec2{(*EditData.SpoonJoint).x*40+540, (*EditData.SpoonJoint).y*40+290}, Vec2{(*EditData.SpoonJoint).x*40+560, (*EditData.SpoonJoint).y*40+310}, Vec2{(*EditData.SpoonJoint).x*40+580, (*EditData.SpoonJoint).y*40+310}, Vec2{(*EditData.SpoonJoint).x*40+620, (*EditData.SpoonJoint).y*40+290}}.calculateBuffer(2.5), P2Material{3.0, 0.1, 0.5}, Filter);
BodyData.points.emplace(*EditData.SpoonJoint, world.createRect(P2BodyType::Dynamic, Vec2{(*EditData.SpoonJoint).x*40+400,(*EditData.SpoonJoint).y*40+300}, 10, P2Material{8.0, 0.1, 0.3}, Filter).setFixedRotation(true));
BodyData.SpoonJoint = world.createPivotJoint(BodyData.Spoon, BodyData.points[*EditData.SpoonJoint], Vec2{(*EditData.SpoonJoint).x*40+400,(*EditData.SpoonJoint).y*40+300}).setMotorEnabled(true);
}else{
//未完成
}
return BodyData;
}
class ClippedCamera2D : public Camera2D
{
public:
/// @brief コンストラクタを継承します。
using Camera2D::Camera2D;
/// @brief クリッピング領域を設定します。
/// @param rect クリッピング領域
void setClipRect(const RectF& rect) noexcept
{
m_clipRect = rect;
}
/// @brief クリッピング領域を返します。
/// @return クリッピング領域
[[nodiscard]]
const RectF& getClipRect() const noexcept
{
return m_clipRect;
}
/// @brief 2D カメラを更新します。
/// @param deltaTime 前回の update からの経過時間(秒)
/// @param sceneSize レンダーターゲットのサイズ(ピクセル)
void update(double deltaTime = Scene::DeltaTime(), SizeF sceneSize = Graphics2D::GetRenderTargetSize())
{
Camera2D::update(deltaTime, sceneSize);
m_center.clamp(m_clipRect);
m_targetCenter.clamp(m_clipRect);
}
private:
RectF m_clipRect{ -1000, -1000, 2000, 2000 };
};
bool MyButton(String label, const double labelsize, const Point pos, const Point size, bool IsCircled = false, double CircleSize = 30){
if(IsCircled){
RoundRect rect = RoundRect{pos, size, CircleSize};
if(rect.mouseOver()){
rect.movedBy(0,-20).drawShadow(Vec2{0, 40}, 20, 2).draw(Palette::White).drawFrame(5, Palette::Black);
FontAsset(U"ButtonFont")(label).drawAt(labelsize, pos.x+size.x/2, pos.y+size.y/2-20, Palette::Black);
if(rect.leftClicked()){
return true;
}
}else{
rect.drawShadow(Vec2{0, 20}, 10, 1).draw(Palette::White).drawFrame(5, Palette::Black);
FontAsset(U"ButtonFont")(label).drawAt(labelsize, pos.x+size.x/2, pos.y+size.y/2, Palette::Black);
}
}else{
Rect rect = Rect{pos, size};
if(rect.mouseOver()){
rect.movedBy(0,-20).drawShadow(Vec2{0, 40}, 20, 2).draw(Palette::White).drawFrame(5, Palette::Black);
FontAsset(U"ButtonFont")(label).drawAt(labelsize, pos.x+size.x/2, pos.y+size.y/2-20, Palette::Black);
if(rect.leftClicked()){
return true;
}
}else{
rect.drawShadow(Vec2{0, 20}, 10, 1).draw(Palette::White).drawFrame(5, Palette::Black);
FontAsset(U"ButtonFont")(label).drawAt(labelsize, pos.x+size.x/2, pos.y+size.y/2, Palette::Black);
}
}
return false;
}
void MySelectBar(Array<String>& labels, double labelsize, int& selectedindex, double width = 100.0){
for(int x = 0; x < labels.size(); x++){
if(x == selectedindex){
RectF{Arg::center(800.0-((labels.size()-1)/2.0-x)*width, 1200),width,300}.draw(ColorF(1.0)).drawFrame(5, ColorF(0.2));
FontAsset(U"ButtonFont")(labels[x]).drawAt(labelsize, 800.0-((labels.size()-1)/2.0-x)*width, 1150, Palette::Black);
}else{
if(RectF{Arg::center(800.0-((labels.size()-1)/2.0-x)*width, 1200),width,200}.mouseOver()){
RectF{Arg::center(800.0-((labels.size()-1)/2.0-x)*width, 1200),width,250}.draw(ColorF(1.0, 0.5)).drawFrame(5, ColorF(0.2, 0.5));
FontAsset(U"ButtonFont")(labels[x]).drawAt(labelsize, 800.0-((labels.size()-1)/2.0-x)*width, 1150, Palette::Black);
}else{
RectF{Arg::center(800.0-((labels.size()-1)/2.0-x)*width, 1200),width,200}.draw(ColorF(1.0, 0.5)).drawFrame(5, ColorF(0.2, 0.5));
FontAsset(U"ButtonFont")(labels[x]).drawAt(labelsize, 800.0-((labels.size()-1)/2.0-x)*width, 1150, Palette::Black);
}
if(RectF{Arg::center(800.0-((labels.size()-1)/2.0-x)*width, 1200),width,200}.leftClicked()){
selectedindex = x;
}
}
}
return;
}
void Main(){
Stopwatch warning;
Scene::SetResizeMode(ResizeMode::Keep);
Scene::Resize(1600, 1200);
Window::SetStyle(WindowStyle::Sizable);
Window::Maximize();
Window::SetTitle(U"Flatware Collision");
int selectedindex = 0;
bool draging = false;
stick dragingstick;
MachineToEdit EdittingMachine;
MachineInWorld MyMachine;
MachineInWorld EnemyMachine;
int wheelsize = 30;
double MaxTotalLength = 35.01;
double motorspeed = 14.0;
double motortorque = 120000;
double spoonspeed = 2.0;
double spoontorque = 1000000.0;
Array<String> str;
str << U"Create Stick";
str << U"Delete Stick";
str << U"Create Wheel";
str << U"Delete Wheel";
str << U"Spoon";
Array<FilePath> paths;
const Font italicfont{FontMethod::MSDF, 48, Typeface::Medium, FontStyle::Italic};
FontAsset::Register(U"ButtonFont", FontMethod::MSDF, 48, Typeface::Medium);
double accumulatedTime = 0.0;
Array<Vec2> floorpoints(3200);
for(int x = 0; x < 3200; x++){
floorpoints[x].x = (x-1600)*2;
}
for(int x = 0; x < 3200; x++){
for(int i = 1; i < 20; i++){
floorpoints[x].y += sin(x/double(i)*2)*i/15;
}
floorpoints[x].y -= 330.0;
}
P2Body floor = world.createLineString(P2BodyType::Static, Vec2{3200, 1200}, LineString{floorpoints}, OneSided::Yes, P2Material{1.0, 0.5, 0.5});
constexpr P2Filter FriendFilter{ .categoryBits = 0b0000'0000'0000'010, .maskBits = 0b1111'1111'1111'1001 };
constexpr P2Filter EnemyFilter{ .categoryBits = 0b0000'0000'0000'0100, .maskBits = 0b1111'1111'1111'0011 };
bool WorldAwake = false;
int GameScene = 0;
const FilePath MainDirectory = U"example/FlatwareCollision/";
while(not FileSystem::CreateDirectories(MainDirectory));
const FilePath MachineDirectory = U"example/FlatwareCollision/Machines/";
while(not FileSystem::CreateDirectories(MachineDirectory));
ClippedCamera2D camera{Vec2{800, 600}, 1.0, CameraControl::Mouse};
while (System::Update()){
Scene::Rect().draw(Arg::top = ColorF{0.2, 0.5, 1.0}, Arg::bottom = ColorF{0.5, 0.8, 1.0});
if(WorldAwake){
for(accumulatedTime += Scene::DeltaTime(); StepTime <= accumulatedTime; accumulatedTime -= StepTime){
world.update(StepTime);
}
}
switch(GameScene){
case 0:
{//main menu
WorldAwake = false;
italicfont(U"Flatware Collision").drawAt(TextStyle::OutlineShadow(0.2, Palette::Red, Vec2{2, 2}, ColorF{ 0.0, 0.5 }), 120, 800, 300);
if(MyButton(U"Machine Creation", 60, Point{150, 500}, Point{550, 150})){
GameScene = 2;
selectedindex = 0;
EdittingMachine = EmptyMachineToEdit;
}
if(MyButton(U"Edit Machine File", 60, Point{150, 800}, Point{550, 150})){
GameScene = 4;
paths = FileSystem::DirectoryContents(U"example/FlatwareCollision/Machines/", Recursive::No);
}
if(MyButton(U"Battle", 60, Point{900, 500}, Point{550, 150})){
GameScene = 5;
paths = FileSystem::DirectoryContents(U"example/FlatwareCollision/Machines/", Recursive::No);
}
if(MyButton(U"Setting", 60, Point{900, 800}, Point{550, 150})){
GameScene = 1;
}
}
break;
case 1:
{//setting
}
break;
case 2:
{//machine creation
if(KeyT.down()){
if(EdittingMachine.SpoonJoint){
WorldAwake = not WorldAwake;
camera.setCenter(Vec2{800, 600});
if(WorldAwake){
camera.setClipRect(RectF{400, 200, 6000, 700});
MyMachine = EditDataToBodyData(EdittingMachine, FriendFilter);
}else{
camera.setClipRect(RectF{400, 300, 800, 600});
}
}else{
warning.restart();
}
}
camera.update();{
Transformer2D t = camera.createTransformer();
if(WorldAwake){
floor.draw(Palette::Lightgreen);
for(P2Body b : MyMachine.sticks){
b.draw(Palette::Gray);
}
MyMachine.Spoon.draw(Palette::Silver);
for(auto&& [P, WAJ] : MyMachine.wheels){
WAJ.wheel.draw(Palette::Lightgray).drawWireframe(2, Palette::Orange);
}
for(auto&& [key, value] : MyMachine.points){
value.draw(Palette::White);
}
if(MyMachine.wheels.size() > 0){
if(KeyD.pressed()){
for(auto&& [P, WAJ] : MyMachine.wheels){
WAJ.joint.setMaxMotorTorque(20000+motortorque/MyMachine.wheels.size()).setMotorSpeed(motorspeed);
}
}else if(KeyA.pressed()){
for(auto&& [P, WAJ] : MyMachine.wheels){
WAJ.joint.setMaxMotorTorque(10000+motortorque/MyMachine.wheels.size()/2).setMotorSpeed(-motorspeed/2);
}
}else{
for(auto&& [P, WAJ] : MyMachine.wheels){
WAJ.joint.setMotorSpeed(0);
}
}
}
if(KeyW.pressed()){
MyMachine.SpoonJoint.setMaxMotorTorque(spoontorque).setMotorSpeed(spoonspeed);
}else if(KeyS.pressed()){
MyMachine.SpoonJoint.setMaxMotorTorque(spoontorque).setMotorSpeed(-spoonspeed);
}else{
MyMachine.SpoonJoint.setMaxMotorTorque(spoontorque * 1.5).setMotorSpeed(0.0);
}
}else{
for(int x = 0; x < 21; x++){
for(int y = 0; y < 11; y++){
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.mouseOver()){
Rect{Arg::center(400+x*40, 300+y*40), 40}.draw(ColorF{0.0, 0.07});
}
Rect{Arg::center(400+x*40, 300+y*40), 10}.draw(ColorF{1.0, 0.3});
}
}
switch (selectedindex){
case 0:
{
for(auto&& [P, W] : EdittingMachine.wheels){
Circle{400+P.x*40, 300+P.y*40, W.size}.draw(Palette::Lightgray);
}
for(stick s : EdittingMachine.sticks){
Line{400+s.P1.x*40,300+s.P1.y*40,400+s.P2.x*40,300+s.P2.y*40}.draw(6,Palette::Gray);
}
DrawSpoon(EdittingMachine.SpoonJoint);
if(draging){
bool IsError = false;
const double LenghthOfDragingStick = sqrt(pow(dragingstick.P1.x-dragingstick.P2.x, 2.0)+pow(dragingstick.P1.y-dragingstick.P2.y, 2.0));
const double MaxCreatableLenghth = Min(4.15, MaxTotalLength-EdittingMachine.TotalLength);
if(dragingstick.P1 == dragingstick.P2 || LenghthOfDragingStick >= MaxCreatableLenghth){
IsError = true;
}
Circle{400+dragingstick.P1.x*40, 300+dragingstick.P1.y*40, MaxCreatableLenghth*40}.drawFrame(5, ColorF{1.0, 0.0}, ColorF{1.0, 1.0});
Line{400+dragingstick.P1.x*40,300+dragingstick.P1.y*40,Cursor::Pos().x,Cursor::Pos().y}.draw(6,IsError?Palette::Red:Palette::Gray);
for(int x = 0; x < 21; x++){
for(int y = 0; y < 11; y++){
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.mouseOver()){
dragingstick.P2 = Point{x,y};
if(not MouseL.pressed()){
if(not IsError){
EdittingMachine.sticks << dragingstick;
EdittingMachine.TotalLength += LenghthOfDragingStick;
}
}
}
}
}
if(not MouseL.pressed()){
draging = false;
}
}else{
for(int x = 0; x < 21; x++){
for(int y = 0; y < 11; y++){
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.leftClicked()){
draging = true;
dragingstick.P1 = Point{x,y};
}
}
}
}
}
break;
case 1:
{
Optional<int> SelectedStickIndex = none;
for(auto&& [P, W] : EdittingMachine.wheels){
Circle{400+P.x*40, 300+P.y*40, W.size}.draw(Palette::Lightgray);
}
for(int i = 0; i < EdittingMachine.sticks.size(); i++){
if(Line{400+EdittingMachine.sticks[i].P1.x*40,300+EdittingMachine.sticks[i].P1.y*40,400+EdittingMachine.sticks[i].P2.x*40,300+EdittingMachine.sticks[i].P2.y*40}.intersects(Circle(Cursor::Pos(), 7))){
SelectedStickIndex = i;
}
}
DrawSpoon(EdittingMachine.SpoonJoint);
for(int i = 0; i < EdittingMachine.sticks.size(); i++){
Line{400+EdittingMachine.sticks[i].P1.x*40,300+EdittingMachine.sticks[i].P1.y*40,400+EdittingMachine.sticks[i].P2.x*40,300+EdittingMachine.sticks[i].P2.y*40}.draw(6,SelectedStickIndex==i?Palette::Red:Palette::Gray);
}
if(SelectedStickIndex && MouseL.down()){
EdittingMachine.TotalLength -= sqrt(pow(EdittingMachine.sticks[*SelectedStickIndex].P1.x-EdittingMachine.sticks[*SelectedStickIndex].P2.x, 2.0)+pow(EdittingMachine.sticks[*SelectedStickIndex].P1.y-EdittingMachine.sticks[*SelectedStickIndex].P2.y, 2.0));
for(int i = *SelectedStickIndex+1; i < EdittingMachine.sticks.size(); i++){
EdittingMachine.sticks[i-1] = EdittingMachine.sticks[i];
}
EdittingMachine.sticks.pop_back();
}
}
break;
case 2:
{
for(stick s : EdittingMachine.sticks){
Line{400+s.P1.x*40,300+s.P1.y*40,400+s.P2.x*40,300+s.P2.y*40}.draw(6,Palette::Gray);
}
DrawSpoon(EdittingMachine.SpoonJoint);
for(auto&& [P, W] : EdittingMachine.wheels){
Circle{400+P.x*40, 300+P.y*40, W.size}.draw(Palette::Lightgray);
}
for(int x = 0; x < 21; x++){
for(int y = 0; y < 11; y++){
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.mouseOver()){
Circle{400+x*40, 300+y*40, wheelsize}.draw(Palette::Lightgray);
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.leftClicked()){
EdittingMachine.wheels.emplace(Point{x, y}, wheel{wheelsize});
}
}
}
}
}
break;
case 3:
{
for(stick s : EdittingMachine.sticks){
Line{400+s.P1.x*40,300+s.P1.y*40,400+s.P2.x*40,300+s.P2.y*40}.draw(6,Palette::Gray);
}
DrawSpoon(EdittingMachine.SpoonJoint);
for(auto&& [P, W] : EdittingMachine.wheels){
Circle{400+P.x*40, 300+P.y*40, W.size}.draw(Palette::Lightgray);
}
for(int x = 0; x < 21; x++){
for(int y = 0; y < 11; y++){
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.mouseOver()){
if(EdittingMachine.wheels.contains(Point{x, y})){
Circle{400+x*40, 300+y*40, EdittingMachine.wheels[Point{x, y}].size}.draw(Palette::Red);
}
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.leftClicked()){
EdittingMachine.wheels.erase(Point{x, y});
}
}
}
}
}
break;
case 4:
{
for(auto&& [P, W] : EdittingMachine.wheels){
Circle{400+P.x*40, 300+P.y*40, W.size}.draw(Palette::Lightgray);
}
for(stick s : EdittingMachine.sticks){
Line{400+s.P1.x*40,300+s.P1.y*40,400+s.P2.x*40,300+s.P2.y*40}.draw(6,Palette::Gray);
}
DrawSpoon(EdittingMachine.SpoonJoint);
for(int x = 0; x < 21; x++){
for(int y = 0; y < 11; y++){
if(Rect{Arg::center(400+x*40, 300+y*40), 40}.leftClicked()){
if(EdittingMachine.SpoonJoint && *EdittingMachine.SpoonJoint == Point{x, y}){
EdittingMachine.SpoonJoint = none;
}else{
EdittingMachine.SpoonJoint = Point{x, y};
}
}
}
}
}
break;
default:
break;
}
}
}
if(not WorldAwake){
if(warning.sF() < 2.0 && warning.isRunning()){
FontAsset(U"ButtonFont")(U"You Must Create A Spoon").drawAt(80, 800, 900, ColorF{1.0, 0.0, 0.0, abs(Sin(warning.sF()*3.1416)*0.8)});
}
if(MyButton(U"Back To Top", 35, Point{50, 50}, Point{300, 60})){
GameScene = 0;
}
if(MyButton(U"Save", 35, Point{1350, 50}, Point{200, 60})){
if(EdittingMachine.SpoonJoint){
int N = 1;
while(FileSystem::IsFile(MachineDirectory + U"SaveData" + Format(N))){
N++;
}
EditDataToFile(EdittingMachine, MachineDirectory + U"SaveData" + Format(N));
}else{
warning.restart();
}
}
MySelectBar(str, 30, selectedindex, 250);
if(selectedindex == 0 || selectedindex == 1){
FontAsset(U"ButtonFont")(U"Max Total Stick Length {:.1f} / {:.1f}"_fmt(MaxTotalLength, EdittingMachine.TotalLength)).drawAt(40, 800, 200, Palette::Black);
}
if(selectedindex == 2){
if(MyButton(U"Change Wheel Size", 35, Point{1150, 150}, Point{400, 60})){
wheelsize += 9;
if(wheelsize > 57){
wheelsize = 30;
}
}
}
}
}
break;
case 3:
{//battle
}
break;
case 4:
{//choose file
FontAsset(U"ButtonFont")(U"Please Choose A File").drawAt(40, 400, 100, Palette::Black);
if(MyButton(U"Back To Home", 30, Point{800, 75}, Point{300, 50})){
GameScene = 0;
}
for(int i = 0; i < paths.size(); i++){
Array<String> st = paths[i].split('/');
if(MyButton(st[st.size()-1], 30, Point{100, 200+i*100}, Point{800, 60})){
GameScene = 2;
selectedindex = 0;
EdittingMachine = FileToEditData(paths[i]);
}
}
}
break;
case 5:
{
FontAsset(U"ButtonFont")(U"Please Choose A Enemy").drawAt(40, 400, 100, Palette::Black);
if(MyButton(U"Back To Home", 30, Point{800, 75}, Point{300, 50})){
GameScene = 0;
}
for(int i = 0; i < paths.size(); i++){
Array<String> st = paths[i].split('/');
if(MyButton(st[st.size()-1], 30, Point{100, 200+i*100}, Point{800, 60})){
GameScene = 3;
selectedindex = 0;
EnemyMachine = EditDataToBodyData(FileToEditData(paths[i]), EnemyFilter, false);
}
}
}
default:
break;
}
}
}
@rikkun2X
Copy link
Author

rikkun2X commented Nov 5, 2023

Hyper Crasher Dreamと一行目に書いてありますが、その後Flatware Collisionに変更しました

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment