如何在Game Maker Studio 2中跟踪随机遭遇的步骤

如何解决如何在Game Maker Studio 2中跟踪随机遭遇的步骤

我正试图制作一个简单的RPG,只是为了好玩。

我目前正在一个随机遭遇系统上工作,我在Reddit上发现了这段有用的代码

///This code should be under your object's create event:

encounterSteps = irandom_range(10,20);

///This code should run when you take a step:

if (steps > encounterSteps) {
    steps = 0;
    encounterSteps = irandom_range(10,20);
    room_goto(rm_battle);
}

但是,有一个问题,该系统使用了一个名为“ steps”的变量,而我目前没有该变量。现在,我显然知道我需要计算自己的步数才能使此工作正常进行,但是我不确定如何计算自己的步数。我目前正在使用以下代码进行移动:

var moveSpeed = 4;

if (_kLeft && !place_meeting(x - moveSpeed,y,oWall))
{
    x -= moveSpeed;
    sprite_index = sPlayerLeft;
    image_speed = 0.5;
}
    
if (_kRight && !place_meeting(x + moveSpeed,oWall))
{
    x += moveSpeed;
    sprite_index = sPlayerRight;
    image_speed = 0.5;
}
    
if (_kUp && !place_meeting(x,y - moveSpeed,oWall))
{
    y -= moveSpeed;
    sprite_index = sPlayerUp;
    image_speed = 0.5;
}
    
if (_kDown && !place_meeting(x,y + moveSpeed,oWall))
{
    y += moveSpeed;
    sprite_index = sPlayerDown;
    image_speed = 0.5;
}

我假设我必须将这段代码更改为更接近时间系统的第一步。

现在我的问题是:我如何才能建立一个可以跟踪步伐的系统,或者可以使用当前的移动系统来生成随机遭遇的系统?

解决方法

由于我没有您项目的上下文,所以我不能谈论您使用的代码。但是,我相信这是我会用自己的版本。

首先,您将需要两个变量/属性来定义当前的遭遇风险和遭遇率。

移动时,第一个将增加,并且您将定期在随机数和encounterRate之间进行检查。当随机数小于encounterRisk时,开始战斗并重置encounterRisk

您可以在每一帧执行此检查,但这可能会占用大量资源。一个更好的主意是在Timer的回调函数中完成此操作。

我不知道您的班级样子,所以您必须对此进行调整。

private int MoveSpeed { get; } = 4;
private Timer EncounterTimer { get; set; }
private int EncounterRisk { get; set; } = 0;
private int EncounterRate { get; set; } = 1000; // to fine tune depending on your needs

public YourClassConstructor()
{
    EncounterTimer = new System.Timers.Timer(100);
    EncounterTimer.Elapsed += CheckForEncounter;
}

public void CheckForEncounter()
{
    EncounterRisk++;
    
    // Maybe use something bigger than 0 here,otherwise there is a non-zero chance that you get 2 encounters in a row without being able to move
    var random = new Random().Next(0,EncounterRate);

    if (random < EncounterRisk)
    {
        EncounterRisk = 0;
        // start a battle
    }
}

// your moving function
public void Move()
{
    var moving = false;
    var xMoveAmount = 0;
    var yMoveAmount = 0;

    if (_kLeft && !place_meeting(x - MoveSpeed,y,oWall))
    {
        xMoveAmount -= MoveSpeed;
        sprite_index = sPlayerLeft;
        moving = true;
    }

    if (_kRight && !place_meeting(x + MoveSpeed,oWall))
    {
        xMoveAmount += MoveSpeed;
        sprite_index = sPlayerRight;
        moving = true;
    }

    if (_kUp && !place_meeting(x,y - MoveSpeed,oWall))
    {
        yMoveAmount -= MoveSpeed;
        sprite_index = sPlayerUp;
        moving = true;
    }

    if (_kDown && !place_meeting(x,y + MoveSpeed,oWall))
    {
        yMoveAmount += MoveSpeed;
        sprite_index = sPlayerDown;
        moving = true;
    }

    if (moving)
    {
        image_speed = 0.5; // not sure if you need to set that every frame,maybe you can put it under the following "if"
        x += xMoveAmount;
        y += yMoveAmount;

        if (!EncounterTimer.Enabled)
        {
            EncounterTimer.Enabled = true;
        }
    }
    else
    {
       EncounterTimer.Enabled = false;
    }
}
,

Kilazur有一个很好的解决方法,但是如果我们从游戏制造商工作室的角度来看,那么我们已经有了一些只读变量,可以让我们看到它在什么框架上,例如image_index。因此,至少,它很容易实现(即使它可能不是最佳方法)也是如此。这是我个人尝试使用的方法:

data "aws_ami" "example" {
  most_recent      = true
  owners           = ["self"]

  filter {
    name   = "name"
    values = ["myami-*"]
  }
}

最后,请确保根据运动动画的帧调整图像索引号。一个非常简单且通用的解决方案,但希望对您有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?