1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
require "not.Hero"
--- `Player`
-- Special `not.Hero` controllable by a player.
-- TODO: move functions and properties related to controls from `not.Hero`.
Player = Hero:extends()
Player.controllerSet =--[[Controller.sets.*]]nil
-- Constructor of `Player`.
function Player:new (name, x, y, world)
Player.__super.new(self, name, x, y, world)
end
-- Controller set manipulation.
function Player:assignControllerSet (set)
self.controllerSet = set
end
function Player:getControllerSet ()
return self.controllerSet
end
-- Check if control of assigned controller is pressed.
function Player:isControlDown (control)
return Controller.isDown(self:getControllerSet(), control)
end
-- Update of `Player`.
function Player:update (dt)
Player.__super.update(self, dt) -- TODO: It would be probably a good idea to add return to update functions to terminate if something goes badly in parent's update.
if self.body:isDestroyed() then return end
local x, y = self:getLinearVelocity()
-- Jumping.
if self.isJumping and self.jumpTimer > 0 then
self:setLinearVelocity(x,-160)
self.jumpTimer = self.jumpTimer - dt
end
-- Walking.
if self:isControlDown("left") then
self.facing = -1
self:applyForce(-250, 0)
-- Controlled speed limit
if x < -self.MAX_VELOCITY then
self:applyForce(250, 0)
end
end
if self:isControlDown("right") then
self.facing = 1
self:applyForce(250, 0)
-- Controlled speed limit
if x > self.MAX_VELOCITY then
self:applyForce(-250, 0)
end
end
end
-- Controller callbacks.
function Player:controlpressed (set, action, key)
if set ~= self:getControllerSet() then return end
self.smoke = false -- TODO: temporary
-- Jumping
if action == "jump" then
if self.jumpCounter > 0 then
-- General jump logics
self.isJumping = true
--self:playSound(6)
-- Spawn proper effect
if not self.inAir then
self:createEffect("jump")
else
self:createEffect("doublejump")
end
-- Start salto if last jump
if self.jumpCounter == 1 then
self.salto = true
end
-- Animation clear
if (self.current == self.animations.attack) or
(self.current == self.animations.attack_up) or
(self.current == self.animations.attack_down) then
self:setAnimation("default")
end
-- Remove jump
self.jumpCounter = self.jumpCounter - 1
end
end
-- Walking
if (action == "left" or action == "right") then
self.isWalking = true
if (self.current ~= self.animations.attack) and
(self.current ~= self.animations.attack_up) and
(self.current ~= self.animations.attack_down) then
self:setAnimation("walk")
end
end
-- Punching
if action == "attack" and self.punchCooldown <= 0 then
local f = self.facing
self.salto = false
if self:isControlDown("up") then
-- Punch up
if self.current ~= self.animations.damage then
self:setAnimation("attack_up")
end
self:punch("up")
elseif self:isControlDown("down") then
-- Punch down
if self.current ~= self.animations.damage then
self:setAnimation("attack_down")
end
self:punch("down")
else
-- Punch horizontal
if self.current ~= self.animations.damage then
self:setAnimation("attack")
end
if f == 1 then
self:punch("right")
else
self:punch("left")
end
self.punchdir = 1
end
end
end
function Player:controlreleased (set, action, key)
if set ~= self:getControllerSet() then return end
-- Jumping
if action == "jump" then
self.isJumping = false
self.jumpTimer = Hero.jumpTimer -- take initial from metatable
end
-- Walking
if (action == "left" or action == "right") then
if not (self:isControlDown("left") or self:isControlDown("right")) then
self.isWalking = false
if self.current == self.animations.walk then
self:setAnimation("default")
end
end
end
end
return Player
|