鱼C论坛

 找回密码
 立即注册
查看: 1182|回复: 9

[已解决]类内定义了一个私有成员的IMGAE对象,在public里面定义了一个调用该对象的

[复制链接]
发表于 2023-5-1 20:14:14 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 猪猪虾 于 2023-5-1 20:19 编辑

这个坎。。。。
我定义的Mainplane.h文件 里面的静态成员static IMAGE imgMyplane;所以在Mainplane.cpp的文件头做了类外的声明
然后在成员函数getImage_Myplane里面返回这个对象,我也尝试了不定义静态的情况,一样的直接崩溃,在主程序
GameMain.cpp文件调用到这个getImage_Myplane的时候  。。。。

捕获.JPG



Mainplane.h文件
#pragma once
#include<graphics.h>
#include<cstring>
#include<vector>
//#include "GameMain.h"
using namespace std;
class GameMain;

class MyPlane
{
public:
        MyPlane();
        //static IMAGE getImages();    //私有成员可以在public里面,通过函数来间接访问和修改
        void Move(int dx, int dy);
        static IMAGE getImage_Myplane();


        int My_current_posiX;
        int My_current_posiY;
        int width;
        int height;

private:
        static IMAGE imgMyplane;
        GameMain *GM;
};

Mainplane.cpp文件
#pragma once
#include<graphics.h>
#include<cstring>
#include<vector>
#include "MyPlane.h"
#include "GameMain.h"
using namespace std;

//静态成员,需要在类外进行声明
IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间

//`MyPlane` 类在头文件 `MyPlane.h` 中声明,而 `imgMyplane` 的定义位于与类实现相关联的源文件 
//`MyPlane.cpp` 中。这样,您就解决了 `LNK2001` 错误。
//如果您将所有代码放在同一个文件中,那么只需在类定义之后添加 `IMAGE MyPlane::imgMyplane; ` 这一行即可。
//IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间


MyPlane::MyPlane()
{
        width = 100;
        height = 125;
        loadimage(&imgMyplane, "E:/2022上/Leecode_April/plane/image/me1.png");

        //初始化飞机的位置在图像的正下方的中心
        
        My_current_posiX = GM->rows / 2 - width / 2;
        My_current_posiY = GM->cols - height;
}


IMAGE MyPlane::getImage_Myplane()
{
        return imgMyplane;
}

void MyPlane::Move(int dx, int dy)
{
        
        My_current_posiX += dx;
        My_current_posiY += dy;

        //判断是否超出了边界,还要考虑飞机本身的宽度
        if (My_current_posiX > (GM->rows - width / 2) || My_current_posiX < width / 2)
        {
                My_current_posiX -= dx;
        }

        if (My_current_posiX > (GM->cols - height / 2) || My_current_posiX < height / 2)
        {
                My_current_posiY -= dy;
        }
}


GameMain.h文件
#pragma once
#include<graphics.h>
#include<cstring>
#include<vector>
//#include<MyPlane.h> 如果这里这么用,会发现 当前.h文件和MyPlane.h文件的彼此头文件相互包含,会报错
class MyPlane;  //告诉编译器,需要这个类,其他功能结构都没变
using namespace std;

class GameMain
{

        friend class MyPlane;
public:
        //构造函数  用于初始化参数,游戏界面设置

        GameMain();

        //游戏界面初始化
        void init(); 
        void paly(); // 开始游戏
        int* getBgSize();

        int rows;
        int cols;

private:
        void keyEvent();  //按键控制
        void updateWindow();  //渲染界面

private:
        bool update;
        // 添加这一行,这样其他地方调用这个类的时候,就不用每次都申明,不同地方申明,还是不同的对象,无法
        //实现同时操作一辆飞机
        MyPlane *MP;

        //背景图像参数
        IMAGE imgBg;  //背景图片
};

GameMain.cpp文件
#include "GameMain.h"
#include "MyPlane.h"
#include "Bullet.h"
#include<stdlib.h>
#include <time.h>
#include<graphics.h>
#include <conio.h>
#include"iostream"
#include"string"
#include "fstream"
//音效
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"WINMM.LIB")

using namespace std;

GameMain::GameMain()
{
        //将游戏界面的宽度指定成背景图片的显示宽度
        rows = 438;
        cols = 675;
}

void GameMain::init()
{
        //播放背景音乐
        mciSendString("play E:/2022上/res/bg.mp3 repeat", 0, 0, 0); 

        //创建游戏窗口
        *initgraph(rows, cols);

        //加载背景图片
        loadimage(&imgBg, "E:/2022上/Leecode_April/plane/image/background.png");

        update = true;
}

void GameMain::paly()
{
        init();

        while (1)
        {
                BeginBatchDraw();
                //接收用户的输入
                keyEvent();

                //更新游戏画面
                updateWindow();
                system("pause");
                EndBatchDraw();
        }
}

int* GameMain::getBgSize()
{
        int num[] = { rows ,cols };
        int* ptr = new int[2];
        for (int i = 0; i < 2; i++) {
                ptr[i] = num[i];
        }
        return ptr;
}


void GameMain::keyEvent()
{
        unsigned char ch;
        int dx = 0;
        int dy = 0;

        //判断当前有没有按键输入,如果他没有按键输入,程序正常执行
        if (_kbhit()) {
                ch = _getch();

                //按下字母,返回的就是字母,按下的是方向键
                //上,先后返回: 224 72  下:224 80   左:75 224,75  右:224 77
                if (ch == 224) {
                        ch = _getch();
                        switch (ch) {
                        case 72:
                                dy = 1;
                                break;
                        case 80:
                                dy = -1;
                                break;
                        case 75:
                                dx = -1;
                                break;
                        case 77:
                                dx = 1;
                                break;
                        default:
                                break;
                        }
                }
        }
        if (dx != 0 || dy != 0)  //左右移动
        {
//                MyPlane MP;
                MP->Move(dx,dy);
                update = true;
        }
}

void GameMain::updateWindow()
{
        putimage(0, 0, &imgBg);

        BeginBatchDraw();
        //绘制我方飞机
        //MyPlane MP;
        IMAGE TEMP_my;
        TEMP_my = MP->getImage_Myplane();
        putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);


        //绘制子弹
        Bullet BT;
        IMAGE TEMP_BT;
        TEMP_BT = BT.getImage_Bullet();
        putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_BT);

        EndBatchDraw();
}
最佳答案
2023-5-1 20:14:15
猪猪虾 发表于 2023-5-1 21:02
按照您说得改了一下,我把暂时用不到的子程序都注释掉了,报的错还是一样的,太难了。。

根据您提供的代码,我注意到了一个问题。在  GameMain::updateWindow()  函数中,您在绘制子弹时使用了一个临时的  Bullet  对象,而这个对象并没有被正确地初始化。您需要将子弹对象加入到一个容器中(如  vector ),并在游戏主循环中对这些子弹进行更新和绘制。

首先,您需要在  GameMain  类中添加一个  vector  容器来存储子弹对象:
#include <vector>
#include "Bullet.h"

class GameMain {
    // ...
private:
    // ...
    std::vector<Bullet> bullets;  // 添加子弹容器
};

然后,在游戏主循环中,您可以创建子弹并将它们添加到  bullets  容器中。在此之后,您需要在  GameMain::updateWindow()  函数中迭代  bullets  容器,并更新和绘制每个子弹:
void GameMain::updateWindow() {
    putimage(0, 0, &imgBg);

    BeginBatchDraw();

    // 绘制我方飞机
    IMAGE TEMP_my;
    TEMP_my = MP->getImage_Myplane();
    putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);

    // 绘制子弹
    for (Bullet& bullet : bullets) {
        bullet.update();  // 更新子弹位置
        IMAGE TEMP_BT;
        TEMP_BT = bullet.getImage_Bullet();
        putimage(bullet.getPosX(), bullet.getPosY(), &TEMP_BT);
    }

    EndBatchDraw();
}

这里需要注意的是,您还需要在  Bullet  类中添加一个更新子弹位置的函数(例如, update() )以及获取子弹位置的函数(例如, getPosX()  和  getPosY() )。

希望这些建议能帮助您解决问题。如果您还有其他问题或疑问,请随时告诉我。

最佳答案

查看完整内容

根据您提供的代码,我注意到了一个问题。在 GameMain::updateWindow() 函数中,您在绘制子弹时使用了一个临时的 Bullet 对象,而这个对象并没有被正确地初始化。您需要将子弹对象加入到一个容器中(如 vector ),并在游戏主循环中对这些子弹进行更新和绘制。 首先,您需要在 GameMain 类中添加一个 vector 容器来存储子弹对象: 然后,在游戏主循环中,您可以创建子弹并将它们添加到 bullets 容器中。在此 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:14:15 | 显示全部楼层    本楼为最佳答案   
猪猪虾 发表于 2023-5-1 21:02
按照您说得改了一下,我把暂时用不到的子程序都注释掉了,报的错还是一样的,太难了。。

根据您提供的代码,我注意到了一个问题。在  GameMain::updateWindow()  函数中,您在绘制子弹时使用了一个临时的  Bullet  对象,而这个对象并没有被正确地初始化。您需要将子弹对象加入到一个容器中(如  vector ),并在游戏主循环中对这些子弹进行更新和绘制。

首先,您需要在  GameMain  类中添加一个  vector  容器来存储子弹对象:
#include <vector>
#include "Bullet.h"

class GameMain {
    // ...
private:
    // ...
    std::vector<Bullet> bullets;  // 添加子弹容器
};

然后,在游戏主循环中,您可以创建子弹并将它们添加到  bullets  容器中。在此之后,您需要在  GameMain::updateWindow()  函数中迭代  bullets  容器,并更新和绘制每个子弹:
void GameMain::updateWindow() {
    putimage(0, 0, &imgBg);

    BeginBatchDraw();

    // 绘制我方飞机
    IMAGE TEMP_my;
    TEMP_my = MP->getImage_Myplane();
    putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);

    // 绘制子弹
    for (Bullet& bullet : bullets) {
        bullet.update();  // 更新子弹位置
        IMAGE TEMP_BT;
        TEMP_BT = bullet.getImage_Bullet();
        putimage(bullet.getPosX(), bullet.getPosY(), &TEMP_BT);
    }

    EndBatchDraw();
}

这里需要注意的是,您还需要在  Bullet  类中添加一个更新子弹位置的函数(例如, update() )以及获取子弹位置的函数(例如, getPosX()  和  getPosY() )。

希望这些建议能帮助您解决问题。如果您还有其他问题或疑问,请随时告诉我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:17:01 | 显示全部楼层
代码不完整
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-1 20:18:13 | 显示全部楼层

补了一下,刚卡壳了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:21:09 | 显示全部楼层
根据您提供的信息,我无法确定导致程序崩溃的确切原因,但是可以提供一些可能导致崩溃的问题。

在Mainplane.cpp文件中,MyPlane::GM指针没有分配内存。您需要在MyPlane的构造函数中为其分配内存。如果没有分配内存,当您在Mainplane.cpp中调用MyPlane类的成员函数时,该指针将指向未知的内存地址,从而导致程序崩溃。例如,在MyPlane构造函数中添加以下代码:
MyPlane::MyPlane()
{
        GM = new GameMain; // 分配内存
        // ... 其他代码 ...
}
无法确定您是否正确地链接了库文件。如果您在链接库文件时出现问题,程序可能无法正常运行。您可以通过检查链接器输出或查看Visual Studio的“输出”窗口来检查是否存在任何错误或警告消息。

您的代码中可能存在内存泄漏或未定义的行为。例如,如果您在GameMain类的成员函数中创建动态分配的内存,并忘记在使用完毕后释放该内存,则可能导致内存泄漏。这可能会导致程序在一段时间后崩溃。要解决这个问题,您可以使用内存分析器工具,如Valgrind,在运行时检查您的程序是否存在内存泄漏或未定义的行为。

您的代码可能存在逻辑错误。例如,在您的MyPlane类中,如果您在Move()函数中检查当前位置是否超出边界时,使用了错误的变量(如cols而不是rows),则可能导致逻辑错误。您可以通过使用调试器逐行执行代码来检查逻辑错误。

希望这些信息对您有所帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:25:22 | 显示全部楼层
猪猪虾 发表于 2023-5-1 20:18
补了一下,刚卡壳了

[b]从你的代码来看,你在  MyPlane  类的构造函数中使用了  GameMain  类的指针  GM 。但是,你没有初始化这个指针,所以在访问  GM->rows  和  GM->cols  时可能会导致程序崩溃。你需要在  MyPlane  类的构造函数中接收一个  GameMain  类的指针,并将其赋给  GM 。以下是修改后的建议代码:

MyPlane.h文件
class MyPlane
{
public:
    MyPlane(GameMain *gm);  // 将 GameMain 类的指针作为参数传递给构造函数
    ...
private:
    ...
    GameMain *GM;
};

Mainplane.cpp文件
MyPlane::MyPlane(GameMain *gm) : GM(gm)
{
    width = 100;
    height = 125;
    loadimage(&imgMyplane, "E:/2022上/Leecode_April/plane/image/me1.png");

    //初始化飞机的位置在图像的正下方的中心
    My_current_posiX = GM->rows / 2 - width / 2;
    My_current_posiY = GM->cols - height;
}

接下来,你需要在  GameMain  类中创建  MyPlane  类的实例时传递一个  GameMain  类的指针。你可以修改  GameMain  类的构造函数来实现这一点:

GameMain.h文件
class GameMain
{
    ...
public:
    GameMain();
    ...
private:
    ...
    MyPlane *MP;
    ...
};

GameMain.cpp文件
GameMain::GameMain()
{
    //将游戏界面的宽度指定成背景图片的显示宽度
    rows = 438;
    cols = 675;
    MP = new MyPlane(this);  // 在创建 MyPlane 实例时传递 GameMain 类的指针
}

注意,你需要在  GameMain  类的析构函数中删除  MyPlane  类的实例以避免内存泄漏。在  GameMain  类中添加一个析构函数,并在其中删除  MP :

GameMain.h文件
class GameMain
{
    ...
public:
    ~GameMain();  // 添加析构函数
    ...
};

GameMain.cpp文件
GameMain::~GameMain()
{
    delete MP;  // 删除 MyPlane 实例
}

这些更改应该可以解决你的程序崩溃问题。请尝试修改你的代码,并测试是否可以正常运行。
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-1 20:26:21 | 显示全部楼层
根据提供的代码,我注意到在 Mainplane.cpp 文件中,MyPlane 类的静态成员 imgMyplane 进行了类外的声明,但是没有进行定义。

在头文件 Mainplane.h 中,我们只能看到静态成员的声明,但是没有找到对应的定义。因此,可能会在链接时出现错误。

解决此问题的方法是在 Mainplane.cpp 文件中添加如下代码,对静态成员进行定义:
IMAGE MyPlane::imgMyplane;
此外,我还注意到在 MyPlane 类的构造函数中,初始化了一个指向 GameMain 类对象的指针 GM,但是并没有为其分配内存空间。因此,需要在 GameMain 类的构造函数中,为 MyPlane 类对象的指针 MP 分配内存空间,如下所示:
GameMain::GameMain()
{
    // 将游戏界面的宽度指定成背景图片的显示宽度
    rows = 438;
    cols = 675;

    // 为 MyPlane 类对象的指针 MP 分配内存空间
    MP = new MyPlane();
}
最后,我建议您检查一下代码中是否存在其他可能导致崩溃的问题,例如是否对指针进行了非法操作等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-1 21:02:00 | 显示全部楼层
本帖最后由 猪猪虾 于 2023-5-1 21:03 编辑
isdkz 发表于 2023-5-1 20:25
从你的代码来看,你在  MyPlane  类的构造函数中使用了  GameMain  类的指针  GM 。但是,你没有初始化这 ...


按照您说得改了一下,我把暂时用不到的子程序都注释掉了,报的错还是一样的,太难了。。
#pragma once
#include<graphics.h>
#include<cstring>
#include<vector>
//#include "GameMain.h"
using namespace std;
class GameMain;

class MyPlane
{
public:
        MyPlane(GameMain* gm);  //  MyPlane  类的构造函数中使用了 GameMain 类的指针  GM 。但是,你没有初始化这个指针
        //static IMAGE getImages();    //私有成员可以在public里面,通过函数来间接访问和修改
        void Move(int dx, int dy);
        static IMAGE getImage_Myplane();

        int My_current_posiX;
        int My_current_posiY;
        int width;
        int height;

private:
        static IMAGE imgMyplane;
        GameMain *GM;
};
#pragma once
#include<graphics.h>
#include<cstring>
#include<vector>
#include "MyPlane.h"
#include "GameMain.h"

using namespace std;

//静态成员,需要在类外进行声明
IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间

//`MyPlane` 类在头文件 `MyPlane.h` 中声明,而 `imgMyplane` 的定义位于与类实现相关联的源文件 
//`MyPlane.cpp` 中。这样,您就解决了 `LNK2001` 错误。
//如果您将所有代码放在同一个文件中,那么只需在类定义之后添加 `IMAGE MyPlane::imgMyplane; ` 这一行即可。
//IMAGE MyPlane::imgMyplane;  // 这一行为 imgMyplane 分配内存空间


MyPlane::MyPlane(GameMain* gm):GM(gm)
{
        width = 100;
        height = 125;
        loadimage(&imgMyplane, "E:/2022上/Leecode_April/plane/image/me1.png");

        //初始化飞机的位置在图像的正下方的中心
        
        My_current_posiX = GM->rows / 2 - width / 2;
        My_current_posiY = GM->cols - height;
}

IMAGE MyPlane::getImage_Myplane()
{
        return imgMyplane;
}

void MyPlane::Move(int dx, int dy)
{
        
        My_current_posiX += dx;
        My_current_posiY += dy;

        //判断是否超出了边界,还要考虑飞机本身的宽度
        if (My_current_posiX > (GM->rows - width / 2) || My_current_posiX < width / 2)
        {
                My_current_posiX -= dx;
        }

        if (My_current_posiX > (GM->cols - height / 2) || My_current_posiX < height / 2)
        {
                My_current_posiY -= dy;
        }
}
#pragma once
#include<graphics.h>
#include<cstring>
#include<vector>
//#include<MyPlane.h> 如果这里这么用,会发现 当前.h文件和MyPlane.h文件的彼此头文件相互包含,会报错
class MyPlane;  //告诉编译器,需要这个类,其他功能结构都没变
using namespace std;

class GameMain
{
public:
        //构造函数  用于初始化参数,游戏界面设置

        GameMain();

        //注意,你需要在  GameMain  类的析构函数中删除  MyPlane  
   //类的实例*以避免内存泄漏。在  GameMain  类中添加一个析构函数,并在其中删除  MP :GameMain.h文件
        ~GameMain();  // 添加析构函数
        //游戏界面初始化
        void init(); 
        void paly(); // 开始游戏
        int* getBgSize();

        int rows;
        int cols;

private:
        void keyEvent();  //按键控制
        void updateWindow();  //渲染界面

private:
        bool update;

        // 添加这一行,这样其他地方调用这个类的时候,就不用每次都申明,不同地方申明,还是不同的对象,无法
        //实现同时操作一辆飞机
        MyPlane *MP;

        //背景图像参数
        IMAGE imgBg;  //背景图片
};
#include "GameMain.h"
#include "MyPlane.h"
#include "Bullet.h"
#include<stdlib.h>
#include <time.h>
#include<graphics.h>
#include <conio.h>
#include"iostream"
#include"string"
#include "fstream"
//音效
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"WINMM.LIB")

using namespace std;

GameMain::GameMain()
{
        MP = new MyPlane(this);  // 在创建 MyPlane 实例时传递 GameMain 类的指针
        // 为 MyPlane 类对象的指针 MP 分配内存空间
        //MP = new MyPlane();
        //将游戏界面的宽度指定成背景图片的显示宽度
        rows = 438;
        cols = 675;
}

//析构函数主要作用就是释放资源, 避免内存泄漏
GameMain::~GameMain()
{
        delete MP;  // 删除 MyPlane 实例
}

void GameMain::init()
{
        //播放背景音乐
        mciSendString("play E:/2022上/res/bg.mp3 repeat", 0, 0, 0); 

        //创建游戏窗口
        *initgraph(rows, cols);

        //加载背景图片
        loadimage(&imgBg, "E:/2022上/Leecode_April/plane/image/background.png");

        update = true;
}

void GameMain::paly()
{
        init();

        while (1)
        {
                BeginBatchDraw();
                //接收用户的输入
                //keyEvent();

                //更新游戏画面
                updateWindow();
                system("pause");
                EndBatchDraw();
        }
}

//int* GameMain::getBgSize()
//{
//        int num[] = { rows ,cols };
//        int* ptr = new int[2];
//        for (int i = 0; i < 2; i++) {
//                ptr[i] = num[i];
//        }
//        return ptr;
//}


//void GameMain::keyEvent()
//{
//        unsigned char ch;
//        int dx = 0;
//        int dy = 0;
//
//        //判断当前有没有按键输入,如果他没有按键输入,程序正常执行
//        if (_kbhit()) {
//                ch = _getch();
//
//                //按下字母,返回的就是字母,按下的是方向键
//                //上,先后返回: 224 72  下:224 80   左:75 224,75  右:224 77
//                if (ch == 224) {
//                        ch = _getch();
//                        switch (ch) {
//                        case 72:
//                                dy = 1;
//                                break;
//                        case 80:
//                                dy = -1;
//                                break;
//                        case 75:
//                                dx = -1;
//                                break;
//                        case 77:
//                                dx = 1;
//                                break;
//                        default:
//                                break;
//                        }
//                }
//        }
//        if (dx != 0 || dy != 0)  //左右移动
//        {
////                MyPlane MP;
//        //        MP->Move(dx,dy);
//                update = true;
//        }
//}

void GameMain::updateWindow()
{
        putimage(0, 0, &imgBg);

        BeginBatchDraw();

        //绘制我方飞机
        //MyPlane MP;
        IMAGE TEMP_my;
        TEMP_my = MP->getImage_Myplane();
        putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_my);

        //绘制子弹
        Bullet BT;
        IMAGE TEMP_BT;
        TEMP_BT = BT.getImage_Bullet();
        putimage(MP->My_current_posiX, MP->My_current_posiY, &TEMP_BT);

        EndBatchDraw();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-2 20:26:43 | 显示全部楼层
isdkz 发表于 2023-5-1 22:02
根据您提供的代码,我注意到了一个问题。在  GameMain::updateWindow()  函数中,您在绘制子弹时使用了一 ...

谢谢,解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-3 21:45:22 | 显示全部楼层
陶远航 发表于 2023-5-1 20:21
根据您提供的信息,我无法确定导致程序崩溃的确切原因,但是可以提供一些可能导致崩溃的问题。

在Mainpl ...

忘了表示感谢了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 20:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表