Fangames > Programming Questions
Ice Physics...
(1/1)
TheGamerGuy500:
It's that time of year, when snow and cold temperatures turn lakes into skating rinks.
I'd like to know how to get the ice physics from yuutuu into GM:studio.
But not just no ordinary ice physics though, I was thinking of the kind of physics for when you touch the ice, you get slippery controls even in the air, until you land on a non-ice block, if that's possible.
pls n thx
patrickgh3:
Hey, I implemented this real quick. The gist of it is I kept a state variable in the player called "slipping", which keeps track of if a player jumped off an ice block or not. I started off with my barebones project, and I marked my changes to the player's step event with comments starting with // PATRICK. Let me know if you have any questions I guess. :)
TheGamerGuy500:
--- Quote from: patrickgh on November 15, 2015, 07:09:19 PM ---Hey, I implemented this real quick. The gist of it is I kept a state variable in the player called "slipping", which keeps track of if a player jumped off an ice block or not. I started off with my barebones project, and I marked my changes to the player's step event with comments starting with // PATRICK. Let me know if you have any questions I guess. :)
--- End quote ---
Um, yeah I have a question. I looked through the code, and your player step event is different in structure than mine. Do you think there's an easy way to combine it with Klazen's engine player object without a huge hassle? I'm just wondering, like, where would these code snippets even go?
Here's my player step event.
--- Code: ---///Movement and Controls
var L,R,h;
// Check if pressing left/right || 左右のキー入力のチェック
L = keyboard_check_direct(global.leftbutton);
R = keyboard_check_direct(global.rightbutton);
// If pressing right, go right || 右ボタンを押していれば右
// If not pressing right, and pressing left, go left || 右ボタンを押していない状態で左ボタンを押していれば左
h = R;
if (h == 0) h = -L;
// If frozen, don't move || frozenに値が入っていれば行動禁止
if (frozen == true) h = 0;
// If we're moving || 左右の移動
if (h != 0) {
// Set speed based on direction and maxSpeed || 走っている状態にする
hspeed = maxSpeed*h;
// 画像の左右を指定(負が入ると画像が左右反転する)
//flip=(image_xscale!=h);
xScale = h;
//image_xscale = h;
// Set the sprite to the running sprite || 走っている画像に変更
sprite_index = sprPlayerRunning;
image_speed = 0.5;
} else {
// Set speed to zero || 直立状態にする
hspeed = 0;
// Set the sprite to the idle sprite || 直立画像に変更
sprite_index = sprPlayerIdle;
image_speed = 0.2;
}
if (!onPlatform) {
// Set the sprite to jumping/falling if we're moving vertically and were not on a platform || ジャンプ・落下画像に変更
if (vspeed < -0.05) {
sprite_index = sprPlayerJump;
}
if (vspeed > 0.05) {
sprite_index = sprPlayerFall;
}
} else { // If we were on a platform, but we're not anymore, then set onPlatform to false || 動く台に乗ってる状態から解除された瞬間
if (place_meeting(x,y+4,platform) == false) {
onPlatform = 0;
}
}
// Limit vspeed || vspeedが最大値を超えたら、最大値に固定
if (vspeed > maxVspeed) {
vspeed = maxVspeed;
}
// If not frozen || frozenに値が入っていない(行動可能)
if (!frozen) {
// Shoot || プレイヤーの攻撃
if (keyboard_check_pressed(global.shotbutton)) {
playerShoot();
}
// Jump || ジャンプ(押した)
if (keyboard_check_pressed(global.jumpbutton)) {
playerJump();
}
// Jump Release || ジャンプ(離した)
if (keyboard_check_released(global.jumpbutton)) {
playerVJump();
}
}
--- End code ---
Ours seem vastly different from one another.
patrickgh3:
Ah, I'm assuming you started with the KS engine. I started with Yoyo's engine, which includes the yuuutu slip block logic, which I slightly modified. Here's a modified version of the code you just provided. It would have been nice to have your player step code from the start, now that I think about it.
--- Code: ---///Movement and Controls
var L,R,h;
// Check if pressing left/right || 左右のキー入力のチェック
L = keyboard_check_direct(global.leftbutton);
R = keyboard_check_direct(global.rightbutton);
// If pressing right, go right || 右ボタンを押していれば右
// If not pressing right, and pressing left, go left || 右ボタンを押していない状態で左ボタンを押していれば左
h = R;
if (h == 0) h = -L;
// If frozen, don't move || frozenに値が入っていれば行動禁止
if (frozen == true) h = 0;
// PATRICK CHANGE - set slipping and slipval
var slipBlockTouching = instance_place(x,y+4*global.grav,oSlipBlock)
var blockTouching = instance_place(x,y+4*global.grav,block)
if slipBlockTouching != noone {
slipping = true
slipval = slipBlockTouching.slip
}
if (blockTouching != noone) and (slipBlockTouching == noone) {
slipping = false
}
// If we're moving || 左右の移動
if (h != 0) {
// PATRICK CHANGE - do either normal or slippery movement
if not slipping {
// Set speed based on direction and maxSpeed || 走っている状態にする
hspeed = maxSpeed*h;
}
else {
if (h == 1 and hspeed < maxSpeed) or (h == -1 and hspeed > -maxSpeed) {
hspeed += slipval * h
}
}
// 画像の左右を指定(負が入ると画像が左右反転する)
//flip=(image_xscale!=h);
xScale = h;
//image_xscale = h;
// Set the sprite to the running sprite || 走っている画像に変更
sprite_index = sprPlayerRunning;
image_speed = 0.5;
} else {
// PATRICK CHANGE - do either normal or slippery stopping
if not slipping {
// Set speed to zero || 直立状態にする
hspeed = 0;
}
else {
if hspeed > 0 {
hspeed -= slipval
if hspeed <= 0 hspeed = 0
}
else if hspeed < 0 {
hspeed += slipval
if hspeed >= 0 hspeed = 0
}
}
// Set the sprite to the idle sprite || 直立画像に変更
sprite_index = sprPlayerIdle;
image_speed = 0.2;
}
if (!onPlatform) {
// Set the sprite to jumping/falling if we're moving vertically and were not on a platform || ジャンプ・落下画像に変更
if (vspeed < -0.05) {
sprite_index = sprPlayerJump;
}
if (vspeed > 0.05) {
sprite_index = sprPlayerFall;
}
} else { // If we were on a platform, but we're not anymore, then set onPlatform to false || 動く台に乗ってる状態から解除された瞬間
if (place_meeting(x,y+4,platform) == false) {
onPlatform = 0;
}
}
// Limit vspeed || vspeedが最大値を超えたら、最大値に固定
if (vspeed > maxVspeed) {
vspeed = maxVspeed;
}
// If not frozen || frozenに値が入っていない(行動可能)
if (!frozen) {
// Shoot || プレイヤーの攻撃
if (keyboard_check_pressed(global.shotbutton)) {
playerShoot();
}
// Jump || ジャンプ(押した)
if (keyboard_check_pressed(global.jumpbutton)) {
playerJump();
}
// Jump Release || ジャンプ(離した)
if (keyboard_check_released(global.jumpbutton)) {
playerVJump();
}
}
--- End code ---
The object oSlipBlock should be solid and have block as its parent. it should also have the variable "slip" set in its create event; the default value in yuuutu is 0.2.
Also, in the create event of the player, you should define these variables:
--- Code: ---slipping = false
slipval = 0
--- End code ---
You should look through the player step code and find all the comments where I changed something, and get the gist of how it works. You might have to modify it a little, I'm not sure.
EDIT: here's the gist of how my changes work:
1. In the player object, keep track of a variable called "slipping", which keeps track of whether the player should currently be slipping or not. To do this, we set it to true if we detect we're standing on a slippery block, and false if we're standing on a normal block. This way it remembers the state until we next touch a ground. This is the first code block I added towards the top.
2. Modify the player horizontal movement and stopping behavior to each have alternate slipping behaviors. I added if statements depending on the slipping variable, and copied the slip behaviors from the yuuutu engine. These are the second and third code blocks I modified.
3. Also keep track of a variable called "slipval", which keeps track of the "slip" variable of the last slippery block the player touched. The yuuutu slippery block behavior didn't need this because the player could just re-check the slip value of the block it was standing on, but since we're in the air sometimes we need to keep track of it. This explanation isn't the clearest, but I hope it helps a little.
TheGamerGuy500:
I'll see to it. I think that explanation and code modification is pretty much all I needed. Thanks a bundle, mate!
Navigation
[0] Message Index
Go to full version