我正试图制作一个简单的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, y, 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;
}
我假设我必须将这段代码更改为更接近时间系统的第一步。
现在我的问题是:我如何才能建立一个可以跟踪步伐的系统,或者可以使用当前的移动系统来生成随机遭遇的系统?
答案 0 :(得分:1)
由于我没有您项目的上下文,所以我不能谈论您使用的代码。但是,我相信这是我会用自己的版本。
首先,您将需要两个变量/属性来定义当前的遭遇风险和遭遇率。
移动时,第一个将增加,并且您将定期在随机数和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, y, 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;
}
}
答案 1 :(得分:0)
Kilazur有一个很好的解决方法,但是如果我们从游戏制造商工作室的角度来看,那么我们已经有了一些只读变量,可以让我们看到它在什么框架上,例如image_index。因此,至少,它很容易实现(即使它可能不是最佳方法)也是如此。这是我个人尝试使用的方法:
data "aws_ami" "example" {
most_recent = true
owners = ["self"]
filter {
name = "name"
values = ["myami-*"]
}
}
最后,请确保根据运动动画的帧调整图像索引号。一个非常简单且通用的解决方案,但希望对您有所帮助。