标签: game-development

在使用 JSON 创建的游戏中添加多个关卡

对于我的一个学校项目,我必须使用 Javascript 创建一款游戏。我的 Javascript 经验非常少,因此我真的很困惑如何在游戏中创建多个级别。使用 JSON,我加载供 Mario 行走的块:

createBlocks: function () {
        console.log('game -> createBlocks');

        $.getJSON('js/boxes.json', function (data) {

            data.boxes.level1.forEach(function (blockData) {

                this.stage.removeChild(this.block.el);

                var block = new Block(blockData);
                this.block.push(block);
                this.stage.addChild(block.el);

            }.bind(this));
        }.bind(this));
    }
Run Code Online (Sandbox Code Playgroud)

通过函数“createStars”,游戏加载另一个 JSON。我的目标是让游戏切换到另一个级别,每收集到 5 颗星。使用 JSON 创建此内容的最佳方法是什么?

我的块的 JSON 文件创建如下:

{
"boxes": {
    "level1": [
        {
            "x": 0,
            "y": 115,
            "width": 25,
            "height": 25
        },
        {
            "x": 25,
            "y": 115,
            "width": 25,
            "height": 25
        }
    ],
    "level2": [
        {
            "x": 0,
            "y": 95,
            "width": 25,
            "height": 25
        } …
Run Code Online (Sandbox Code Playgroud)

html javascript json game-development easeljs

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

关于纯ECS(实体组件系统)和更新系统的问题

我已经写了一个ECS,但我对更新阶段有一些疑问。(在系统中)\n我读过很多文章,但没有找到此类问题的参考。

\n\n

为了从 ECS 中获益(例如缓存友好),需要满足以下要求:

\n\n
    \n
  • 实体必须只是一个 ID。
  • \n
  • 组件必须只是纯数据(没有逻辑的结构)。
  • \n
  • 系统包含逻辑和更新组件。
  • \n
  • 系统之间没有交互(而是系统通过将 \xe2\x80\x9cTag\xe2\x80\x9d 组件添加到实体来进行通信)。
  • \n
\n\n

因此,每个系统中应用的逻辑都很好,并且在没有 \xe2\x80\x9cuser 代码\xe2\x80\x9d 时一切正常。\n但是,当我们处理用户代码时(例如用户可以将 C++ 代码附加到一个对象(如 Unity、Unreal)),问题就来了:

\n\n
    \n
  1. 由于组件仅包含数据,因此当用户修改\n本地位置时,世界位置不会更新(当变换系统处理每个\n变换组件时,\n将计算世界位置。因此,如果用户请求世界位置\n修改其本地位置后\n,它将获得之前的世界位置\n而不是实际位置。
  2. \n
  3. 当一个实体被删除时,它的子实体也必须被删除。由于组件仅包含数据而不包含逻辑,因此子组件将不会被删除(它将在下一次父系统更新时删除)。因此,我们有一些 \xe2\x80\x9cdelay\xe2\x80\x9d (子级仍然可以访问,但将在下一次父系统更新时被删除)。
  4. \n
  5. 假设我们有实体 A、B、C。B 是 A 的子实体。在\n用户代码(附加到实体的 C++ 代码)中,用户设置 B 的父\n有 C,然后删除实体 A。当父系统将更新,它将检测到 A 已被删除(它还可以检测到实体 A 的父级已更改),但是系统如何知道实体 A 的父级更改后实体 A 是否已被删除B\也不是之前?
  6. \n
\n\n

将逻辑添加到组件中会破坏纯 ECS 的优势(以缓存友好的方式对所有相同的组件执行相同的操作),因此恕我直言,这不是一个解决方案。

\n\n

有人有解决办法吗?我想知道您在 ECS 实施中如何处理此类问题。

\n\n

谢谢!

\n

c++ architecture game-development game-engine entity-component-system

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

为什么我的按键动作不能正常工作?

我正在创建一个基本游戏,但我的代码中出现键盘响应问题。当你点击开始时,立方体会一直沿着你按下的箭头键的方向移动,但我希望它移动你用箭头键按下的任何方向,如果没有按下任何键,它就会停止。有人可以告诉我我的代码中有什么错误以及如何正确执行吗?

这是代码:

import  pygame
import  time
import  sys
import  pygame.event as EVENTS
from  pygame.locals import *
import  random

print("Welcome to the prototype of rpg game -Made by Adam Pospíchal.")

pygame.init()

sirka = 800
vyska = 800

okno = pygame.display.set_mode((sirka,vyska))
pygame.display.set_caption("RPG GAME")
#PARAMETRE OKNA#

#PARAMETRE OKNA#

#PARAMETRE KOCKY HRACA#

#PARAMETRE MENU#

#farby - RGB#
RM = 255
GM = 255
BM = 0


player_r = 0
player_g = 255
player_b = 0

player_height = 20 …
Run Code Online (Sandbox Code Playgroud)

python pygame game-development keyboard-events

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

画布中的鼠标坐标到网格上的 30 度等距坐标

我在画布上绘制了一个等距网格。它使用 30 度角偏移,我使用一些脚本来绘制基本网格。对于这个网格,我投影了一个具有 40x40 平铺尺寸的平面网格。

gridRows = 10;
gridCols = 10;
tileSize = 40;

gridWidth = gridCols * tileSize;
gridHeight = gridRows * tileSize;

canvasWidth = tileSize * (gridCols + gridRows) * Math.sqrt(3) / 2;
canvasHeight = tileSize * (gridRows + gridCols) / 2;

canvasOffset = tileSize * gridRows * Math.sqrt(3) / 2;

function carToIso(x, y) {
      // Convert cartesian (x, y) to isometric coordinates
      return [
        Math.round((x - y) * Math.sqrt(3) / 2 + canvasOffset),
        Math.round((x + y) / …
Run Code Online (Sandbox Code Playgroud)

javascript canvas game-development isometric

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

Unity:Android 上的 FPS 随机下降到接近零(提供了很多线索)

首先感谢您花时间查看此内容 - 我们感谢您的任何意见!

\n

关于我们现在面临的问题:\n在过去的几个月里,我们在 Android 上的游戏应用程序中遇到了随机 fps 下降到接近于零的情况,并且到目前为止尚未成功调试该问题。它完全随机发生(有时在 3 分钟后,有时在 3 小时后),感觉就像冻结一样 - 但实际上 FPS 在仍在运行时下降得非常快。\n我们已经花了相当多的时间使用各种工具进行调试和分析。现在我们希望您能帮助我们并从我们的数据中得出新的结论。

\n

版本:

\n
    \n
  • Unity版本:2020.3.30f1
  • \n
  • 用户计划:10.8.1
  • \n
\n

线索:

\n
    \n
  • 这不是完全冻结。如果您等待足够长的时间,新的帧就会被渲染。
  • \n
  • 首先,帧时间变为 30 毫秒、50 毫秒、100 毫秒、500 毫秒、1000 毫秒、3 分钟、5 分钟等 - 在很短的时间内
  • \n
  • 该问题已在不同的 Android 设备上重现(例如 OnePlus 6)
  • \n
  • 在统一分析器中,我们可以看到,当问题发生时,主线程似乎正在等待渲染线程上的“gfx.presentframe”
  • \n
  • 负载没有实际增加(您可能在同一场景中闲置 30 分钟,一切都很好,然后 fps 突然下降。我们也没有看到多边形、内存使用量增加,分析器中的任何内容都没有增加)
  • \n
  • 问题发生在屏幕上具有不同对象的不同场景等中
  • \n
  • 问题随机发生,有时在运行应用程序 5 分钟后,有时在运行应用程序 2 小时后。它似乎与设备变热或进入电源安全模式无关
  • \n
  • 问题不需要任何输入/交互。它只是在让应用程序空闲时发生
  • \n
  • 在 ARM mobile studio 图形分析器中,我们可以看到,一旦问题发生,eglGetCurrentContext() 和下一个命令 (eglGetSyncAttribKHR ) 之间就会有约 3 分钟(或更长)的间隙 - 然而命令本身只需要几个 …

performance android opengl-es game-development unity-game-engine

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

如何将游戏回合的游戏状态转化为一组有限的动作?

我很难确定如何将游戏中特定回合的游戏状态转换为代表该回合所采取的动作的有限动作序列。我希望得到关于如何做到这一点的建议。

注意:游戏现已上线!如果有人想尝试,请访问: https: //mystikaze.com
(我最终实现了一种用于存储游戏动作的算法,该算法可能不完全有效,但我认为确实可以保证任何给定回合的动作列表不能被无界/无限长)。

游戏规则相对简单。有一个六角形棋盘,其中六角形属于 2 个玩家。在任何给定的回合中,棋子可能已经存在于棋盘上,已在上一回合中购买,或者它们可以被购买到棋盘上(黄色棋子代表其在本回合被购买到棋盘上)。

现有件和购买件

这些棋子是“活跃的”,并且仍然可以移动。碎片也可以组合起来,并且仍然保持“活跃”状态。它们可以通过将现有的一块移动到另一块上或通过购买新的块到现有的块上来组合。组合后,目标六角形上将存在升级后的棋子。棋子可以有 3 种强度;X、Y 和 Z。X 与 X 结合得到 Y,X 与 Y 结合得到 Z。

碎片合并

片段可以继续像这样合并并保持“活跃”。一个棋子可以移动到其自己领土内的另一个六角形并保持“活跃”。当一个棋子被移动以捕获其他玩家的六角形时,它就不再是“活跃的”。此后它无法移动,但仍然可以结合。下面的绿色表示不活动的部分。

捕捉

一个棋子也可以直接召唤到另一个棋子之上,从而产生升级的棋子(如果它已经处于活动状态,则它保持活动状态;如果它处于非活动状态,则它保持非活动状态):

召唤组合

现在,这很容易在游戏状态中表示;只需更新棋子和棋盘的状态以反映当前的真实情况即可。只要理论上允许该移动序列是无界的,就可以很容易地将其转换为一系列移动。碎片可以保持活跃并无限地来回移动。当然,我想限制动作的顺序。这就是我遇到麻烦的地方。我有以下2个动作:

  • 将棋子移动到指定位置
  • 将棋子召唤到指定位置

如何将玩家所做的动作转换为有限的动作序列,以代表玩家实际所做的事情,从而达到最终状态?我不知道我是否遗漏了一些东西,但这似乎变得几乎不可能复杂到弄清楚。如果您有棋子在自己的区域内移动并保持活动状态,您可能会认为您可以将移动就地更新到新坐标,而不是向新坐标添加新移动,但如果有另一个移动,其中一块与另一块结合形成一个升级块,它依赖于第一块移动到其第一组坐标?现在就地更新移动坐标意味着第二个组合移动成为常规移动,因为它现在移动到空六角形上,但它应该仍然是组合移动(棋盘状态实际上是已移动到新坐标)。

从概念上讲,应该始终存在可以代表任何操作的有限移动序列。然而,我发现很难弄清楚如何编写一个算法来自动执行此操作。我认为至少可以防止移动的无限性质的算法是说“如果最近的移动不是组合或捕获操作,则更新一个棋子的最近移动,而不是将新移动添加到列表中”。这应该始终导致移动集正确创建游戏状态,并防止无限循环。然而,这仍然可能导致相当多的变动。例如,如果你在一个领土上有 10 个棋子,你可以移动所有 1 个棋子,捕获 1 个棋子,移动剩余的 9 个棋子,将一个棋子与另一个棋子组合,移动剩余的 8 个棋子等等,这可能会导致 10 个棋子的移动次数超过 60 次。如果有一种算法可以把这个问题降低一点,那就太好了,而且我仍然不能 100% 确定即使这个算法也没有一些无法工作的边缘情况。

我是否缺少一种相对直接的方法来解决这个问题?规则必须保持不变,但我愿意接受有关引入新移动类型的建议,如果这也有助于解决问题的话。

algorithm game-development

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

与 godot 4 中的物理变化同步

我正在将我的游戏从 godot 3 转换为 godot 4。

之前在 godot 3 中,当我使用旋转平台时,我的玩家会在旋转平台向上移动时将几个像素下沉到其中,并在平台向下移动时将其悬停在上方几个像素。我通过在移动平台上打开物理同步来修复此问题。

现在问题又回来了,并且没有同步到物理选项。

我只是想知道这是否是一个简单的修复?或者我应该完全重做移动平台系统?

谢谢。

game-development game-engine godot

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

学习用于游戏编程的C++的资源

我是一个相对较新的C++新手,并在游戏行业工作了几个月.我希望重新回到这个行业,并了解一个人需要成为一名非常优秀的C++程序员(主要是因为他们开始制作游戏的竞争力).我想知道网上是否有任何非常好的网站可以帮助解决这个问题.基本上我正在寻找能够帮助我掌握C++概念的东西,并通过练习编程实例帮助我成为一名优秀的程序员.

c++ game-development

4
推荐指数
5
解决办法
1422
查看次数

LibGDX会支持像Unity3D这样的3D

任何人都可以告诉我,libgdx会像Unity3D一样支持3D,如果可能的话,请告诉我一些基于libgdx 3d的游戏.

android game-development libgdx

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

如何删除Unity3d中的切片精灵

当我在Unity中切片精灵时.

我错误地切了一块我不想要的东西

这里是Menu Buttons_0

在此输入图像描述

现在,我想删除那些垃圾

有什么办法可以删除菜单按钮_0

sprite game-development game-engine unity-game-engine

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