Jeu de tir en 2D (à la première personne)

LÖVE (ou Love2D) est un moteur libre multiplate-forme de développement de jeux informatiques 2D. Conçu en C++, il utilise Lua comme langage de programmation. Il est publié sous la licence zlib. L'API fournie par le moteur donne accès aux fonctions vidéo et sonores de la machine hôte grâce aux bibliothèques SDL et OpenGL, ou depuis la version 0.10 également OpenGL ES 2 et 33.
Post Reply
Kitsune
Site Admin
Posts: 21
Joined: Sun Nov 28, 2021 7:09 pm

Jeu de tir en 2D (à la première personne)

Post by Kitsune »

Hello!

Voici un exemple d'un jeu de tir à la première personne en 2D créé avec le logiciel Löve et le language de programmation Lua.

Pour faire tourner le jeu il vous faudra installer le logiciel LÖVE disponible à cette adresse:
https://love2d.org/

Ensuite télécharger le fichier Magnum.love.zip joint à ce message

et supprimer l'extension .zip du fichier précédemment téléchargé pour que le nom complet devienne Magnum.love

Normalement à ce stade lorsque vous double-cliquez sur le fichier love vous devriez avoir le jeu de tir se lancer.

Utilisez la souris pour viser et le clic gauche pour tirer. touche ESC du clavier pour quitter.

Code source LUA:

Code: Select all

function love.load()
	love.window.setTitle('title')
	love.window.setMode( 640, 480, {resizable=false, fullscreen=false} )
	win_w=love.graphics.getWidth()
	win_h=love.graphics.getHeight()
	image = love.graphics.newImage("background.png")
	target = {}
	target.x = 300
	target.y = 200
	target.radius = 30
	
	mouse ={}
	mouse.y=0
	baseTimer=0
	score=0
	timer=0
	time_limit=10
	ammo=6
	
	shoot=0
	shoot_time=1.5
	
	sound = love.audio.newSource("shoot.ogg", "static")
	
	gameFont = love.graphics.newFont(18)
	cursor = love.mouse.newCursor("cursor.png", 8, 8 )
	love.mouse.setCursor(cursor)
end

function love.update(dt)
	shoot_time=shoot_time+dt
	if timer<time_limit and ammo> 0 then
		mouse.x = love.mouse.getX()
		mouse.y = love.mouse.getY()
		love.mouse.setPosition( math.random(mouse.x-10,mouse.x+10), math.random(mouse.y-5, mouse.y+5))
		
		baseTimer = baseTimer + dt
		if baseTimer > 1 then
			baseTimer = 0
			timer = timer + 1
		end
	end
end

function love.draw()
	
	if timer<time_limit and ammo>0 then
		love.graphics.draw(image, 0, 0)
		love.graphics.setColor(1,0,0)
		love.graphics.circle("fill", target.x,target.y,target.radius)
		love.graphics.setColor(1,1,1)
		love.graphics.circle("fill", target.x,target.y,target.radius-5)
		love.graphics.setColor(1,0,0)
		love.graphics.circle("fill", target.x,target.y,target.radius-10)
		love.graphics.setColor(1,1,1)
		love.graphics.circle("fill", target.x,target.y,target.radius-15)
		love.graphics.setColor(1,0,0)
		love.graphics.circle("fill", target.x,target.y,target.radius-20)
		love.graphics.setColor(1,1,1)
		love.graphics.circle("fill", target.x,target.y,target.radius-25)
		love.graphics.setFont(gameFont)
		love.graphics.print("Score: "..score,0,0)
		love.graphics.print("Time: "..timer,0,30)
		love.graphics.print("Ammo: "..ammo,0,60)
		if shoot==1 then
			love.graphics.setColor(1,1,1)
			love.graphics.rectangle("fill",0,0,800,600)
			
			shoot=0
		end
	else
		love.graphics.setColor(1,1,1)
		love.graphics.rectangle("fill",0,0,800,600)
		love.graphics.setColor(0,0,0)
		love.graphics.print("Game Over!",love.graphics.getWidth()/2-50,love.graphics.getHeight()/2-20)
		love.graphics.setNewFont(16)
		love.graphics.print("You have touched the target: "..tostring(score).." time(s).",win_w/2-150,win_h/2)
	end
end

function love.mousepressed(x,y,button)
	if timer<time_limit and ammo>0 then
		if button == 1 and shoot_time>1.5 then
			shoot_time=0
			
			ammo=ammo-1
			shoot=1
			sound:play()
			local mouseToTarget = distanceBetween(x,y,target.x,target.y)
			if mouseToTarget < target.radius then
				score=score+1
				--Random position of the target
				target.x = math.random(target.radius,love.graphics.getWidth()-target.radius)
				target.y = math.random(target.radius,love.graphics.getHeight()-target.radius)
			end
			love.mouse.setPosition(mouse.x,mouse.y-30)
		end
	elseif button == 1 and shoot_time>1.5 then
			timer=0
			score=0
			baseTimer=0
			ammo=6
			shoot_time=0
	end
end

function love.keypressed(key, scancode, isrepeat)
   if key == "escape" then
      love.event.quit()
   end
end
--Function that return the distance between 2 points
function distanceBetween(x1,y1,x2,y2)
	return math.sqrt((x2-x1)^2+(y2-y1)^2)
end
Attachments
Magnum.love.zip
(226.99 KiB) Downloaded 2 times
Post Reply