小编Phi*_*ier的帖子

基于组件的游戏引擎中的通信

对于我正在制作的2D游戏(对于Android),我使用的是基于组件的系统,其中GameObject包含多个GameComponent对象.GameComponents可以是输入组件,渲染组件,子弹发射组件等.目前,GameComponents具有对拥有它们的对象的引用并且可以对其进行修改,但GameObject本身只有一个组件列表,并且它不关心组件是什么,只要它们在对象更新时可以更新.

有时组件有一些GameObject需要知道的信息.例如,对于碰撞检测,GameObject将自身注册到碰撞检测子系统,以在其与另一个对象碰撞时被通知.碰撞检测子系统需要知道对象的边界框.我将x和y直接存储在对象中(因为它被几个组件使用),但宽度和高度仅为保存对象位图的渲染组件所知.我想在GameObject中有一个方法getBoundingBox或getWidth来获取该信息.或者一般来说,我想从组件向对象发送一些信息.但是,在我目前的设计中,GameObject不知道它在列表中具有哪些特定组件.

我可以想出几种方法来解决这个问题:

  1. 我可以让游戏对象拥有一些重要组件的特定字段,而不是拥有一个完全通用的组件列表.例如,它可以有一个名为renderingComponent的成员变量; 每当我需要获得我刚才使用的对象的宽度时renderingComponent.getWidth().这个解决方案仍然允许组件的通用列表,但它以不同的方式处理它们中的一些,并且我担心由于需要查询更多组件,我最终会有几个特殊字段.有些对象甚至没有渲染组件.

  2. 将所需信息作为GameObject的成员,但允许组件更新它.因此,对象的宽度和高度默认为0或-1,但渲染组件可以在其更新循环中将它们设置为正确的值.这感觉就像一个黑客,我可能最终会向GameObject类推送很多东西以方便使用,即使并非所有对象都需要它们.

  3. 组件实现一个接口,指示可以查询的信息类型.例如,渲染组件将实现HasSize接口,该接口包括getWidth和getHeight等方法.当GameObject需要宽度时,它会遍历其组件,检查它们是否实现了HasSize接口(instanceof在Java中使用关键字,或is在C#中).这似乎是一个更通用的解决方案,一个缺点是搜索组件可能需要一些时间(但是,大多数对象只有3或4个组件).

这个问题与具体问题无关.它常常出现在我的设计中,我想知道处理它的最佳方法是什么.性能有点重要,因为这是一个游戏,但每个对象的组件数量通常很小(最大值为8).

简短的版本

在基于组件的游戏系统中,在保持设计通用性的同时,将信息从组件传递到对象的最佳方法是什么?

oop entity-system component-based

21
推荐指数
2
解决办法
9544
查看次数

如何使用GoogleTest框架打印QString?

我将GoogleTest(GTest)框架与Qt5应用程序结合使用.

每当使用QString参数进行测试失败时,框架会尝试打印所有涉及的值.但是,它无法自动处理外来类型(在这种情况下为Qt5的QString).

QString test = "Test";
ASSERT_EQ(test, "Value");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何让GoogleTest自动打印QStrings(=无需每次手动转换它们)?

qstring qt pretty-print googletest qt5

10
推荐指数
1
解决办法
995
查看次数

如何将QPlainTextEdit滚动到顶部?

我想在放入一些文本后自动滚动到QPlainTextEdit小部件的顶部.我怎么能意识到这一点?

qt scroll qplaintextedit

9
推荐指数
2
解决办法
7759
查看次数

Flyweight模式与静态字段

在我的理解中,flyweight模式的目的是通过共享共同的外在状态来减少内存占用并提高性能.为什么有人更愿意在静态字段中存储共享状态来实现模式?

请考虑以下示例:http://www.oodesign.com/flyweight-pattern-wargame-example-java-sourcecode.html

在此输入图像描述

如果我是对的,那么本例中的要点是通过保持对单个SoldierImp对象的引用来共享SoldierClient类的所有实例之间的公共状态(soldierGraphicalRepresentation对象).

为什么我会为实施这个设计而烦恼?我很想宣布SoldierClient类如下:

public class SoldierClient implements Soldier 
{
    protected static Object soldierGraphicalRepresentation;
    private int currentLocationX;
    private int currentLocationY;

    static SoldierImp()
    {
        soldierGraphicalRepresentation = LoadGraphicalRepresentation();
    }

    public void moveSoldier(int previousLocationX, int previousLocationY, int newLocationX, int newLocationY) {
        // do stuff with the graphical representation

    }
}
Run Code Online (Sandbox Code Playgroud)

这样,SoilderClient的所有实例共享对同一个士兵图形表示对象的引用,并实现相同的目标.我错了吗?

design-patterns flyweight-pattern

6
推荐指数
1
解决办法
903
查看次数

Qt5:告诉 QPlainTextEdit 忽略语法高亮更改

QPlainTextEdit我的应用程序中有一个QSyntaxHighlighter分配给它的小部件。在该文本编辑区域内的每个内容更改时,我需要收到通知(以更新全局应用程序保存/更改状态)。但是,textChanged()每次荧光笔开始工作时也会发出信号,我需要以某种方式过滤掉。

我已经看过了modificationChanged(),但这似乎也不起作用。它忽略突出显示的更改并在第一次内容更改时成功通知我,但不会通知我任何后续更改。该文件提到,我应该能够与复位内部状态setModified(false),但这种方法似乎并不存在。

关于如何过滤更改的任何想法?

我一定要切换到QTextDocument似乎有哪些单contentsChanged()忽略语法高亮的变化?

c++ syntax-highlighting textchanged qplaintextedit qt5

6
推荐指数
1
解决办法
986
查看次数

节点http.request,如果发送请求后互联网停止,则不会触发任何事件

我在服务器上有以下 PHP 脚本,它将等待 10 秒并说Hello

<php sleep(10); ?>Hello
Run Code Online (Sandbox Code Playgroud)

在客户端(节点),我有以下内容:

var http = require('http');
http.get ('http://example.com/sleep.php', function (resp) {
    resp.on('data', function (d) {
        console.log ('data!', d.toString());
    });
    resp.on('end', function (d) {
        console.log ('Finished!');
    });
}).on('error', function (e) {
    console.log ('error:', e);
});
Run Code Online (Sandbox Code Playgroud)

问题是,如果在请求期间互联网连接停止,则不会触发errorORend事件。

要重现问题:

  • 将 PHP 脚本放置在 Internet 上的某个位置
  • 执行节点脚本
  • 断开互联网连接
  • 该脚本不执行任何操作

我还发现,如果连接在 10 秒内恢复,它仍然可以接收消息。

因此,我做了一个简单的间隔循环来检查状态。但是它无法检测连接是否已停止工作或仍在等待响应:

var http = require('http');
var lastRespond = 0, intervalCheck;
var respFinished = false;
http.get ('http://jixun.no-ip.org/sleep.php', function (resp) {
    resp.on('data', …
Run Code Online (Sandbox Code Playgroud)

client http request node.js

5
推荐指数
1
解决办法
2354
查看次数

同一变量的不同内存地址

为什么两个地址k不同,如下面的代码输出所示?

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
int anu[1000000];
int calc(int a,int b,int c,int d)
{
    long long int k;
    k=(long long int)a*d*d+b*d+c;
    return k%1000000;
}
int main()
{
    int t,n,i,a,b,c,d,k;
    scanf("%d",&t);
    while(t--)
    {   
        scanf("%d %d %d %d %d",&n,&a,&b,&c,&d);
        memset(anu,0,sizeof(int)*1000000);
        anu[d]=1;
        vector<int> anu1;
        anu1.push_back(d);
        for(i=1;i<n;i++)
        {
            k=calc(a,b,c,anu1[i-1]);
            anu1.push_back(k);
            anu[k]=anu[k]?0:1;
        }
        d=0;k=0;
        printf("address of k=%d ",&k);
        for(i=0;i<1000000;i++)
        {
            if(anu[i])
                {
                if(d%2)
                k-=i;
                else
                k+=i;
                d++;
            }
        }
        printf("%d address of final k=%d\n",abs(k),&k);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输入:1 1 …

c++ memory-management

4
推荐指数
1
解决办法
129
查看次数

阵列数组,大小不同

我有一个数组,每个单元格都有数组.例如,调用大数组arr:

int a[3] = {3, 2, 1};
int b[2] = {2, 1};
int *arr[2] = {a, b}
Run Code Online (Sandbox Code Playgroud)

现在问题是,如果我想在大阵列内打印小arrs.

这是我的代码:

#include <stdio.h>

void printArr(int arr [], int n)
{
    for (int i = 0 ; i < n ; i++)
    {
        printf("%d ", *(arr + i));
    }
    printf("\n");
}

int main()
{
    int a[5] = {1, 8, 4, 2, 0};
    int b[3] = {1, 4, 2};
    int *arr [2] = {a, b};

    int n = 0;

    for (int i …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

4
推荐指数
1
解决办法
7080
查看次数

使用自定义项目类的 QGraphicsScene::removeItem() 后崩溃

我正在使用QGraphicsScene自定义项目类的实例填充 a ( inherting QGraphicsPathItem)。在运行时的某个时刻,我尝试通过调用以下命令从场景中删除一个项目(及其子项目):

delete pItem;
Run Code Online (Sandbox Code Playgroud)

这会自动调用,但是它也会导致下次重绘期间QGraphicsScene::removeItem()类崩溃。QGraphicsSceneFindItemBspTreeVisitor

c++ qgraphicsitem qgraphicsscene qt5

4
推荐指数
1
解决办法
3020
查看次数

十进制 &lt;--&gt; 二进制补码 &lt;--&gt; 十六进制转换

我想知道我是否收到这样的问题:

“将十进制数转换为二进制补码,然后以十六进制给出答案”。

是下面的路径,怎么做?

十进制数:-23

23 = 00010111 = 十六进制 17 = -17

-23 = 11101001 = 十六进制 E9

那么要将其转换为十六进制,答案是 -17 还是 E9?

谢谢

hex decimal twos-complement

2
推荐指数
1
解决办法
3万
查看次数