love2d 代码库(三):愤怒小车发子弹

创造基类

首先需要我们需要一个基类来继承和扩展方法,新建文件<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

以上效果图:
在这里插入图片描述

子弹

我想要按下空格键的时候发射子弹,而且每按下一个空格键都发射一颗子弹。

大概思路:

  1. 子弹的参数与汽车并没有什么不同,但是要能发射多颗子弹其需要画出每颗子弹。运用table的方式来储存子弹,通过遍历的形式来画子弹和计算子弹的参数。
  2. 应该把按下空格键时汽车的坐标传给子弹方法,因为这样才能符合子弹发射的逻辑,同时汽车朝向不同子弹的速度应该是不同且子弹的绘制应该是不同方向。

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 

效果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值