游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6908|回复: 12

有没有直接基于GDI或GDI+的游戏引擎啊 ?

[复制链接]

36

主题

76

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2007-3-13 12:37:00 | 显示全部楼层 |阅读模式
因项目需要, 想找一款基于GDI或GDI+的游戏引擎来参考 ,


大家帮帮忙 !

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-3-13 12:50:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

……GDI+本身封装得那么棒,干嘛还要开发在其上开发引擎啊?……
不过GDI+的效率实在不敢恭维。

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2007-3-13 18:42:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2007-3-13 20:43:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

很久以前发过的,再帖出来一遍。

(还称不上“引擎”吧,源代码只供参考)

支持图像绘制,缩放,Alpha混合,只是非常简单的小东西,做大项目的话就算了。

VB和VC的都有,这是VB的:

--------------------------------------------------------------------------

将我的GDI演示里的代码简化整理之后做成的,我想一般小游戏够用了。

没有专门封装成DLL,而是提供一个标准模块(mdl)文件,也就是源代码:

先将代码贴在这里吧,将它整个复制到一个Mdl文件中即可



'================================GDI Engine Lite=============================================


Option Base 1  '约定默认下标下界为1

'GDI 常数声明---------------------------
    Public Const WS_EX_LAYERED = &H80000
   
    Public Const CLR_INVALID = &HFFFF
   
   
    Public Const AC_SRC_OVER = &H0
    Public Const AC_SRC_ALPHA = &H1
    Public Const AC_SRC_NO_PREMULT_ALPHA = &H1
    Public Const AC_SRC_NO_ALPHA = &H2
    Public Const AC_DST_NO_PREMULT_ALPHA = &H10
    Public Const AC_DST_NO_ALPHA = &H20
   
    Public Const LWA_COLORKEY = &H1
    Public Const LWA_ALPHA = &H2
   
    Public Const ULW_COLORKEY = &H1
    Public Const ULW_ALPHA = &H2
    Public Const ULW_OPAQUE = &H4
'---------------------------------------


Public Const cst_PI = 3.1415926

Public Type Rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

'GDI类型声明------------------------
    Public Type t_BLENDFUNCTION
      BlendOp As Byte
      BlendFlags As Byte
      SourceConstantAlpha As Byte
      AlphaFormat As Byte
    End Type
   
   
    Public Type POINTAPI
            x As Long
            y As Long
    End Type
'-----------------------------------


Public Type t_FxDraw
UseAlphaChannel1 As Boolean
AlphaByte As Byte
UseScale1 As Boolean
ScaleW1 As Long
ScaleH1 As Long
dwRop1 As Long
UseColorKey1 As Boolean
ColorKey1 As Long
End Type

Public Type t_Sprite1
Active1 As Boolean
X1 As Single
Y1 As Single
Xp1 As Single
Yp1 As Single
SrcRc1 As Rect
ResIdx1 As Long
nowFrame1 As Long
End Type

'//------------GDI声明-------------------
Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
                                            ByVal x As Long, ByVal y As Long, _
                                            ByVal nWidth As Long, _
                                            ByVal nHeight As Long, _
                                            ByVal hSrcDC As Long, _
                                            ByVal xSrc As Long, _
                                            ByVal ySrc As Long, _
                                            ByVal dwRop As Long) As Long

Public Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, _
                                                ByVal x As Long, _
                                                ByVal y As Long, _
                                                ByVal nWidth As Long, _
                                                ByVal nHeight As Long, _
                                                ByVal hSrcDC As Long, _
                                                ByVal xSrc As Long, _
                                                ByVal ySrc As Long, _
                                                ByVal nSrcWidth As Long, _
                                                ByVal nSrcHeight As Long, _
                                                ByVal dwRop As Long) As Long
                                                
Public Declare Function AlphaBlend Lib "msimg32" (ByVal hDestDC As Long, _
                                                ByVal xDest As Long, _
                                                ByVal yDest As Long, _
                                                ByVal nWidthDest As Long, _
                                                ByVal nHeightDest As Long, _
                                                ByVal hSrcDC As Long, _
                                                ByVal xSrc As Long, _
                                                ByVal ySrc As Long, _
                                                ByVal nWidthSrc As Long, _
                                                ByVal nHeightSRC As Long, _
                                                ByVal BLENDFUNCTION As Long) As Long
                                                
Public Declare Function TransparentBlt Lib "msimg32" (ByVal hDestDC As Long, _
                                                     ByVal xDest As Long, _
                                                     ByVal yDest As Long, _
                                                     ByVal nWidthDest As Long, _
                                                     ByVal nHeightDest As Long, _
                                                     ByVal hSrcDC As Long, _
                                                     ByVal xSrc As Long, _
                                                     ByVal ySrc As Long, _
                                                     ByVal nWidthSrc As Long, _
                                                     ByVal nHeightSRC As Long, _
                                                     ByVal crTransparent As Long) As Long
                                                     
Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long

Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

'==========================================================================================

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Declare Function timeGetTime Lib "winmm.dll" () As Long


Public ResPic1() As StdPicture
Public ResPicDC1() As Long
Public ResPicCount1 As Long

Public TargetSurf1 As PictureBox


Function LoadBitmap1(ByVal Idx1 As Long, File1 As String)
Set ResPic1(Idx1) = LoadPicture(File1)
ResPicDC1(Idx1) = CreateCompatibleDC(ByVal 0&)
SelectObject ResPicDC1(Idx1), ResPic1(Idx1).Handle

End Function

'------------标准绘图----------------------------------
Function GDI_Draw1(ByVal X1 As Long, ByVal Y1 As Long, ByVal ResIdx1 As Long, SrcRc1 As Rect, Optional dwRop1 As Long = vbSrcCopy)
Dim back1 As Long
back1 = BitBlt(TargetSurf1.hdc, X1, Y1, SrcRc1.Right - SrcRc1.Left, SrcRc1.Bottom - SrcRc1.Top, _
             ResPicDC1(ResIdx1), SrcRc1.Left, SrcRc1.Top, dwRop1)
            
If back1 = 0 Then MsgBox "GDI Draw Failed" & Chr(13) & "Err Code: " & Err.LastDllError, , "Error"

End Function

'-----------增强型绘图---------------------------------
Function GDI_DrawFx1(ByVal X1 As Long, ByVal Y1 As Long, _
                     ByVal ResIdx1 As Long, SrcRc1 As Rect, _
                     DrawInfo1 As t_FxDraw)
Dim back1 As Long, sWidth1 As Long, sHeight1 As Long, BltF1 As t_BLENDFUNCTION, BltP1 As Long

sWidth1 = SrcRc1.Right - SrcRc1.Left
sHeight1 = SrcRc1.Bottom - SrcRc1.Top

With DrawInfo1
  If (.UseAlphaChannel1) Or (.AlphaByte <> 255) Then
   
     BltF1.BlendOp = AC_SRC_OVER
     BltF1.BlendFlags = 0
     BltF1.SourceConstantAlpha = .AlphaByte
     If .UseAlphaChannel1 Then BltF1.AlphaFormat = AC_SRC_ALPHA Else BltF1.AlphaFormat = 0
     CopyMemory BltP1, BltF1, 4
   back1 = AlphaBlend(TargetSurf1.hdc, X1, Y1, sWidth1, sHeight1, ResPicDC1(ResIdx1), SrcRc1.Left, SrcRc1.Top, sWidth1, sHeight1, BltP1)
  ElseIf .UseScale1 Then
   If .UseColorKey1 Then
    back1 = TransparentBlt(TargetSurf1.hdc, X1, Y1, .ScaleW1, .ScaleH1, _
                       ResPicDC1(ResIdx1), SrcRc1.Left, SrcRc1.Top, sWidth1, sHeight1, .ColorKey1)
   Else
    back1 = StretchBlt(TargetSurf1.hdc, X1, Y1, .ScaleW1, .ScaleH1, _
                       ResPicDC1(ResIdx1), SrcRc1.Left, SrcRc1.Top, sWidth1, sHeight1, .dwRop1)
   End If
  ElseIf .UseColorKey1 Then
   back1 = TransparentBlt(TargetSurf1.hdc, X1, Y1, sWidth1, sHeight1, _
                       ResPicDC1(ResIdx1), SrcRc1.Left, SrcRc1.Top, sWidth1, sHeight1, .ColorKey1)
  Else
    GDI_Draw1 X1, Y1, ResIdx1, SrcRc1, .dwRop1
  End If
End With
If back1 = 0 Then MsgBox "GDI Draw Failed" & Chr(13) & "Err Code: " & Err.LastDllError, , "Error"
End Function

Function DeleteResPic1(Optional ByVal Idx1 As Long = -5)
If Idx1 = -5 Then
  Dim s1 As Long
  For s1 = 1 To ResPicCount1
   DeleteDC ResPicDC1(s1)
  Next
Else
  DeleteDC ResPicDC1(Idx1)
End If
End Function

Function RefreshTargetSurf1()
TargetSurf1.Refresh
End Function

Function ClearTargetSurf1()
TargetSurf1.Cls
End Function

Function DrawSprite1(tSprite1 As t_Sprite1, Optional dwRop1 As Long = vbSrcCopy)
GDI_Draw1 Int(tSprite1.X1), Int(tSprite1.Y1), tSprite1.ResIdx1, tSprite1.SrcRc1, dwRop1
            
End Function
Function DrawSpriteFX1(tSprite1 As t_Sprite1, DrawInfo1 As t_FxDraw)
GDI_DrawFx1 Int(tSprite1.X1), Int(tSprite1.Y1), tSprite1.ResIdx1, tSprite1.SrcRc1, DrawInfo1
            
End Function


Function GetSpriteSrcRect1(Sprite1 As t_Sprite1, ByVal XCount1 As Long, ByVal YCount1 As Long)
Dim Rc1 As Rect, X1 As Integer, Y1 As Integer, W1 As Long, H1 As Long

      X1 = Sprite1.nowFrame1 Mod XCount1
      Y1 = Sprite1.nowFrame1 \ XCount1 + 1
      
      W1 = Sprite1.SrcRc1.Right - Sprite1.SrcRc1.Left
      H1 = Sprite1.SrcRc1.Bottom - Sprite1.SrcRc1.Top
      
      If X1 = 0 Then
       X1 = XCount1
       Y1 = Y1 - 1
      End If
         
      Sprite1.SrcRc1.Left = W1 * (X1 - 1)
      Sprite1.SrcRc1.Top = H1 * (Y1 - 1)
      Sprite1.SrcRc1.Right = Sprite1.SrcRc1.Left + W1
      Sprite1.SrcRc1.Bottom = Sprite1.SrcRc1.Top + H1

End Function



32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2007-3-13 20:46:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

VC++版的,和上面VB的一样。

很乱,是从很久以前的工程中直接拿出来的。
----------------------------------------------------------------------

GDIE1.h:


// GDIE1.h: interface for the CGDIE1 class.
//
//////////////////////////////////////////////////////////////////////


#if !defined(AFX_GDIE1_H__CAED45F9_FA68_4A48_963F_9D22BBC51B68__INCLUDED_)
#define AFX_GDIE1_H__CAED45F9_FA68_4A48_963F_9D22BBC51B68__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#pragma comment( lib,"msimg32.lib")
//#define AC_SRC_OVER = 0
const AC_SRC_ALPHA = 1;

struct t_FxDraw
{
BOOL UseAlphaChannel1 ;
BYTE AlphaByte ;
BOOL UseScale1 ;
long ScaleW1 ;
long ScaleH1;
DWORD dwRop1 ;
BOOL UseColorKey1;
UINT ColorKey1;
};


struct t_Sprite1
{
BOOL Active1;
float X1;
float Y1;
float Xp1;
float Yp1;
RECT SrcRc1;
long ResIdx1;
long nowFrame1;
};



class CGDIE1
{
public:
CGDIE1();
CGDIE1(CDC *NewTargetDC1,CWinApp *NewApp1,long sTargetWidth1,long sTargetHeight1);
virtual ~CGDIE1();
CDC *TargetDC1;
CDC BackBuffer1;
CWinApp *App1;
long ResPicCount1;
CDC ResPicDC1[20];
RECT ResPicRect1[20];
long TargetWidth1;
long TargetHeight1;

BOOL Inited(){return sInited;};
BOOL ResPicActive1(long Idx1){return sResPicActive1[Idx1];};

void Init1(CDC *NewTargetDC1,CWinApp *NewApp1,long sTargetWidth1,long sTargetHeight1);
void LoadBitmap1(long Idx1,LPCTSTR File1);
void GDI_Draw1(long x1,long y1,long ResIdx1 ,RECT SrcRc1,DWORD dwRop1=SRCCOPY);
void GDI_DrawFx1(long x1,long y1,long ResIdx1,RECT SrcRc1,t_FxDraw DrawInfo);
void DelectResPic1(long Idx1);
void DelectResPic1();
void DrawSprite1(t_Sprite1 Sprite1,DWORD dwRop1=SRCCOPY);
void DrawSpriteFx1(t_Sprite1 Sprite1,t_FxDraw DrawInfo);
void GetSpriteSrcRect1(t_Sprite1 *Sprite1,long XCount1,long YCount1);
void ClearBackBuffer1(COLORREF Color1=0);
void RefreashTargetDC1();

protected:
BOOL sResPicActive1[20];
BOOL sInited;




};

#endif // !defined(AFX_GDIE1_H__CAED45F9_FA68_4A48_963F_9D22BBC51B68__INCLUDED_)








GDIE1.cpp :

// GDIE1.cpp: implementation of the CGDIE1 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "GDIE1.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGDIE1::CGDIE1()
{

}
CGDIE1::CGDIE1(CDC *NewTargetDC1,CWinApp *NewApp1,long sTargetWidth1,long sTargetHeight1)
{
Init1(NewTargetDC1,NewApp1, sTargetWidth1, sTargetHeight1);
}

CGDIE1::~CGDIE1()
{

}
//---------------------------------------------------------------------------------------
void CGDIE1::Init1(CDC *NewTargetDC1,CWinApp *NewApp1,long sTargetWidth1,long sTargetHeight1)
{
this->TargetDC1 =NewTargetDC1;
this->App1 =NewApp1;

CBitmap bmp1;
bmp1.CreateCompatibleBitmap(TargetDC1, sTargetWidth1, sTargetHeight1);
BackBuffer1.CreateCompatibleDC (TargetDC1);
BackBuffer1.SelectObject (&bmp1);

this->TargetHeight1 =sTargetHeight1;
this->TargetWidth1 =sTargetWidth1;

this->sInited =TRUE;
}


//---------------------------------------------------------------------------------------
void CGDIE1:oadBitmap1 (long Idx1,LPCTSTR File1)
{

LPDISPATCH lp2;
COleVariant v1;

v1.SetString (File1,VT_BSTR);

::OleLoadPictureFile (v1,&lp2);
v1.Clear();

::IPicture *pic1;
lp2->QueryInterface (IID_IPicture,(LPVOID*)&pic1);
lp2->Release() ;

this->ResPicDC1[Idx1].CreateCompatibleDC (this->TargetDC1 );

::OLE_HANDLE hd1;
pic1->get_Handle (&hd1);

::SelectObject (this->ResPicDC1[Idx1].m_hDC ,HGDIOBJ(hd1) );


SIZE sz1;
pic1->get_Width (&sz1.cx );
pic1->get_Height (&sz1.cy );
this->TargetDC1->HIMETRICtoDP(&sz1);

ResPicRect1[Idx1].left =0;
ResPicRect1[Idx1].top =0;
ResPicRect1[Idx1].right =long(sz1.cx ) ;
ResPicRect1[Idx1].bottom =long(sz1.cy );


pic1->Release();

this->sResPicActive1 [Idx1]=TRUE;

}
//---------------------------------------------------------------------------------------

void CGDIE1::GDI_Draw1(long x1,long y1,long ResIdx1,RECT SrcRc1,DWORD dwRop1)
{
long sback1;
sback1=this->BackBuffer1.BitBlt (x1,y1,SrcRc1.right - SrcRc1.left, SrcRc1.bottom - SrcRc1.top,
&ResPicDC1[ResIdx1], SrcRc1.left, SrcRc1.top, dwRop1);
this->sResPicActive1[ResIdx1]=TRUE;
if (sback1==0) AfxMessageBox("Failed",MB_ICONSTOP,0);

}
//---------------------------------------------------------------------------------------

void CGDIE1::GDI_DrawFx1(long x1,long y1,long ResIdx1,RECT SrcRc1,t_FxDraw DrawInfo)
{

long sback1,sWidth1,sHeight1;
BLENDFUNCTION BltF1;
sWidth1 = SrcRc1.right - SrcRc1.left;
sHeight1 = SrcRc1.bottom - SrcRc1.top;
if ((DrawInfo.UseAlphaChannel1) || (DrawInfo.AlphaByte != 255))
{
BltF1.BlendOp = AC_SRC_OVER;
BltF1.BlendFlags = 0;
BltF1.SourceConstantAlpha = DrawInfo.AlphaByte;

if (DrawInfo.UseAlphaChannel1 ) BltF1.AlphaFormat = AC_SRC_ALPHA;
else BltF1.AlphaFormat =0;
sback1=AlphaBlend(this->BackBuffer1.m_hDC ,x1,y1,sWidth1,sHeight1,
this->ResPicDC1[ResIdx1].m_hDC,SrcRc1.left, SrcRc1.top, sWidth1, sHeight1, BltF1);

}
else if(DrawInfo.UseScale1 )
{
if (DrawInfo.UseColorKey1 )
sback1=TransparentBlt(this->BackBuffer1.m_hDC ,x1,y1,DrawInfo.ScaleW1 ,DrawInfo.ScaleH1 ,
this->ResPicDC1[ResIdx1].m_hDC,SrcRc1.left ,SrcRc1.top ,sWidth1,sHeight1,DrawInfo.ColorKey1 );
else
sback1=BackBuffer1.StretchBlt (x1,y1,DrawInfo.ScaleW1 ,DrawInfo.ScaleH1 ,
&this->ResPicDC1[ResIdx1],SrcRc1.left ,SrcRc1.top ,sWidth1,sHeight1,DrawInfo.dwRop1);
}
else if(DrawInfo.UseColorKey1 )
{
sback1=TransparentBlt(this->BackBuffer1.m_hDC ,x1,y1,sWidth1,sHeight1,
this->ResPicDC1[ResIdx1].m_hDC ,SrcRc1.left ,SrcRc1.top ,sWidth1,sHeight1,DrawInfo.ColorKey1);
}
else
{
this->GDI_Draw1 (x1,y1,ResIdx1,SrcRc1,DrawInfo.dwRop1 );
}


}
//---------------------------------------------------------------------------------------
void CGDIE1::ClearBackBuffer1(COLORREF Color1)
{
BackBuffer1.FillSolidRect (0,0,this->TargetWidth1 ,this->TargetHeight1 ,Color1);
}
//---------------------------------------------------------------------------------------
void CGDIE1::RefreashTargetDC1()
{

this->TargetDC1->BitBlt (0 ,0 ,this->TargetWidth1 ,this->TargetHeight1 ,
&this->BackBuffer1 ,0,0,SRCCOPY);
}
//---------------------------------------------------------------------------------------

void CGDIE1:electResPic1 (long Idx1)
{
this->ResPicDC1[Idx1].DeleteDC();
}

void CGDIE1::DelectResPic1()
{
long s1;
for(s1=1;s1<20;s1++)
{
if (this->ResPicActive1(s1) )
this->ResPicDC1[s1].DeleteDC ();

}

}
//---------------------------------------------------------------------------------------

//===================================SpriteFunction======================================

void CGDIE1::DrawSprite1(t_Sprite1 Sprite1,DWORD dwRop1)
{
GDI_Draw1(int(Sprite1.X1), int(Sprite1.Y1), Sprite1.ResIdx1, Sprite1.SrcRc1, dwRop1);
}
//---------------------------------------------------------------------------------------
void CGDIE1::DrawSpriteFx1(t_Sprite1 Sprite1,t_FxDraw DrawInfo)
{
GDI_DrawFx1(int(Sprite1.X1), int(Sprite1.Y1), Sprite1.ResIdx1, Sprite1.SrcRc1,DrawInfo);
}
//---------------------------------------------------------------------------------------

void CGDIE1::GetSpriteSrcRect1(t_Sprite1 *Sprite1,long XCount1 ,long YCount1)
{
long X1,Y1,W1,H1;

X1 = Sprite1->nowFrame1 % XCount1;
Y1 = long(Sprite1->nowFrame1 / XCount1) + 1;

W1 = Sprite1->SrcRc1.right - Sprite1->SrcRc1.left;
H1 = Sprite1->SrcRc1.bottom - Sprite1->SrcRc1.top;

if (X1 == 0)
{
X1 = XCount1;
Y1 = Y1 - 1;
}

Sprite1->SrcRc1.left = W1 * (X1 - 1);
Sprite1->SrcRc1.top = H1 * (Y1 - 1);
Sprite1->SrcRc1.right = Sprite1->SrcRc1.left + W1;
Sprite1->SrcRc1.bottom = Sprite1->SrcRc1.top + H1;


}

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2007-3-13 20:49:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?



现在看以前写的东西发现很差劲很糟糕,呵呵。

还有更完善的,比这个好很多,以后有机会发。

36

主题

76

帖子

81

积分

注册会员

Rank: 2

积分
81
 楼主| 发表于 2007-3-16 12:57:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

谢谢sandy_zc_1.

21

主题

109

帖子

127

积分

注册会员

Rank: 2

积分
127
发表于 2007-3-17 18:31:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

Windows扫雷、纸牌、空当接龙不都是GDI吗

33

主题

669

帖子

669

积分

高级会员

Rank: 4

积分
669
QQ
发表于 2007-3-17 18:53:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

需要显示的东西多了,估计GDI就不行了

5

主题

18

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2007-3-19 22:32:00 | 显示全部楼层

Re:有没有直接基于GDI或GDI+的游戏引擎啊 ?

SDL可以基于GDI来工作。从性能上说,GDI对于一般的2D游戏我认为没有什么大问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-4-13 00:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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