From 9702060aaa89bf3dabfbe604dc335e123f34b6e0 Mon Sep 17 00:00:00 2001 From: Wider Date: Sat, 11 Apr 2020 02:01:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E7=BB=84=E7=BB=87=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=9D=97=E7=BA=A7=E7=A2=B0?= =?UTF-8?q?=E6=92=9E=E6=A3=80=E6=B5=8B=EF=BC=8C=E7=A6=81=E6=AD=A2=E5=A4=9A?= =?UTF-8?q?=E7=BA=A7=E8=B7=B3=E8=B7=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BaseObject.cpp | 180 ++++++++++++++++++ BaseObject.h | 142 +++++++------- Global.cpp | 16 ++ Global.h | 108 +---------- Map.cpp | 32 ++++ Map.h | 35 ++-- Mario.cpp | 84 ++++++++ Mario.h | 81 +------- Rocket.cpp | 18 ++ Rocket.h | 14 ++ ...7\351\251\254\351\207\214\345\245\245.cpp" | 9 +- ...1\251\254\351\207\214\345\245\245.vcxproj" | 6 + ...4\351\207\214\345\245\245.vcxproj.filters" | 18 ++ 13 files changed, 477 insertions(+), 266 deletions(-) create mode 100644 BaseObject.cpp create mode 100644 Global.cpp create mode 100644 Map.cpp create mode 100644 Mario.cpp create mode 100644 Rocket.cpp create mode 100644 Rocket.h diff --git a/BaseObject.cpp b/BaseObject.cpp new file mode 100644 index 0000000..92a3d7d --- /dev/null +++ b/BaseObject.cpp @@ -0,0 +1,180 @@ +#include "BaseObject.h" + +Vector Vector::operator = (const Vector& rhs) { + _x = rhs._x; + _y = rhs._y; + return *this; +} +Vector Vector::operator + (const Vector& rhs) const { + return Vector(_x + rhs._x, _y + rhs._y); +} +Vector Vector::operator - (const Vector& rhs) const { + return Vector(_x - rhs._x, _y - rhs._y); +} +Vector Vector::operator * (const double rhs) const { + return Vector(_x * rhs, _y * rhs); +} +Vector Vector::operator / (const double rhs) const { + return Vector(_x / rhs, _y / rhs); +} +Vector Vector::operator += (const Vector& rhs) { + *this = *this + rhs; + return *this; +} +Vector Vector::operator -= (const Vector& rhs) { + *this = *this - rhs; + return *this; +} +Vector Vector::operator *= (const double rhs) { + *this = *this * rhs; + return *this; +} +Vector Vector::operator /= (const double rhs) { + *this = *this / rhs; + return *this; +} +bool Vector::operator == (const Vector& rhs) const { + if(_x == rhs._x && _y == rhs._y) return true; + else return false; +} +bool Vector::operator == (const double rhs) const { + if(_x == rhs && _y == rhs) return true; + else return false; +} +bool Vector::operator != (const Vector& rhs) const { + if(*this == rhs) return false; + else return true; +} +double Vector::x() { return (_x); } +double Vector::y() { return (_y); } +void Vector::x(double x) { _x = x; } +void Vector::y(double y) { _y = y; } +void Vector::set(double x, double y) { _x = x, _y = y; } + +void Figure::addFigure(string name, vector imgs, vector masks, function tigger) { + if(figures.empty() && !imgs.empty()) { + _width = imgs.front().getwidth(); + _height = imgs.front().getheight(); + } + figures.push_back(FigureData{name, imgs, masks, tigger}); +} +void Figure::update(int x, int y) { + for(auto& i : figures) + { + if(i.tigger()) { + using namespace std::chrono; + static auto time_tick = steady_clock::now(); + static size_t cnt = 0; + if(_status != i.name) { + time_tick = steady_clock::now(); + cnt = 0; + _status = i.name; + } + putimage(x, y, &i.masks[i.images.size() - cnt - 1], NOTSRCERASE); + putimage(x, y, &i.images[i.images.size() - cnt - 1], SRCINVERT); + if((steady_clock::now() - time_tick) >= milliseconds(100)) { + cnt = (cnt + 1) % i.images.size(); + time_tick = steady_clock::now(); + } + + } + } +} +void Figure::turn() { + for(auto& i : figures) + { + for(auto& j : i.images) rotateFlip(&j); + for(auto& j : i.masks) rotateFlip(&j); + } +} +string Figure::status() +{ + return _status; +} +void Figure::status(string s) +{ + _status = s; +} +int Figure::width() { + return _width; +} +int Figure::height() { + return _height; +} + +int BaseObject::width() { + return _width; +} +int BaseObject::height() { + return _height; +} +void BaseObject::width(int w) { + _width = w; +} +void BaseObject::height(int h) { + _height = h; +} +void BaseObject::update(double time) { + position += (velocity * time + acceleration * time * time / 2); + //position += velocity * time; + velocity += acceleration * time; +} +void BaseObject::show() { + figure.update(static_cast(round(position.x())), static_cast(round(position.y()))); +} +bool BaseObject::block_crash(BaseObject& t) { + //if( + // position.x() > t.position.x() - figure.width() && position.x() < t.position.x() + t.figure.width() + // && + // position.y() > t.position.y() - figure.height() && position.y() < t.position.y() + t.figure.height() + // ) + // return true; + //cout << t.position.x() << " " << t.position.y() << endl; + int px = static_cast(round(position.x())), + py = static_cast(round(position.y())), + tpx = static_cast(round(t.position.x())), + tpy = static_cast(round(t.position.y())); + + //上碰撞(相对被撞物体) + if(px + width() -1 >= tpx && px <= tpx + t.width() -1 && + py + height() >= tpy && py < tpy) { + if(velocity.y() > 0) { + velocity.y(0); + position.y((double)tpy - height()); + } + return true; + } + //下碰撞 + if(px + width() -1 >= tpx && px <= tpx + t.width() -1 && + py + height() -1 > tpy + height() -1 && py <= tpy + t.height()) { + if(velocity.y() < 0) { + velocity.y(0); + position.y((double)tpy + t.height()); + } + return true; + } + //左碰撞 + if(px + width() >= tpx && px < tpx && + py + height() >= tpy && py <= tpy + t.height()) { + if(velocity.x() > 0) { + velocity.x(0); + position.x((double)tpx - width()); + } + return true; + } + //右碰撞 + if(px + width() > tpx + t.width()&& px <= tpx + t.width() && + py + height() >= tpy && py <= tpy + t.height()) { + if(velocity.x() < 0) { + velocity.x(0); + position.x((double)tpx + t.width()); + } + return true; + } + return false; +} +//bool BaseObject::pxiel_crash() { +// +//} + + diff --git a/BaseObject.h b/BaseObject.h index de4bef2..51c07e1 100644 --- a/BaseObject.h +++ b/BaseObject.h @@ -1,93 +1,103 @@ #pragma once +#ifndef _BASIC_OBJECT_H_ +#define _BASIC_OBJECT_H_ + + +#include +#include +#include +#include #include "Global.h" -#include -#include + + +class Vector { + private: + double _x; + double _y; + public: + Vector():_x(0), _y(0) {} + Vector(const double x, const double y):_x(x), _y(y) {} + Vector(const Vector& v):_x(v._x), _y(v._y) {} + Vector operator = (const Vector& rhs); + Vector operator + (const Vector& rhs) const; + Vector operator - (const Vector& rhs) const; + Vector operator * (const double rhs) const; + Vector operator / (const double rhs) const; + Vector operator += (const Vector& rhs); + Vector operator -= (const Vector& rhs); + Vector operator *= (const double rhs); + Vector operator /= (const double rhs); + bool operator == (const Vector& rhs) const; + bool operator == (const double rhs) const; + bool operator != (const Vector& rhs) const; + double x(); + double y(); + void x(double x); + void y(double y); + void set(double x, double y); +}; +class Position: public Vector { + public: + using Vector::Vector; + using Vector::operator=; +}; +class Velocity: public Vector { + public: + using Vector::Vector; + using Vector::operator=; +}; +class Acceleration: public Vector { + public: + using Vector::Vector; + using Vector::operator=; +}; struct FigureData { string name; vector images; vector masks; std::function tigger; }; + class Figure { private: vector figures; int _width; int _height; - string status; + string _status; public: - Figure():figures(),_width(0),_height(0),status("default") {} - void addFigure(string name, vector imgs, vector masks, function tigger) { - if(figures.empty() && !imgs.empty()) { - _width = imgs.front().getwidth(); - _height = imgs.front().getheight(); - } - figures.push_back(FigureData{name, imgs, masks, tigger}); - } - void update(int x, int y) { - for(auto& i : figures) - { - if(i.tigger()) { - using namespace std::chrono; - static auto time_tick = steady_clock::now(); - static int cnt = 0; - if(status != i.name) { - time_tick = steady_clock::now(); - cnt = 0; - status = i.name; - } - putimage(x, y, &i.masks[i.images.size()-cnt-1], NOTSRCERASE); - putimage(x, y, &i.images[i.images.size()-cnt-1], SRCINVERT); - if((steady_clock::now() - time_tick) >= milliseconds(100)) { - cnt = (cnt + 1) % i.images.size(); - time_tick = steady_clock::now(); - } - - } - } - } - void turn() { - for(auto& i : figures) - { - for(auto& j : i.images) rotateFlip(&j); - for(auto& j : i.masks) rotateFlip(&j); - } - } - int width() { - return _width; - } - int height() { - return _height; - } + Figure():figures(),_width(0),_height(0),_status("default") {} + void addFigure(string name, vector imgs, vector masks, function tigger); + void update(int x, int y); + void turn(); + string status(); + void status(string s); + int width(); + int height(); }; class BaseObject { + private: + int _width; + int _height; protected: Position position; Velocity velocity; Acceleration acceleration; Figure figure; public: - BaseObject():position(), velocity(), acceleration(0, 0.004), figure(){} - void update(double time) { - position += (velocity * time + acceleration * time * time / 2); - velocity += acceleration * time; - } - void show() { - figure.update(position.x(), position.y()); - } - bool block_crash(BaseObject & t) { - if( - position.x() > t.position.x() - figure.width() && position.x() < t.position.x() + t.figure.width() - && - position.y() > t.position.y() - figure.height() && position.y() < t.position.y() + t.figure.height() - ) - return true; - return false; - } - bool pxiel_crash() { - - } + BaseObject():_width(0),_height(0),position(), velocity(), acceleration(0, 0.004), figure(){} + int width(); + int height(); + void width(int w); + void height(int h); + void update(double time); + void show(); + bool block_crash(BaseObject& t); + bool pxiel_crash(); }; + + +#endif \ No newline at end of file diff --git a/Global.cpp b/Global.cpp new file mode 100644 index 0000000..161f6e9 --- /dev/null +++ b/Global.cpp @@ -0,0 +1,16 @@ +#include "Global.h" +#include +void rotateFlip(IMAGE* img) +{ + DWORD* img_pMem = GetImageBuffer(img); + + for(int y = 0; y < img->getheight(); y++) + { + for(int x = 0; x< int(img->getwidth() / 2 + 0.5); x++) + { + int num1 = y * img->getwidth() + x; + int num2 = (y + 1) * img->getwidth() - x - 1; + std::swap(img_pMem[num1], img_pMem[num2]); + } + } +} diff --git a/Global.h b/Global.h index fba4bc3..0d1d5fc 100644 --- a/Global.h +++ b/Global.h @@ -1,4 +1,6 @@ #pragma once +#ifndef _GLOBAL_H_ +#define _GLOBAL_H_ #define WINDOWS_WIDTH 640 #define WINDOWS_HEIGHT 480 @@ -10,111 +12,11 @@ using namespace std; #endif -#define RUNNING 0 -#define STILL 1 -#define JUMPPING 2 - #define RIGHT 0 #define LEFT 1 +#include +void rotateFlip(IMAGE* img); -#include -void rotateFlip(IMAGE* img) -{ - DWORD* img_pMem = GetImageBuffer(img); - - for(int y = 0; y< img->getheight(); y++) - { - for(int x = 0; x< int(img->getwidth()/2+0.5); x++) - { - int num1 = y*img->getwidth()+x; - int num2 = (y+1)*img->getwidth()-x-1; - std::swap(img_pMem[num1], img_pMem[num2]); - } - } -} - - -class Vector { - private: - double _x; - double _y; - public: - Vector():_x(0), _y(0) {} - Vector(const double x, const double y):_x(x), _y(y) {} - Vector(const Vector& v):_x(v._x), _y(v._y) {} - Vector operator = (const Vector& rhs) { - _x = rhs._x; - _y = rhs._y; - return *this; - } - Vector operator + (const Vector& rhs) const { - return Vector(_x + rhs._x, _y + rhs._y); - } - Vector operator - (const Vector& rhs) const { - return Vector(_x - rhs._x, _y - rhs._y); - } - Vector operator * (const double rhs) const { - return Vector(_x * rhs, _y * rhs); - } - Vector operator / (const double rhs) const { - if(rhs != 0) - return Vector(_x / rhs, _y / rhs); - } - Vector operator += (const Vector& rhs) { - *this = *this + rhs; - return *this; - } - Vector operator -= (const Vector& rhs) { - *this = *this - rhs; - return *this; - } - Vector operator *= (const double rhs) { - *this = *this * rhs; - return *this; - } - Vector operator /= (const double rhs) { - *this = *this / rhs; - return *this; - } - bool operator == (const Vector& rhs) const { - if(_x == rhs._x && _y == rhs._y) return true; - else return false; - } - bool operator == (const double rhs) const { - if(_x == rhs && _y == rhs) return true; - else return false; - } - bool operator != (const Vector& rhs) const { - if(*this == rhs) return false; - else return true; - } - double x() { return (_x); } - double y() { return (_y); } - void x(double x) { _x = x; } - void y(double y) { _y = y; } - void set(double x, double y) { _x = x, _y = y; } -}; -class Position: public Vector { - public: - using Vector::Vector; - using Vector::operator=; - - //Position(const Vector& v):Vector(v) {} - -}; -class Velocity: public Vector { - public: - using Vector::Vector; - using Vector::operator=; - - //Velocity(const Vector& v):Vector(v) {} -}; -class Acceleration: public Vector { - public: - using Vector::Vector; - using Vector::operator=; - - //Acceleration(const Vector& v):Vector(v) {} -}; +#endif \ No newline at end of file diff --git a/Map.cpp b/Map.cpp new file mode 100644 index 0000000..91fadf3 --- /dev/null +++ b/Map.cpp @@ -0,0 +1,32 @@ +#include "Map.h" + + +void Map::init(BaseObject* h) +{ + loadimage(&background, _T("assert\\images\\map1.png")); + //注意坐标是从0开始的 + rocket.push_back(Rocket(-1, 0, 1, WINDOWS_HEIGHT)); + rocket.push_back(Rocket(7818, 0, 1, WINDOWS_HEIGHT)); + rocket.push_back(Rocket(0, 411, 2366, 69)); + rocket.push_back(Rocket(2434, 411, 515, 69)); + rocket.push_back(Rocket(3051, 411, 2195, 69)); + rocket.push_back(Rocket(5314, 411, 2503, 69)); + hero = h; +} + +void Map::show() +{ + putimage(0, 0, &background); +} + +void Map::update() +{ + check_crash(); +} + +void Map::check_crash() +{ + for(auto& i : rocket) { + hero->block_crash(i); + } +} diff --git a/Map.h b/Map.h index 24343ab..dcc2234 100644 --- a/Map.h +++ b/Map.h @@ -1,36 +1,25 @@ #pragma once +#ifndef _MAP_H_ +#define _MAP_H_ -#include + +#include #include "Global.h" +#include "Rocket.h" class Map { private: IMAGE background; + vector rocket; + BaseObject* hero; public: - Map(); - ~Map(); - void loadResource(); + Map():background(NULL), rocket({}),hero(NULL){}; + void init(BaseObject* h); void show(); - + void update(); + void check_crash(); }; -Map::Map() -{ - -} - -Map::~Map() -{ - -} -inline void Map::loadResource() -{ - loadimage(&background, _T("assert\\images\\map1.png")); -} - -inline void Map::show() -{ - putimage(0, 0, &background); -} +#endif \ No newline at end of file diff --git a/Mario.cpp b/Mario.cpp new file mode 100644 index 0000000..77b7e46 --- /dev/null +++ b/Mario.cpp @@ -0,0 +1,84 @@ +#include "Mario.h" + +void Mario::run() { + if(direction == RIGHT) + velocity.x(0.3); + else + velocity.x(-0.3); +} + +void Mario::jump() { + if(figure.status() == "jumpping" || figure.status() == "falling") return; + position.y(position.y()); + velocity.y(-1); +} + +void Mario::still() { + velocity.x(0); +} + +void Mario::turn(int d) { + if(direction != d) { + direction = !direction; + figure.turn(); + } +} + +void Mario::init() { + LPCTSTR img_src, mask_src; + img_src = _T("assert\\images\\mario.png"); + mask_src = _T("assert\\images\\mario_mask.png"); + int figure_num = 5; + IMAGE origin, organ_mask; + loadimage(&origin, img_src); + loadimage(&organ_mask, mask_src); + int width = origin.getwidth() / figure_num; + int height = origin.getheight(); + + this->width(width); + this->height(height); + vector imgs, masks; + IMAGE temp; + + SetWorkingImage(&origin); + getimage(&temp, 0, 0, width, height); + imgs.push_back(temp); + SetWorkingImage(&organ_mask); + getimage(&temp, 0, 0, width, height); + masks.push_back(temp); + figure.addFigure("still", imgs, masks, [this]()->bool { + if(velocity.x() == 0 && velocity.y() == 0) return true; + return false; + }); + figure.addFigure("falling", imgs, masks, [this]()->bool { + if(velocity.y() > 0) return true; + return false; + }); + imgs.clear(); masks.clear(); + for(int i = 0; i < 3; i++) { + SetWorkingImage(&origin); + getimage(&temp, width + width * i, 0, width, height); + imgs.push_back(temp); + SetWorkingImage(&organ_mask); + getimage(&temp, width + width * i, 0, width, height); + masks.push_back(temp); + } + figure.addFigure("running", imgs, masks, [this]()->bool { + if(velocity.x() != 0 && velocity.y() == 0) return true; + return false; + }); + + imgs.clear(); masks.clear(); + SetWorkingImage(&origin); + getimage(&temp, width * 4, 0, width, height); + imgs.push_back(temp); + SetWorkingImage(&organ_mask); + getimage(&temp, width * 4, 0, width, height); + masks.push_back(temp); + figure.addFigure("jumpping", imgs, masks, [this]()->bool { + if(velocity.y() < 0) return true; + return false; + }); + + SetWorkingImage(NULL); +} diff --git a/Mario.h b/Mario.h index b89e196..7626687 100644 --- a/Mario.h +++ b/Mario.h @@ -1,7 +1,9 @@ #pragma once +#ifndef _MARIO_H_ +#define _MARIO_H_ + #include -#include "Global.h" #include "BaseObject.h" #define MARIO_X 0 @@ -14,75 +16,12 @@ class Mario: public BaseObject int direction; public: Mario():BaseObject(),direction(RIGHT){} - void run() { - if(direction == RIGHT) - velocity.x(0.3); - else - velocity.x(-0.3); - } - void jump() { - velocity.y(-0.7); - } - void still() { - velocity.x(0); - } - void turn(int d) { - if(direction != d) { - direction = !direction; - figure.turn(); - } - } - void init() { - LPCTSTR img_src, mask_src; - img_src = _T("assert\\images\\mario.png"); - mask_src = _T("assert\\images\\mario_mask.png"); - int figure_num = 5; - IMAGE origin, organ_mask; - loadimage(&origin, img_src); - loadimage(&organ_mask, mask_src); - int width = origin.getwidth() / figure_num; - int height = origin.getheight(); - vector imgs,masks; - IMAGE temp; - - SetWorkingImage(&origin); - getimage(&temp, 0, 0, width, height); - imgs.push_back(temp); - SetWorkingImage(&organ_mask); - getimage(&temp, 0, 0, width, height); - masks.push_back(temp); - figure.addFigure("still", imgs, masks, [this]()->bool{ - if(velocity.x() == 0) return true; - return false; - }); - - imgs.clear(); masks.clear(); - for(int i = 0; i < 3; i++) { - SetWorkingImage(&origin); - getimage(&temp, width + width * i, 0, width, height); - imgs.push_back(temp); - SetWorkingImage(&organ_mask); - getimage(&temp, width + width * i, 0, width, height); - masks.push_back(temp); - } - figure.addFigure("running", imgs, masks, [this]()->bool { - if(velocity.x() != 0 && velocity.y()>=0) return true; - return false; - }); - - imgs.clear(); masks.clear(); - SetWorkingImage(&origin); - getimage(&temp, width * 4, 0, width, height); - imgs.push_back(temp); - SetWorkingImage(&organ_mask); - getimage(&temp, width * 4, 0, width, height); - masks.push_back(temp); - figure.addFigure("jumpping", imgs, masks, [this]()->bool { - if(velocity.y() < 0) return true; - return false; - }); + void run(); + void jump(); + void still(); + void turn(int d); + void init(); +}; - SetWorkingImage(NULL); - } -}; \ No newline at end of file +#endif \ No newline at end of file diff --git a/Rocket.cpp b/Rocket.cpp new file mode 100644 index 0000000..010e715 --- /dev/null +++ b/Rocket.cpp @@ -0,0 +1,18 @@ +#include "Rocket.h" + + +Rocket::Rocket(int x, int y, int width, int height) +{ + position.x(x); + position.y(y); + this->width(width); + this->height(height); +} + +void Rocket::setRocket(int x, int y, int width, int height) +{ + position.x(x); + position.y(y); + this->width(width); + this->height(height); +} diff --git a/Rocket.h b/Rocket.h new file mode 100644 index 0000000..0e5f8f2 --- /dev/null +++ b/Rocket.h @@ -0,0 +1,14 @@ +#pragma once +#ifndef _ROCKET_H_ +#define _ROCKET_H_ + +#include "BaseObject.h" +class Rocket : public BaseObject +{ + public: + Rocket():BaseObject(){} + Rocket(int x, int y, int width, int height); + void setRocket(int x,int y,int width,int height); +}; + +#endif \ No newline at end of file diff --git "a/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.cpp" "b/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.cpp" index a123741..3e9f34e 100644 --- "a/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.cpp" +++ "b/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.cpp" @@ -3,15 +3,16 @@ #include #include "Mario.h" #include "Map.h" -#include "Controller.h" +//#include "Controller.h" -Map map; Mario mario; +Map map; //寮濮嬬晫闈 void start() { } + //鏇存柊瀹炴椂鏁版嵁 void update() { if(GetAsyncKeyState(VK_SPACE)) @@ -27,6 +28,7 @@ void update() { //鍒锋柊鐢婚潰 void reflush(double x) { mario.update(x); + map.update(); cleardevice(); map.show(); mario.show(); @@ -39,8 +41,9 @@ int main() { initgraph(WINDOWS_WIDTH, WINDOWS_HEIGHT, SHOWCONSOLE); - map.loadResource(); mario.init(); + map.init(&mario); + BeginBatchDraw(); const int TICKS_PER_SECOND = 60; diff --git "a/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj" "b/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj" index 2cbd099..5f6502a 100644 --- "a/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj" +++ "b/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj" @@ -151,6 +151,11 @@ + + + + + @@ -159,6 +164,7 @@ + diff --git "a/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj.filters" "b/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj.filters" index c3da6ae..e7ba60e 100644 --- "a/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj.filters" +++ "b/\350\266\205\347\272\247\351\251\254\351\207\214\345\245\245.vcxproj.filters" @@ -14,6 +14,21 @@ 婧愭枃浠 + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + @@ -31,5 +46,8 @@ 澶存枃浠 + + 澶存枃浠 + \ No newline at end of file