updated fighting game sample: push force, push transfer

This commit is contained in:
turanszkij
2019-04-26 19:45:59 +02:00
parent 1d4318985e
commit da2e1afeb3
+56 -34
View File
@@ -31,19 +31,19 @@ local function Character(face, shirt_color)
effect_dust = INVALID_ENTITY,
effect_hit = INVALID_ENTITY,
face = 1, -- face direction (X)
request_face = 1,
position = Vector(),
velocity = Vector(),
force = Vector(),
frame = 0,
input_buffer = {},
clipbox = AABB(),
hurtboxes = {},
hitboxes = {},
hitconfirm = false,
hurt = false,
jumps_remaining = 2,
opponent_force = Vector(),
request_face = 1, -- the suggested facing of this player, it might not be the actual facing if the player haven't been able to turn yet (for example an other action hasn't finished yet)
position = Vector(), -- the absolute position of this player in the world, a 2D Vector
velocity = Vector(), -- velocity will affect position
force = Vector(), -- force will affect velocity
frame = 0, -- the current animation's elapsed frames starting from 0
input_buffer = {}, -- list of input history
clipbox = AABB(), -- AABB that makes the two players not clip into each other
hurtboxes = {}, -- list of AABBs that the opponent can hit with a hitbox
hitboxes = {}, -- list of AABBs that can hit the opponent's hurtboxes
hitconfirm = false, -- will be true in this frame if this player hit the opponent
hurt = false, -- will be true in a frame if this player was hit by the opponent
jumps_remaining = 2, -- for double jump
push = Vector(), -- will affect opponent's velocity
-- Effect helpers:
spawn_effect_hit = function(self, local_pos)
@@ -293,10 +293,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(3,6)) then
table.insert(self.hitboxes, AABB(Vector(0.5,2), Vector(3,5)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.5 * self.face,4,-1))
self.push = Vector(0.05 * self.face)
end
end,
},
@@ -309,10 +309,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(12,14)) then
table.insert(self.hitboxes, AABB(Vector(0.5,2), Vector(3.5,6)) )
self.opponent_force = Vector(0.01 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.5 * self.face,4,-1))
self.push = Vector(0.07 * self.face)
end
end,
},
@@ -325,10 +325,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(3,6)) then
table.insert(self.hitboxes, AABB(Vector(0.5,2), Vector(3.5,5)) )
self.opponent_force = Vector(0.08 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.5 * self.face,4,-1))
self.push = Vector(0.1 * self.face)
end
end,
},
@@ -341,10 +341,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(3,6)) then
table.insert(self.hitboxes, AABB(Vector(0.5,0), Vector(2.8,3)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.5 * self.face,2,-1))
self.push = Vector(0.05 * self.face)
end
end,
},
@@ -357,10 +357,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(6,8)) then
table.insert(self.hitboxes, AABB(Vector(0,0), Vector(3,3)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2 * self.face,2,-1))
self.push = Vector(0.05 * self.face)
end
end,
},
@@ -373,10 +373,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(8,13)) then
table.insert(self.hitboxes, AABB(Vector(0,0), Vector(4,3)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.6 * self.face,1.4,-1))
self.push = Vector(0.1 * self.face)
end
end,
},
@@ -389,10 +389,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(6,8)) then
table.insert(self.hitboxes, AABB(Vector(0,0), Vector(3,3)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2 * self.face,2,-1))
self.push = Vector(0.1 * self.face)
end
end,
},
@@ -405,10 +405,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(6,8)) then
table.insert(self.hitboxes, AABB(Vector(0,0), Vector(3,3)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2 * self.face,2,-1))
self.push = Vector(0.1 * self.face)
end
end,
},
@@ -421,10 +421,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(3,6)) then
table.insert(self.hitboxes, AABB(Vector(0.5,0), Vector(3,3)) )
self.opponent_force = Vector(0.04 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2 * self.face,1,-1))
self.push = Vector(0.05 * self.face)
end
end,
},
@@ -437,10 +437,10 @@ local function Character(face, shirt_color)
update = function(self)
if(self:require_window(3,5)) then
table.insert(self.hitboxes, AABB(Vector(0,3), Vector(2.3,7)) )
self.opponent_force = Vector(0.04 * self.face, 0.4)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.5 * self.face,4,-1))
self.push = Vector(0.1 * self.face, 0.25)
end
end,
},
@@ -456,10 +456,10 @@ local function Character(face, shirt_color)
end
if(self:require_window(17,40)) then
table.insert(self.hitboxes, AABB(Vector(0,1), Vector(4.5,5)) )
self.opponent_force = Vector(0.08 * self.face)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(3 * self.face,3.6,-1))
self.push = Vector(0.1 * self.face)
end
end,
},
@@ -476,11 +476,11 @@ local function Character(face, shirt_color)
if(self:require_window(2,20)) then
table.insert(self.hitboxes, AABB(Vector(0,2), Vector(2.3,7)) )
end
if(self:require_window(2,8)) then
self.opponent_force = Vector(0, 1)
end
if(self:require_hitconfirm()) then
self:spawn_effect_hit(Vector(2.5 * self.face,4,-1))
if(self:require_window(2,3)) then
self.push = Vector(0, 1)
end
end
end,
},
@@ -1071,24 +1071,20 @@ local ResolveCharacters = function(player1, player2)
if(hitbox.Intersects2D(hurtbox)) then
player1.hitconfirm = true
player2.hurt = true
player2.velocity = player1.opponent_force
break
end
end
end
player1.opponent_force = Vector()
-- player2 hits player1:
for i,hitbox in ipairs(player2.hitboxes) do
for j,hurtbox in ipairs(player1.hurtboxes) do
if(hitbox.Intersects2D(hurtbox)) then
player2.hitconfirm = true
player1.hurt = true
player1.velocity = player2.opponent_force
break
end
end
end
player2.opponent_force = Vector()
-- Clipping:
if(player1.clipbox.Intersects2D(player2.clipbox)) then
@@ -1156,6 +1152,32 @@ local ResolveCharacters = function(player1, player2)
camera_transform.Translate(camera_position)
camera_transform.UpdateTransform()
GetCamera().TransformCamera(camera_transform)
-- Push:
-- player on the edge of screen can initiate push transfer:
-- it means that the player cannot be pushed further, so the opponent will be pushed back instead to compensate:
if(player2.position.GetX() <= camera_side_left and player1.push.GetX() < 0) then
player2.push.SetX(-player1.push.GetX())
end
if(player2.position.GetX() >= camera_side_right and player1.push.GetX() > 0) then
player2.push.SetX(-player1.push.GetX())
end
if(player1.position.GetX() <= camera_side_left and player2.push.GetX() < 0) then
player1.push.SetX(-player1.push.GetX())
end
if(player1.position.GetX() >= camera_side_right and player2.push.GetX() > 0) then
player1.push.SetX(-player1.push.GetX())
end
-- apply push forces:
player2.force = vector.Add(player2.force, player1.push)
player1.force = vector.Add(player1.force, player2.push)
-- reset push forces:
player1.push = Vector()
player2.push = Vector()
end
@@ -1203,15 +1225,15 @@ runProcess(function()
help_text = help_text .. "\n\t 623D: Shoryuken"
help_text = help_text .. "\n\t 236D: Jaunt"
local font = Font(help_text);
font.SetSize(20)
font.SetSize(22)
font.SetPos(Vector(10, GetScreenHeight() - 10))
font.SetAlign(WIFALIGN_LEFT, WIFALIGN_BOTTOM)
font.SetColor(0xFFADA3FF)
font.SetColor(0xFF4D21FF)
font.SetShadowColor(Vector(0,0,0,1))
path.AddFont(font)
local info = Font("");
info.SetSize(20)
info.SetSize(24)
info.SetPos(Vector(GetScreenWidth() / 2, GetScreenHeight() * 0.9))
info.SetAlign(WIFALIGN_LEFT, WIFALIGN_CENTER)
info.SetShadowColor(Vector(0,0,0,1))