小编Goo*_*ose的帖子

注销后,Android API IsConnected返回TRUE

我正在使用Xamarin开发使用Google Play游戏服务的Android游戏.我正在使用Genymotion Android Emulator进行测试.我遇到了一个似乎是Google Play或Xamarin实施中的错误的问题.

如果我退出Google帐户,则对IGoogleApiClient.IsConnected()的调用将继续返回true(即使我已经明确注销).如果我然后尝试使用该API对象,我会得到以下异常:

java.lang.SecurityException:调用API时未登录

例如,如果在注销后执行,则以下代码会导致上述异常:

public void StartNewMatch()
{
    if (!mGoogleApiClient.IsConnected)
    {
        return;
    }

    Intent intent = GamesClass.TurnBasedMultiplayer.GetSelectOpponentsIntent(mGoogleApiClient, 1, 1, true);
    StartActivityForResult(intent, RC_SELECT_PLAYERS);
}
Run Code Online (Sandbox Code Playgroud)

我正在Google Play游戏收件箱(匹配选择器)中退出; 如下图所示.

有没有人遇到过这个?我错过了什么吗?有任何解决方法吗?

注意:只有通过Google的用户界面退出时才会出现这种情况.如果我手动签署用户,等等mGoogleApiClient.Disconnect(),问题就不会发生; mGoogleApiClient.IsConnected()现在返回false(如预期的那样).

在此输入图像描述

在此输入图像描述

在此输入图像描述

android monogame xamarin google-play-services google-play-games

7
推荐指数
1
解决办法
1655
查看次数

如何优化A*(AStar)搜索凹形?(包括截图)

我正在写一个相当简单的自上而下的2D游戏.它为所有碰撞数据使用均匀间隔的2D网格图块.网格中的每个图块都是实心的或空的.

对于路径寻找我使用A*(A星),并尝试了曼哈顿和对角线(又名切比雪夫距离)启发式.

它在大多数情况下效果很好,但是当试图找到坐在凹形凹陷(例如U形)中的目标时变得相当昂贵.

例如,在下面的图片中,右侧的人将找到左边的人.所有的草(绿色,深绿色和黄色)都是空的空间.唯一的实心瓷砖是棕色的"木材"瓷砖和灰色的"石材"瓷砖,形状为侧面"U"形.

未解决的例子

现在这里是路径搜索的结果(在这种情况下A*与Manhattan Heuristics):

解决的例子

红色和绿色调试绘制正方形显示在A*搜索期间访问了哪些图块.红色位于"已关闭"列表中,绿色位于"打开"列表中(根据A*规范).选择最终路径中的蓝线(这是正确的).

正如你所看到的,搜索已经相当详尽,访问了很多瓷砖,创造了一个几乎完美的圆圈.

我理解为什么会发生这种情况,基于A*算法,以及我选择的启发式方法(当你沿着墙壁移动目标时,更远的瓷砖开始有更好的F值,导致它们在回到正确之前被探索路径).我不知道的是如何让这更好:)

有关可能改进的建议吗?可能是一个不同的启发式?也许一条不同的路径搜索算法在一起?

谢谢!


根据一些建议,我倾向于更新我的A*实现,以包括HPA*中的改进.基于一些初步阅读,考虑到层次结构中的适当粒度,它似乎将很好地解决上述情况.一旦我完成了这个,我会更新.

xna pathfinder a-star path-finding hierarchical-data

6
推荐指数
2
解决办法
645
查看次数

是否有可能多个动态链接库(DLL)从静态库(LIB)共享线程本地存储

我有一个由许多DLL文件组成的游戏.其中一些DLL链接到相同的静态库(LIB).

所以像这样:

Game.exe -> Root.dll -> Child.dll
               |            |
               |            '-> Common.lib (contains __declspec(thread))
               |
               '-> Common.lib (contains __declspec(thread))
Run Code Online (Sandbox Code Playgroud)

Root.dll加载静态链接Common.lib的Child.dll.Root还静态链接Common.lib.因为Common是静态链接的,所以它会直接编译到加载dll中(例如Root和Child).

Common.lib包含使用线程本地存储(TLS)的变量.

__declspec(thread) static void* s_threadValues[PlatformThreadSlotsMax];
Run Code Online (Sandbox Code Playgroud)

这会导致一些有问题的行为:Root.dll和Child.dll每个都包含一个不同的TLS数据实例(s_threadValues).即使在同一个线程上,如果Root.dll调用Common.lib中定义的函数,如果从Child.dll调用相同的函数,则s_threadValues的值将与其值不同.

由于两个DLL都是从同一个线程访问这个TLS,我希望共享TLS,但事实并非如此.

现在,如果我将Common.lib更改为动态链接(例如Common.dll),则不会出现此问题:对于Root.dll和Child.dll,s_threadValues是相同的.

这是预期的行为吗?无论如何在动态库之间共享静态库中定义的TLS共享使用它吗?

c++ dll multithreading static-libraries thread-local-storage

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

无法使用测试帐户进行Android应用内购买"发布商无法购买此商品"

我正在尝试在Android中测试应用内购买.

我已将私人签名的apk上传到Google Player开发者控制台.它目前是"Alpha测试"部分的草案.

当我尝试购买商品时,出现以下错误:

The publisher cannot purchase this item.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这让我感到困惑,因为我使用的是测试帐户,而不是用于发布此应用的帐户.

在此输入图像描述

在此输入图像描述

我怀疑它可能会失败,因为我手机上有开发者帐户,但这是我的个人电话,所以我不想通过电话删除帐户(特别是如果我不确定它会解决问题).

任何人都可以确认是否必须从手机中完全删除发布商帐户以测试应用内购买?

谢谢!

android in-app-purchase in-app-billing google-play android-billing

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

追踪Google Play游戏服务中的胜利和失败

我正在使用Google Play服务实现Turn Base多人游戏.但它似乎缺少一个主要特征:追踪胜利和失败!对于任何类型的竞争游戏来说,这似乎都是非常重要的功能.

我错过了什么吗?谷歌已经以某种方式处理了这个问题吗?

如果没有,我想知道是否有人实施了他们自己的w/l跟踪系统,以及他们是如何接近它的.我担心只是在本地保存它,因为它可能与现实不同步.我想我可以使用谷歌云存储,但我也担心跟踪哪些匹配已被考虑可能有点容易出错(例如,多次计算同一场比赛的胜/负).也许使用Google Play排行榜系统会很好,因为您可以与朋友/等进行比较.

android google-play-services google-play-games

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

如何将WPF效果颜色绑定到ControlTemplate的前景或背景

在绑定到ControlTemplate中的Effect的Color属性时,我看到了一些奇怪的行为.直接设置值时,我可以将颜色定义为字符串(例如"Red")或Hex值(例如#FFFF0000).

但是,当使用绑定时,它仅在颜色被定义为String时才有效,这是ControlTemplate样式中的一个问题,因为我想使用TemplateParent属性的颜色,这些颜色被绑定为Hex值.

例如.看看下面的XAML(对不起,我知道它很长但我想展示所有情况):

<Window x:Class="EffectTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>

        <!-- 
        STYLE 1 
        This works, as the Color is hard coded, but note that the hard 
        coded value is identicle to the value in Style 2 (which doesn't work).
        -->
        <Style x:Key="Style1" TargetType="{x:Type Button}">
            <Style.Setters>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border Width="{TemplateBinding Width}"
                                    Height="{TemplateBinding Height}"
                                    Background="{TemplateBinding Foreground}">
                                <Border.Effect>
                                    <DropShadowEffect Color="#FFFF0000"/>
                                </Border.Effect>
                                <TextBlock Foreground="White" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>

        <!--
        STYLE 2
        This fails …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml controltemplate

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