A
a_lone_
Guest
I've spent a while getting my movement code with proper acceleration and smooth collisions to work with as a little code as possible, and while I was doing so my ideas changed a lot and the code still has remnants of old organization. At some point in the process, I discovered that whenever I made a pixel-perfect collision with a corner, the game window would freeze and have to be closed using the IDE's stop button, or a task manager end task. I thought I'd fix this probably later, but I still have not been able to locate its source.
Feel free to roast my code as well, like I said it's a bit scatterbrained and could be smaller and more organized.
Code:
//get input
yin = (keyboard_check(ord("S")) - keyboard_check(ord("W")));
xin = (keyboard_check(ord("A")) - keyboard_check(ord("D")));
inDir = point_direction(0,0,xin,yin);
//round small velocities to 0
if abs(vx) < 0.3 {
vx = 0;
}
if abs(vy) < 0.3 {
vy = 0;
}
//friction
vx -= kfrict*vx;
vy -= kfrict*vy;
//acceleration
ax = (((dcos(inDir))*abs(xin)*movespeed)/mass);
ay = (((dsin(inDir))*abs(yin)*movespeed)/mass);
aMag = point_distance(x,y,x+ax,y+ay);
aDir = point_direction(x,y,x+ax,y+ay);
if abs(vy+ay) <= abs(yin*vmax) and abs(vx+ax) <= abs(xin*vmax) {
vy += ay;
vx += ax;
} else if abs(vy+ay) <= abs(yin*vmax) {
vy += ay;
} else if abs(vx+ax) <= abs(xin*vmax) {
vx += ax;
} else if abs(vy + ay) < abs(vy) {
vy += ay;
} else if abs(vx + ax) < abs(vx) {
vx += ax;
}
//collisions and movement
if place_meeting(x-vx,y-vy,oWall) {
while !place_meeting(x-sign(vx),y-sign(vy),oWall) {
y-=sign(vy);
x-=sign(vx);
}
if !place_meeting(x,y-vy,oWall) {
y -= vy;
}
if !place_meeting(x-vx,y,oWall) {
x -= vx;
}
} else {
x -= vx;
y -= vy;
}