创造基类
首先需要我们需要一个基类来继承和扩展方法,新建文件<Classic.lua>,代码如下:
local Object = {}
Object.__index = Object -- 子类中找不到方法的就会从基类方法中找
-- 新建一个子类
function Object:extend()
local cls = {}
-- 继承基类以下划线__开头的方法
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
--让子类的父类等于基类,方便访问基类
cls.super = self
-- 让基类成为子类的元表
setmetatable(cls, self)
return cls
end
function Object:new()
end
-- 我们知道 Object:extend()函数返回的是一个表,所以把个这表当函数调用时,会触发元表里的__call函数,即把自己当做元表给一个空表,并对空表调用new方法
function Object:__call(...)
local instance = setmetatable({}, self)
instance:new(...)
return instance
end
-- 返回基类
return Object
新建main.lua
代码如下:
direc = 0.1 ---控制方向的全局变量
function love.load()
Object= require "classic"
require "Car"
car = Car(80,478.8,500)
end
function love.update(dt)
car:update(dt)
end
function love.draw()
car:draw()
end
创造子类Car
我们新建文件<Car.lua>,代码如下
--初始化汽车参数
Car = Object:extend()
function Car:new(x,y,speed) -- 初始化汽车的坐标和速度
self.x=x
self.y=y
self.speed=speed
self.image=love.graphics.newImage("car1.png")
end
-- 画出汽车
function Car:draw()
love.graphics.draw(self.image, self.x,self.y,0,direc,0.1,700,0) --direc是在main.lua中的全局变量,控制车的朝向 700 和 0 是设置图片变换的中心点
end
-- 根据时间变化计算汽车的参数
function Car:update(dt)
if love.keyboard.isDown("right") then
self.x = self.x + self.speed * dt
direc=-0.1
elseif love.keyboard.isDown("left") then
direc = 0.1
self.x = self.x - self.speed * dt
end
end
以上效果图:
子弹
我想要按下空格键的时候发射子弹,而且每按下一个空格键都发射一颗子弹。
大概思路:
- 子弹的参数与汽车并没有什么不同,但是要能发射多颗子弹其需要画出每颗子弹。运用table的方式来储存子弹,通过遍历的形式来画子弹和计算子弹的参数。
- 应该把按下空格键时汽车的坐标传给子弹方法,因为这样才能符合子弹发射的逻辑,同时汽车朝向不同子弹的速度应该是不同且子弹的绘制应该是不同方向。
Bullet.lua
Bullet = Object:extend()
function Bullet:new(x,y,speed)
self.x=x
self.y=y
self.image=love.graphics.newImage("Bullet.png")
-- speed 和 angle 都是为了汽车不同朝向而保证子弹符合发射逻辑而设置的
self.speed = speed or 0
self.angle=0
end
function Bullet:draw()
love.graphics.draw(self.image, self.x,self.y,self.angle,0.2,0.2)
end
function Bullet:update(dt)
if self.speed>0 then
self.angle = math.rad(45)
else
self.angle = math.rad(225)
end
self.x = self.x + self.speed * dt
end
同时我们需要给<Car.lua>添加新的函数来触发发射事件
Car = Object:extend()
function Car:new(x,y,speed)
self.x=x
self.y=y
self.speed=speed
self.image=love.graphics.newImage("car1.png")
self.direc=0.1
self.bulletSpeed=0
self.bullet_x=0
self.bullet_y=0
end
function Car:draw()
love.graphics.draw(self.image, self.x,self.y,0,direc,0.1,700,0)
end
function Car:update(dt)
if love.keyboard.isDown("right") then
self.x = self.x + self.speed * dt
direc=-0.1
self.bulletSpeed=300
self.bullet_x = self.x+80
self.bullet_y = self.y +20
elseif love.keyboard.isDown("left") then
direc = 0.1
self.x = self.x - self.speed * dt
self.bulletSpeed = -300
self.bullet_x = self.x - 80
self.bullet_y = self.y + 80
end
end
function Car:shoot()
table.insert(bulletList, Bullet(self.bullet_x, self.bullet_y,self.bulletSpeed))
end
同时我们需要给<main.lua>添加新的函数来检测按下空格事件
function love.keypressed(key)
car:shoot(key)
end
效果如下: