正如问题所说的那样.Text小部件有<<Modified>>事件,但Entry小部件似乎没有.
在Tkinter 中有多种方法可以获得回调Text或者Entry更改小部件,但是我没有找到一个用于回调的方法Listbox(我找不到的大部分事件文档是旧的还是不完整的).有没有办法为此生成一个事件?
我正在尝试使用四叉树进行二维碰撞检测,但我对如何实现它感到有点困惑.首先,我有一个四叉树,其中包含四个子树(一个代表每个象限),以及一个不适合单个子树的对象集合.
当检查对象在树中的碰撞时,我会做这样的事情(感谢QuadTree用于2D碰撞检测):
要查找四叉树中的所有碰撞:
要插入四叉树:
要更新四叉树:
这好吗?可以改进吗?
我曾经有类似的东西:
struct Foo {
pub foo: |usize| -> usize,
}
Run Code Online (Sandbox Code Playgroud)
现在闭包语法已经过时了.我可以这样做:
struct Foo<F: FnMut(usize) -> usize> {
pub foo: F,
}
Run Code Online (Sandbox Code Playgroud)
但那么Foo我创建的对象的类型是什么?
let foo: Foo<???> = Foo { foo: |x| x + 1 };
Run Code Online (Sandbox Code Playgroud)
我也可以使用参考:
struct Foo<'a> {
pub foo: &'a mut FnMut(usize) -> usize,
}
Run Code Online (Sandbox Code Playgroud)
但我觉得它的速度较慢,因为a)指针deref,以及b)现在对于FnMut实际最终被使用的类型没有专门化.
我有点傻瓜:说我正在做一个简单的,2D,塞尔达式的游戏.当两个对象发生碰撞时,每个对象都应该有一个结果.然而,当主角与某物碰撞时,他的反应完全取决于他碰撞的物体的类型.如果它是一个怪物,他应该反弹,如果它是一堵墙,没有什么应该发生,如果是用丝带一个神奇的蓝盒子,他应该愈合等(这些只是例子).
我还要指出,这两个东西是碰撞的一部分,也就是说,碰撞事件应该发生作无论在角色和怪物,而不仅仅是一方或另一方.
你会怎么写这样的代码?我能想到的一些令人难以置信的不雅的方式,例如,同样载有全球WorldObject类的虚函数,以确定属性 - 例如,一个GetObjectType()函数(返回整型,字符*S,任何标识对象为怪物,Box或Wall),然后在具有更多属性的类中,比如Monster,可能会有更多的虚函数,比如GetSpecies().
但是,这会使维护变得烦人,并导致冲突处理程序中的大型级联切换(或If)语句
MainCharacter::Handler(Object& obj)
{
switch(obj.GetType())
{
case MONSTER:
switch((*(Monster*)&obj)->GetSpecies())
{
case EVILSCARYDOG:
...
...
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
还有使用文件的选项,文件将包含以下内容:
Object=Monster
Species=EvilScaryDog
Subspecies=Boss
Run Code Online (Sandbox Code Playgroud)
然后代码可以检索属性,而不需要虚拟函数混乱一切.但是,这并不能解决级联If问题.
再有就是具有每种情况下的功能的选项,说CollideWall(),CollideMonster(),CollideHealingThingy().这是我个人最不喜欢的(虽然它们都远非可爱),因为它似乎是最难以维护的.
请问有人可以深入了解这个问题的更优雅的解决方案吗?感谢您的帮助!
我用C++学习了8年的D语言.我的问题是关于D垃圾收集 - 我什么时候使用删除,什么时候不需要?
The code given is for example purposes, not copypasta from my codebase
我正在使用Boost和SDL用C++编写一个原始的,跨平台的Snake游戏,我想知道实现冲突处理的最佳方法是什么(不是碰撞检测).到目前为止,我一直在使用单一调度的想法,带有难看的意大利面条代码,如下所示:
void Snake::CollisionHandler(const WorldObject& obj)
{
// collided with self
if(obj.GetObjectType() == snake)
Die();
...
...
}Run Code Online (Sandbox Code Playgroud)
另外,我有一个"全局"碰撞处理程序,它处理碰撞中涉及的事情,它们独立于每个对象,例如:
void GameWorld::CollisionHandler(WorldObject& obj1, WorldObject& obj2)
{
if(obj1.GetObjectType() == snake && obj2.GetObjectType() == snake)
PlayDeathSound();
...
...
}
Run Code Online (Sandbox Code Playgroud)
避免像碰撞一样播放两次的声音.
我也考虑过双重调度,如下:
void Snake::CollisionHandler(WorldObject& obj) const
{
// invoke obj's collision handler with a const Snake& parameter
obj.CollisionHandler(*this);
}
// collided with self
void Snake::CollisionHandler(const Snake& obj)
{
Die();
}
这还包括类似于上面的全局冲突处理程序.
然后就是只有 …
可能重复:
C++中的常量和编译器优化
让神圣的战争开始:我听到了很多关于const在C++中的用处的不同观点.当然它在成员函数声明等中有用.但它作为变量(或更确切地说,常量)的修饰符有用吗?如果剩下的代码保持不变,它确实对优化器有帮助吗?
是否有一种简单的跨平台方式可以使用Phobos在D2中进行单次击键?
例如,"按任意键继续..."提示,或Brainfuck翻译.
我尝试过的所有方法都需要在传递输入之前输入Enter键(例如getchar()).
我正在使用MSVC和一个CMaked项目.结果,我在MSVC上启用了许多为gcc和clang启用的标志.然而,/ Wall警告级别给了我一些痛苦; 它警告我包含标题中的所有类型的东西,比如stdio.h和boost标题.有没有办法阻止MSVC警告我标题中的内容?我喜欢我的警告级别,但我只想让它们为我启用.