我能够很好地组装正在发生的事情并杀了我几个星期,我真的想知道这是我的错误还是只是按键太快,或渲染延迟?处理这个问题,因为我没有找到这样做的罪魁祸首。
这种情况发生在例如我从对角线向下到左边,然后向右,然后我回去,我做出这样的动作,快速,它并不总是发生,但足以破坏游戏。
运动脚本:
extends KinematicBody2D
var velocity = 150
var direction = Vector2()
func _ready():
set_fixed_process(true)
func _fixed_process(delta):
#-----------MOVIMENT-------------------------------
direction = Vector2()
#LEFT
if Input.is_action_pressed("left"):
direction += Vector2(-1, 0)
#RIGHT
elif Input.is_action_pressed("right"):
direction += Vector2(1, 0)
#UṔ
if Input.is_action_pressed("up"):
direction += Vector2(0, -1)
#DOWN
elif Input.is_action_pressed("down"):
direction += Vector2(0, 1)
if direction.x != 0 || direction.y != 0:
direction = direction.normalized()*velocity
move(direction*delta)
绘制脚本:
extends Control
var map_size = 64
var preScriptUtils = preload("res://scripts/utils_fuctions.gd")
var utils_functions
onready var player = $"../Player"
onready var tile_map = $"../TileMap"
var posTileMap = Vector2()
var posWorld = Vector2()
var prevRect = Rect2()
var newRect = Rect2()
var distance_gen = 2048
var positionMap_rect = 0
var size_rectMap = 0
func _ready():
utils_functions = preScriptUtils.utils_functions.new()
set_fixed_process(true)
posWorld = Vector2(0, 0)
positionMap_rect = ((distance_gen/32)/2)
size_rectMap = distance_gen/32
surround_map(posWorld)
func _fixed_process(delta):
var posPlayer = player.get_position()
posTileMap = tile_map.world_to_map(posPlayer) - Vector2(positionMap_rect, positionMap_rect)
newRect = Rect2(tile_map.map_to_world(posTileMap), Vector2(distance_gen, distance_gen))
if prevRect.position != newRect.position:
load_newMap()
func gen_data(var _posWorld=Vector2(0, 0), var _posTileMap=Vector2(0, 0), var size=Vector2(0, 0)):
var x = 0
var y = 0
var pos_modx = 0
var pos_mody = 0
while x < size.x:
y = 0
pos_modx = utils_functions.mod(_posWorld.x + x, map_size)
#NOISE
var result_noise
while y < size.y:
pos_mody = utils_functions.mod(_posWorld.y + y, map_size)
if (pos_modx >= 0 && pos_mody >= 0) && (pos_modx < map_size && pos_mody < map_size):
tile_map.set_cell(_posTileMap.x + x, _posTileMap.y + y, biomes(result_noise))
y += 1
x += 1
func load_newMap():
var rectIntersection = newRect.clip(prevRect)
var _x = 0
var _y = 0
#LEFT
if player.direction.x < 0:
if int((newRect.size.x - rectIntersection.size.x)/32) == 1:
_x = int(newRect.position.x/32)
_y = int(rectIntersection.position.y/32)
posWorld.x -= 1
gen_data(Vector2(posWorld.x, posWorld.y), Vector2(_x, _y), Vector2(1, size_rectMap))
#RIGHT
elif player.direction.x > 0:
if int((newRect.size.x - rectIntersection.size.x)/32) == 1:
_x = int(rectIntersection.end.x/32)
_y = int(rectIntersection.position.y/32)
posWorld.x += 1
Vector2(_x, _y)
gen_data(Vector2(posWorld.x - 1, posWorld.y), Vector2(_x, _y), Vector2(1, size_rectMap))
#UP
if player.direction.y < 0:
if int((newRect.size.y - rectIntersection.size.y)/32) == 1:
_x = int(newRect.position.x/32)
_y = int(newRect.position.y/32)
posWorld.y -= 1
gen_data(Vector2(posWorld.x, posWorld.y), Vector2(_x, _y), Vector2(size_rectMap, 1))
#DOWN
elif player.direction.y > 0:
if int((newRect.size.y - rectIntersection.size.y)/32) == 1:
_x = int(rectIntersection.position.x/32)
_y = int(rectIntersection.end.y/32)
posWorld.y += 1
gen_data(Vector2(posWorld.x, posWorld.y - 1), Vector2(_x, _y), Vector2(size_rectMap, 1))
prevRect = newRect
func surround_map(var _posWorld=Vector2(0, 0)):
posTileMap = - Vector2(positionMap_rect, positionMap_rect)
prevRect = Rect2(tile_map.map_to_world(posTileMap), Vector2(distance_gen, distance_gen))
gen_data(_posWorld, Vector2(-32, -32), Vector2(64, 64))
不要被代码所困扰,我想要做的事情非常简单,我想在创造我的世界时移动玩家,它在4个方向上完美运行,但是当它涉及对角线,它没有按预期进行。我是这样画的,我有两个比较每个框架,我采取拦截的重点并计算我应该画或擦除的位置。
正在发生的事情的视频:
http://www.dailymotion.com/video/x6286px
但是这些缺陷不仅通过按压速度过快,而且还发生在慢动作中,同时沿对角线向右下方然后向左或向左,然后向后向右移动,在对角线上移动似乎是问题所在,我已经尝试了很多形状,我几乎有一个笔记本所有的涂鸦试图解决这个问题,我也尝试了对角线检查,我得到了相同的结果,今天我又失去了一天,它不会离开这个地方,我这样的周,当我想我修好了,不是真的。
我使用的是戈特。
Up 1:
通过@Ryan1729响应,我意识到我的想法是错误的,但我尝试通过执行下面的操作来修复逻辑,错误仍在继续,我感到很困惑:
if direction.x != 0 || direction.y != 0:
var vetor_normalized = direction.normalized()
if abs(vetor_normalized.x) < 1 && abs(vetor_normalized.y) < 1:
var vx = Vector2(direction.x, 0)
var vy = Vector2(0, direction.y)
vx = vx.normalized()*velocity
move(vx*delta)
vy = vy.normalized()*velocity
move(vy*delta)
else:
direction = direction.normalized()*velocity
move(direction*delta)
UP2:
现在我已经这样做了,似乎解决了这些缺陷,但其他人出现了,我仍然不明白,这个问题让我感到困惑。
var oldPosWorld = Vector2(0, 0)
var rect_tileMap = Vector2(-32, -32)
func load_newMap():
var posPlayer = Vector2(int(player.get_position().x/32), int(player.get_position().y/32))
#LEFT
if posPlayer.x < oldPosWorld.x:
pos_tileMap.x -= 1
posWorld.x -= 1
gen_data(Vector2(posWorld.x, posWorld.y), Vector2(pos_tileMap.x, pos_tileMap.y), Vector2(1, size_rectMap))
#RIGHT
elif posPlayer.x > oldPosWorld.x:
pos_tileMap.x += 1
posWorld.x += 1
gen_data(Vector2(posWorld.x - 1, posWorld.y), Vector2(pos_tileMap.x + 63, pos_tileMap.y), Vector2(1, size_rectMap))
#UP
if posPlayer.y < oldPosWorld.y:
pos_tileMap.y -= 1
posWorld.y -= 1
gen_data(Vector2(posWorld.x, posWorld.y), Vector2(pos_tileMap.x, pos_tileMap.y), Vector2(size_rectMap, 1))
#DOWN
elif posPlayer.y > oldPosWorld.y:
pos_tileMap.y += 1
posWorld.y += 1
gen_data(Vector2(posWorld.x, posWorld.y - 1), Vector2(pos_tileMap.x, pos_tileMap.y + 63), Vector2(size_rectMap, 1))
oldPosWorld = posPlayer
右边和底部的移动是正确的,问题是留在这个空白区域的左边和上面的那些(即处理底片) )。
如果我在左边放x - 1来解决问题,我会发生这种情况:
我通过改变来解决这个问题:
var posPlayer = Vector2(int(player.get_position().x/32), int(player.get_position().y/32))
通过这样的检查:
if ((player.get_position().x)/32)
但是现在我通过走到两边然后向上来得到这个:
Up 3:
我不会下意识,如果我错了,就不要感到沮丧,但是通过测试我失败了。代码看起来像这样,通过分别将int(player.get_position()。X / 32)分配给oldPosWorld.x,这也分别用于y,因为在我将位置分配给播放器之前只有一次postPlayer变量,这个导致错误,当你输入up-down时,因为它仍然是x的前一个位置,这样做会在正确的时间更新所有内容。
仍在向左和向上:
我不太明白为什么,坦率地说,我不会这么快就知道,我太累了,无法看到它。但我想明白不要错。除此之外,它似乎正在按预期发生。
#LEFT
if int(player.get_position().x/32) < oldPosWorld.x:
rect_tileMap.x -= 1
posWorld.x -= 1
gen_data(Vector2(posWorld.x, posWorld.y), Vector2(rect_tileMap.x, rect_tileMap.y), Vector2(1, size_rectMap))
oldPosWorld.x = int(player.get_position().x/32)
答案 0 :(得分:1)
我认为问题在于你需要离散运动(向上和向右移动1向上和向右移动1)但你在第一个代码片段中将向量标准化为长度1。在非对角线情况下,这没有任何作用,因为向量已经是长度1。但是在对角线情况下,向量在标准化之前是sqrt(2)
长度(你可以使用毕达哥拉斯定理来证明这一点。)所以你的向量正在缩小到Vector2(sqrt(2)/2, sqrt(2)/2))
,({{1} }约为0.707,)导致绘画偏移。
编辑:我现在最好的猜测是问题是当玩家对角移动时你正在调用sqrt(2)/2
两次。我想你想弄清楚x和y偏移然后重绘地图。
答案 1 :(得分:0)
总结错误是在更新中(在这种情况下是oldPosWorld),因为它们是两个ifs块,我会一个接一个地输入,而不更新位置,绘制错误的方式因为它在一个迟到的位置:
视频工作: