我正在将C游戏:https://github.com/minirop/Super-Mario-Remake翻译成C#以获得乐趣并改进我的C#编程。我在C语言编程方面没有经验,遇到过一个我不知道如何在C#中实现的结构。
typedef struct _state_t {
void (*init)(struct _state_t * s);
void (*update)(struct _state_t * s, Uint32 elapsedTime);
void (*handleEvent)(struct _state_t * s);
void (*draw)(struct _state_t * s, SDL_Surface * surface);
void (*clean)(struct _state_t * s);
void * data;
} state_t;
到目前为止我尝试的是:
public class state_t
{
public void init(state_t S)
{
state_t s;
s = S;
}
public void update(state_t S, UInt32 ElapsedTime)
{
state_t s;
UInt32 elapsedTime;
s = S;
elapsedTime = ElapsedTime;
}
public void handleEvent(state_t S)
{
state_t s;
s = S;
}
public void draw(state_t S, SDL.SDL_Surface Surface)
{
state_t s;
SDL.SDL_Surface surface;
s = S;
surface = Surface;
}
public void clean(state_t S)
{
state_t s;
s = S;
}
public void data()
{
}
}
但我不认为这是对的。我收到了一个错误:
state_t MS_get()
{
state_t state = new state_t();
state.init = MS_init; // Error 2 Cannot assign to 'init' because it is a 'method group'
} ...
答案 0 :(得分:0)
您已将init
定义为方法,因此您需要调用它;不要分配它。这样的事情应该有效:
state.init(MS_init);
但是,我在那个方法中看到你只是将状态保存在init()
方法中声明的变量中,这将无法实现。
答案 1 :(得分:0)
这个C结构首先是由C ++或C#面向对象的类构成的。面向对象的原则被强加到这个结构上。
等效的C#结构将是
public class state_t
{
Unit32 m_elapsedTime;
SDL_Surface * m_surface;
void *m_data;
public void init()
{
// Initialise all variables of class
}
public void update(UInt32 ElapsedTime)
{
m_elapsedTime = ElapsedTime;
}
public void handleEvent()
{
// Code for Handle Event
}
public void draw(SDL_Surface Surface)
{
// Code for Draw
m_surface = Surface; // maybe, need to check datatype.
}
public void clean()
{
// Code for Cleaning
}
public void data()
{
// Code for filling *data variable
}
}
您可能需要添加一些私有变量,尤其是关于m_data
和m_surface
的内存分配大小,但这将取决于对原始代码的进一步检查。