View difference between Paste ID: DyDscfEn and SyEyqZGN
SHOW: | | - or go back to the newest paste.
1
2
--# Main
3
-- Main
4
5
function setup()
6
    t=Track2()
7
    parameter.boolean("Rays",true)
8
end
9
10
function draw()
11
    t:draw()
12
end
13
14
function touched(touch)
15
    t:touched(touch)
16
end
17
--# Track1
18
Track1 = class()
19
20
function Track1:init(x)
21
    self.car={x=350,y=100}
22
    self.FOV=75 --degrees each side
23
    self.slice=1 --degrees per view
24
end
25
26
function Track1:draw()
27
    background(128)
28
    spriteMode(CORNER)
29
    --create new shapes every second or sl
30
    if counter==nil then counter=0 end
31
    counter = counter + 1
32
    if counter%60==1 then --every 60 redraws, or about one second
33
        screen=image(WIDTH,HEIGHT) --draw on an image the same size as the screen
34
        setContext(screen)
35
        fill(0,0,255,100)   
36
        for i=1,3 do   
37
            rect(self.car.x+math.random(-200,200),self.car.y+math.random(100,500),
38
                    math.random(10,100),math.random(10,100))
39
            ellipse(self.car.x+math.random(-200,200),self.car.y+math.random(100,500),math.random(10,100))
40
        end
41
        setContext()
42
        views=self:GetRays(screen)
43
    end
44
    sprite(screen,0,0)
45
    fill(255,0,0)
46
    ellipse(self.car.x,self.car.y,20)
47
    stroke(0,100,200,200)
48
    strokeWidth(1)
49
    if views~=nil then
50
        for i,v in ipairs(views) do
51
            line(self.car.x,self.car.y,v.x,v.y)
52
        end
53
    end
54
end
55
56
function Track1:GetRays(s)
57
    local rays={} --to store results
58
    local f=math.pi/180 --to convert degrees to radians
59
    for i=-self.FOV,self.FOV,self.slice do
60
        local d,dy,dy=0,0,0 --distance to object, and x,y position of object
61
        for u=1,1000 do --put a limit ont he looping
62
            local xx=self.car.x+u*math.sin(i*f) --step forward
63
            local yy=self.car.y+u*math.cos(i*f)
64
            --if in bounds, and pixel non blank, we've hit something
65
            if xx>1 and xx<=WIDTH and yy>1 and yy<=HEIGHT then
66
                local r,g,b,a=s:get(xx,yy)
67
                if b~=0 then d=u dx=xx dy=yy break end
68
            else break end
69
        end
70
        --store angle, distance and x,y position of object
71
        if d>0 then table.insert(rays,{angle=i,dist=d,x=dx,y=dy}) end
72
    end
73
    return rays
74
end
75
76
function Track1:touched(touch)
77
    --dummy for now
78
end
79
--# Track2
80
Track2 = class()
81
82
function Track2:init(x)
83
    self.car={x=25,y=50,speed=4,angle=0}
84
    self.FOV=75 --degrees each side
85
    self.slice=5 --degrees per view
86
    self.trackOffset={x=50,y=50}
87
    self:CreateTrack()
88
end
89
90
function Track2:draw()
91
    --assign temporary short names just to make code easier to read
92
    local tx,ty=self.trackOffset.x,self.trackOffset.y
93
    background(128)
94
    pushStyle()
95
    spriteMode(CORNER)
96
    sprite(imgTrack,tx,ty)
97
    fill(255,0,0)
98
    ellipse(tx+self.car.x,ty+self.car.y,12)
99
    stroke(0,100,200,200)
100
    strokeWidth(1)
101
    views=self:GetRays(imgTrack)
102
    if views~=nil and Rays then
103
        for i,v in ipairs(views) do
104
            line(tx+self.car.x,ty+self.car.y,tx+v.x,ty+v.y)
105
        end
106
    end
107
    popStyle()
108
    self:SetNewPosition()
109
end
110
111
function Track2:CreateTrack()
112
    imgTrack=image(500,400)
113
    setContext(imgTrack)
114
    pushStyle()
115
    fill(0,0,0,0) --transparent
116
    stroke(201,201,201) --white
117
    self.TrackBlue=201 --define the track colour (blue)
118
    strokeWidth(50)
119
    rect(0,0,500,400)
120
    popStyle()
121
    setContext()
122
end
123
124
function Track2:GetRays(s)
125
    local rays={} --to store results
126
    local f=math.pi/180 --to convert degrees to radians
127
    for i=self.car.angle-self.FOV,self.car.angle+self.FOV,self.slice do --CHANGE
128
        local d,dy,dy=0,0,0 --distance to object, and x,y position of object
129
        for u=1,1000 do --put a limit on the looping
130
            local xx=self.car.x+u*math.sin(i*f) --step forward
131
            local yy=self.car.y+u*math.cos(i*f)
132
            --if in bounds, and pixel non blank, we've hit something
133
            if xx>1 and xx<=WIDTH and yy>1 and yy<=HEIGHT then
134
                local r,g,b,a=s:get(xx,yy)
135
                if b~=self.TrackBlue then d=u dx=xx dy=yy break end
136
            else break end
137
        end
138
        --store angle, distance and x,y position of object
139
        if d>0 then table.insert(rays,{angle=i,dist=d,x=dx,y=dy}) end
140
    end
141
    return rays
142
end
143
144
function Track2:SetNewPosition()
145
    local maxd,maxa=0,0
146
    for i,v in ipairs(views) do
147
        if v.dist>maxd then maxd=v.dist maxa=v.angle end
148
    end
149
    local f=math.pi/180 --to convert degrees to radians
150
    self.car.x=self.car.x+self.car.speed*math.sin(maxa*f)
151
    self.car.y=self.car.y+self.car.speed*math.cos(maxa*f)
152
    self.car.angle=maxa
153
end
154
155
function Track2:touched(touch)
156
    --dummy for now
157
end