π
<-

Encore un bug.

Pour TI-Nspire OS 3.0 ou ultérieur.

Encore un bug.

Unread postby technolapin » 19 May 2014, 18:32

Me revoilà pour vous faire perdre quelques précieuses secondes de votre vie (encore) >:]
Voilà, j'était en train de faire un Mr.flap en lua. J'était là, peinard, sans rien demander à personne, quad tout à coup: ATTAQUE DE BUG NINJA!
Mon programme actuel consiste en un repère polaire avec plusieurs objets: des balles (j'ai pas mis d'oiseaux, pasque voilà), des murs, et un sol.
Mais, mon (seul) problème est toujours le même: les collisions (ça me pose problème dans toutes les dimensions et représentations).
Je ne sais pas du tout où ça va pas (mais je pense que c'est dans la fonction qui calcule les collisions), mais les balles se heurtent à des murs invisibles qui n'existent pas, et du coup cela réduit grandement la chance de n'en toucher aucun).
J'ai même tenté de redessiner le jeu en repère euclidien, mais je ne trouve toujours pas ce qui bug.
Code: Select all
-- x = d*cos(a)
-- y = d*sin(a)
-- a = atan (x/y)
-- d = x/cos(a)
function on.resize (ww, hh)
w, h = ww, hh
t = 1
pi = math.pi
cx, cy = w/2, h/2
floor = 32
friction = 0.7
rfriction = math.sqrt (friction)
obj = {}
for a = 1, 1 do
  obj[a] = ball (
    math.random (0, math.pi*2)
  , math.random (floor, floor+64)
  , math.random (-pi, pi)/16
  , math.random (-4, 4)
  , 4
   )
end
for a = 1, 1 do
  table.insert (obj,
     wall (math.random (0, 2*math.pi)
   , floor
   , math.random (16, 128)))
end
timer.start (0.04)
end


ball = class ()

function ball: init (a, d, ma, md, r)
self.t = "ball"
self.a = a
self.d = d
self.ma = ma
self.md = md
self.r = r
end

function ball: move ()
local old = {a=self.a-self.r, d=self.d-self.r}
self.md = self.md-1

self.a = self.a+self.ma
self.d = self.d+self.md

if self.a >=2*pi then self.a = 0 end
if self.a < 0 then self.a = self.a+2*pi end
  for _, b in pairs (obj) do
   if b.t == "wall" then
    local i = inter (b, old, self)
    if i then
     self.ma = -self.ma
    end
   end
  end

if self.d-self.r < floor then
  self.d = floor+self.r
  self.md = math.abs (self.md)
end
end

function inter (wl, p1, p2)
local l1 = { a = { x = wl.d*math.cos (wl.a)
                  , y = wl.d*math.sin (wl.a)}
            , b = { x = (wl.d+wl.h)*math.cos (wl.a)
                  , y = (wl.d+wl.h)*math.sin (wl.a)}
             }
local l2 = { a = { x = p1.d*math.cos (p1.a)
                  , y = p1.d*math.sin (p1.a)}
            , b = { x = p2.d*math.cos (p2.a)
                  , y = p2.d*math.sin (p2.a)}
             }

local rect = {}

rect.xmin = math.max (math.min (l1.a.x, l1.b.x), math.min (l2.a.x, l2.b.x))
rect.xmax = math.min (math.max (l1.a.x, l1.b.x), math.max (l2.a.x, l2.b.x))
rect.ymin = math.max (math.min (l1.a.y, l1.b.y), math.min (l2.a.y, l2.b.y))
rect.ymax = math.min (math.max (l1.a.y, l1.b.y), math.max (l2.a.y, l2.b.y))

a1 = (l1.a.y-l1.b.y)/(l1.a.x-l1.b.x)
b1 = l1.a.y-a1*l1.a.x
a2 = (l2.a.y-l2.b.y)/(l2.a.x-l2.b.x)
b2 = l2.a.y-a2*l2.a.x

x = (b2-b1)/(a1-a2)
y = a1*x+b1

if x > rect.xmin
and x < rect.xmax
and y > rect.ymin
and y < rect.ymax then
  return {a=wl.a, d=p1.d}
else
  return false
end
end


function ball: paint (gc)
local x = self.d*math.cos (self.a)
local y = self.d*math.sin (self.a)
gc: fillArc ((x-self.r)/t+cx, (y-self.r)/t+cy, self.r/t*2, self.r/t*2, 0, 360)
end

wall = class ()

function wall: init (a, d, h)
self.t = "wall"
self.a = a
self.d = d
self.h = h
end
function wall: move ()
self.a = self.a+pi/90
if self.a >= 2*pi then self.a = 0 end
end
function wall: paint (gc)
gc: drawLine ( self.d*math.cos (self.a)/t+w/2
              , self.d*math.sin (self.a)/t+h/2
              , (self.d+self.h)*math.cos (self.a)/t+w/2
              , (self.d+self.h)*math.sin (self.a)/t+h/2
               )
end


function on.timer ()
platform.window: invalidate ()
end



function on.paint (gc)
for a, b in pairs (obj) do
  b: move ()
  b: paint (gc)
end
gc: drawString (obj[1].a, 4, 16)
gc: drawString (obj[1].d, 4, 32)
gc: drawString (obj[1].a-obj[2].a, 4, 48)

gc: setColorRGB (150, 150, 150)
gc: fillArc (cx-floor/t, cy-floor/t, floor/t*2, floor/t*2, 0, 360)
paint2 (gc)
end

function paint2 (gc)
gc: fillRect (0, h-floor, 180, floor)
gc: fillRect (obj[2].a/(2*pi)*180, h-obj[2].d-floor, 1, obj[2].h)
gc: setColorRGB (0)
gc: fillArc ( obj[1].a/(2*pi)*180-obj[1].r
             , h-obj[1].d-obj[1].r
             , obj[1].r*2, obj[1].r*2, 0, 360)
end


function on.enterKey ()
for a, b in pairs (obj) do
  if b.t == "ball" then
   b.md = 4
   b.d = b.d+8
  end
end
end

Votez Kasane Teto 2017
User avatar
technolapin
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 97.8%
 
Posts: 514
Images: 25
Joined: 31 Dec 2012, 10:48
Location: Chez moi
Gender: Male
Calculator(s):
MyCalcs profile
Class: Chui en vacance ducon

Re: Encore un bug.

Unread postby AnToX98 » 19 May 2014, 18:58

Technique incroyable : print()

Tu en fourres partout en mettant bien des indications pour t'y retrouver : ex : print("Variable x du mur"..x_mur)

J'ai eu exactement le même problème de collision invisible et je me suis rendu compte avec des print que un test if était appelé sans aucune logique : j'avais inversé x et y dans le test...

Bonne chance. C'est long et chiant mais c'est l'unique manière de t'en sortir... :bj:
User avatar
AnToX98Premium
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 75.5%
 
Posts: 1022
Images: 15
Joined: 19 May 2013, 16:54
Location: Paris, France
Gender: Male
Calculator(s):
MyCalcs profile
Class: 1ere S

Re: Encore un bug.

Unread postby technolapin » 19 May 2014, 19:00

Mais moi j'utillise jen's scriptor, et pis les print y s'y marchent pas.
Votez Kasane Teto 2017
User avatar
technolapin
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 97.8%
 
Posts: 514
Images: 25
Joined: 31 Dec 2012, 10:48
Location: Chez moi
Gender: Male
Calculator(s):
MyCalcs profile
Class: Chui en vacance ducon

Re: Encore un bug.

Unread postby Adriweb » 19 May 2014, 19:57

AnToX98 wrote:Technique incroyable : print()
Tu en fourre partout en mettant bien des indications pour t'y retrouver : ex : print("Variable x du mur"..x_mur)
J'ai eu exactement le même problème de collision invisible et je me suis rendu compte avec des print que un test if était appelé sans aucune logique : j'avais inversé x et y dans le test...

Le debuggeur (points d'arrêts etc., mais aussi les watch, et le callstack) est sous-utilisé, je pense.
C'est assez pratique quand le besoin se fait sentir :)

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 79.9%
 
Posts: 14838
Images: 1131
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

Re: Encore un bug.

Unread postby Levak » 19 May 2014, 19:58

technolapin wrote:Mais moi j'utillise jen's scriptor, et pis les print y s'y marchent pas.

Tu vas pas nous dire que tu as recopié le code à la main non plus ?
Donc si tu as eu le moyen de faire un copier/coller, tu peux ouvrir l'éditeur de script Lua, et faire des print() non ?
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Encore un bug.

Unread postby technolapin » 19 May 2014, 20:02

Remarque, ouai... mais je pense que je vais recréer la fonction print parce que j'ai pas accès à mon ordi assez longtemps pour utiliser l’éditeur de script.
Votez Kasane Teto 2017
User avatar
technolapin
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 97.8%
 
Posts: 514
Images: 25
Joined: 31 Dec 2012, 10:48
Location: Chez moi
Gender: Male
Calculator(s):
MyCalcs profile
Class: Chui en vacance ducon


Return to Nspire-Lua

Who is online

Users browsing this forum: ClaudeBot [spider] and 4 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
2263 utilisateurs:
>2228 invités
>28 membres
>7 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)