如何解决我的移动队列出了什么问题为什么输入会重复?
我正在尝试使用love2d制作一个简单的蛇式游戏,但我似乎无法弄清楚我的代码有什么问题。运行时的错误是角色移动基于队列系统,并且似乎已由相同的输入进行备份。任何帮助将不胜感激!
import React,{ useState } from "react";
import DatePicker from "react-date-picker";
import { DateTime } from "luxon";
const items = [
{
id: "1",status: 100,event: "Open door",user: "Mike",created_at: "2020-09-05T12:31"
},{
id: "5",event: "Call Answer",created_at: "2020-09-10T12:31"
},{
id: "2",status: 200,user: "Vik",created_at: "2020-09-04T18:32"
},{
id: "3",status: 300,event: "Call",user: "Max",created_at: "2020-08-03T18:30"
},{
id: "4",status: 400,event: "Missed call",user: "Alex",created_at: "2020-07-28T10:40"
}
];
// Factor out duplicate select JSX code,more DRY
const Select = ({ options,value,onChange }) => (
<select style={{ margin: "0 15px" }} value={value} onChange={onChange}>
{options.map((name) => (
<option key={name} value={name}>
{name}
</option>
))}
</select>
);
const Sample = () => {
const [event,setEvent] = useState("All");
const [user,setUser] = useState("All");
const [dateBefore,setDateBefore] = useState(null);
const [dateAfter,setDateAfter] = useState(null);
const filter = items.filter(
(item) =>
(user === "All" || item.user === user) &&
(event === "All" || item.event === event) &&
(!dateBefore ||
item.created_at > DateTime.fromJSDate(dateBefore).toISO()) &&
(!dateAfter || item.created_at < DateTime.fromJSDate(dateAfter).toISO())
);
const handleChangeUser = (event) => {
setUser(event.target.value);
};
const handleChangeEvent = (event) => {
setEvent(event.target.value);
};
// Mapping the data to options led to duplicate options,// reducing first into map removes duplicates and allows
// for computing options in single pass. Values inserted
// into map maintain insertion order.
const [eventArr,userArr] = items.reduce(
([events,users],{ event,user }) => [
{ ...events,[event]: event },{ ...users,[user]: user }
],[
{
All: "All"
},{
All: "All"
}
]
);
return (
<>
<Select
onChange={handleChangeEvent}
value={event}
options={Object.values(eventArr)}
/>
<Select
onChange={handleChangeUser}
value={user}
options={Object.values(userArr)}
/>
<DatePicker value={dateBefore} onChange={setDateBefore} />
<DatePicker value={dateAfter} onChange={setDateAfter} />
<div>
{filter.map((userName) => {
return (
<>
<div style={{ marginTop: "10px" }}>
{userName.user + " - " + userName.event}
</div>
<div style={{ borderBottom: "2px solid black" }}>
{userName.created_at}
</div>
</>
);
})}
</div>
</>
);
};
对不起,长时间阅读!
解决方法
真的很难知道,因为我不确定您的游戏应该具有什么功能。如果应该完全像蛇,那么您正在做的某些事情会让我很困惑,例如排队。
我进行了一些调整,尽管看起来它们可以稍微改善它的功能。我用elseif代替了ifs(以这种方式一次只能按下一个键),然后将table.remove(moveQueue,1)
从if语句中移出(这样每次love.update(dt)
都会从队列中删除某些内容)不管按键是否按下,都会被调用。
我不知道这是否满足您的要求,因为我不确定您的游戏应该如何运行。
love.window.setMode(704,704)
function love.load(arg)
x = 0
y = 0
timer = 0
points = 0
moveQueue = {}
playersize = 32
screensize = 704
Applex = love.math.random(0,screensize / playersize) * playersize
Appley = love.math.random(0,screensize / playersize) * playersize
end
function love.update(dt)
--Inputs
if love.keyboard.isDown( "s" ) and moveQueue[2] ~= 's' then
table.insert(moveQueue,'s')
elseif love.keyboard.isDown( "w" ) and moveQueue[2] ~= 'w' then
table.insert(moveQueue,'w')
elseif love.keyboard.isDown( "a" ) and moveQueue[2] ~= 'a' then
table.insert(moveQueue,'a')
elseif love.keyboard.isDown( "d" ) and moveQueue[2] ~= 'd' then
table.insert(moveQueue,'d')
end
timer = timer + dt
local timerLimit = 0.15
if timer >= timerLimit then
timer = timer - timerLimit
if moveQueue[1] == 'w' and y > 0 then
y = y - playersize
elseif moveQueue[1] == 's' and y < screensize - playersize then
y = y + playersize
elseif moveQueue[1] == 'a' and x > 0 then
x = x - playersize
elseif moveQueue[1] == 'd' and x < screensize - playersize then
x = x + playersize
end
table.remove(moveQueue,1)
if x == Applex and y == Appley then
points = points + 1
Applex = love.math.random(0,screensize / playersize) * playersize
Appley = love.math.random(0,screensize / playersize) * playersize
end
print('Tick')
end
end
function love.draw()
love.graphics.rectangle("fill",x,y,playersize,playersize)
love.graphics.setColor(255,0)
love.graphics.rectangle("fill",Applex,Appley,255,255)
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。