Vuodenvaihteen ilotulitusten innoittamana kokeilin, kuinka VB:llä saa simuloitua raketteja. Vastaavia voi olla entuudestaan, mutta tämä on ainakin omaperäinen. Raketin nousuvaiheessa himmenevän pyrstön piirrossa käytetään pyörivää silmukkaa, jossa laskuri kiertää silmukkaa aloitus- ja lopetuskohdan myös kiertäessä.
Formilla on kaksi ajastinta, Timer1 ja Timer2
Timer2.Interval = 20. Timer1:n intervallia muutellaan satunnaisesti. Raketteja ammuskellaan satunnaisin välein ja lopussa posautetaan palloksi. Ääniä ei ole, koska pidän hiljaisuudesta. Joku paremmin osaava voisi vaikka lisätä äänitehosteet. Formin kokoa voi muutella. Lentoradat skaalautuvat formin mukaan.
Mahtaakohan tämmöiseen sovellukseen saada paljonkin tehoja lisää API-kutsuilla tai DirectX:llä??
Option Explicit Dim I As Integer, J As Integer, K(19) As Integer 'laskurit Dim L As Integer, M As Integer, N(19) As Integer Dim px(19, 29) As Integer, py(19, 29) As Integer 'paikat Dim qx(19, 99) As Single, qy(19, 99) As Single Dim si(99) As Single, co(99) As Single 'sin ja cos Dim a As Single 'kulma Dim q As Integer, p As Integer 'laskureita Dim s As Integer 'skaalauskerroin Dim X(29) As Single, Y(29) As Single 'koordinaatit Dim t(19, 99) As Single, z As Single 'pallon säde Dim F(19) As Byte 'tilamuuttuja Dim r(19, 29) As Byte, g(19, 29) As Byte Dim b(19, 29) As Byte 'värit Dim r0(19) As Byte, g0(19) As Byte Dim b0(19) As Byte, c(19) As Long Dim e(19) As Byte, d As Byte 'väriparametrit Dim vx(29) As Single, vy(29) As Single 'nopeus Dim dv As Single, v As Single 'nopeuden muutos, nopeus
Private Sub Form_Load()
ScaleTop = ScaleHeight
ScaleHeight = -ScaleHeight 'y-aks. käännetään ylösalaisin
Randomize 'satunnainen viive
Timer1.Interval = 300 + 1000 * Rnd
For p = 0 To 99 'lasketaan kulmat, sinit ja cosinit
a = 0.08 * Atn(1) * p
si(p) = Sin(a): co(p) = Cos(a)
Next
End Sub
Private Sub Form_Resize()
ScaleTop = -ScaleHeight
s = ScaleTop 'pidetään 0-kohta formin alareunassa
Cls
End SubPrivate Sub Timer1_Timer() Timer1.Enabled = False vy(I) = (2 + Rnd) * ScaleTop / 500 'raketin lähtönopeus X(I) = 0.15 * ScaleWidth 'ja -paikka vx(I) = (0.2 + Rnd) * ScaleWidth / 500 Y(I) = 0: F(I) = 1 r0(I) = 230 + 25 * Rnd: g0(I) = 150 + 40 * Rnd 'arvotaan väri b0(I) = 100 + 100 * Rnd Timer1.Interval = 100 + 3000 * Rnd 'arvotaan ammunnan väli I = -(I + 1) * (I < 19) 'kasvatetaan yhdellä ja nollataan 19 jälkeen N(I) = 0: K(I) = 0 M = M - (M < I) 'samanaikaisten rakettien määrä Timer1.Enabled = True End Sub
Private Sub Timer2_Timer()
For J = 0 To M - 1 'kelataan kaikki raketit
Select Case F(J)
Case 1 'nousuvaihe
v = vy(J) * vy(J) + vx(J) * vx(J) 'nopeuden neliö
dv = Sqr(Abs(100 - v)) * 0.1 * ScaleTop / 500 * Sgn(25 - v)
v = Sqr(v) 'nopeus
'alussa hieman kiihdytystä
vy(J) = vy(J) + dv * vy(J) / v - 0.03
'vaakanopeuden vaihtelulla pientä vipotusta
vx(J) = vx(J) + dv * vx(J) / v + 0.4 * Rnd - 0.2
px(J, K(J)) = X(J): py(J, K(J)) = Y(J) 'raketin paikka
r(J, K(J)) = r0(J)
g(J, K(J)) = g0(J) 'värit
b(J, K(J)) = b0(J)
X(J) = X(J) + vx(J): Y(J) = Y(J) + vy(J)
If Y(J) + X(J) / 2 > s * (0.6 + 2 * Rnd) Then F(J) = 2
Case 2 To 20
'sammutellaan nousurakettia
vy(J) = vy(J) * 0.99 - 0.02
vx(J) = vx(J) * 0.99 'hidastellaan vauhtia
v = (35 - F(J)) / 34 'himmennetään valoa
px(J, K(J)) = X(J): py(J, K(J)) = Y(J)
r(J, K(J)) = r0(J) * v
g(J, K(J)) = g0(J) * v
b(J, K(J)) = b0(J) * v
X(J) = X(J) + vx(J): Y(J) = Y(J) + vy(J)
F(J) = F(J) + 1
Case 21
'lasketaan pallon elementit
z = s * (0.15 + 0.05 * Rnd)
For p = 0 To 99
t(J, p) = z * Cos(Rnd ^ 2) 'lasketaan pisteitten
'jakauma pallon pinnalle, ilmeisesti aika oikein näin
'(tuli mieleen viime yönä)
qx(J, p) = X(J) + t(J, p) * si(p) / 6 'eka pallo
qy(J, p) = Y(J) + t(J, p) * co(p) / 6
Next
F(J) = 22
Case 22
e(J) = 66 * Rnd 'arvotaan väri
r0(J) = 255 * Abs(si(e(J))) 'lasketaan värikomponentit
g0(J) = 255 * Abs(si(e(J) + 33))
d = e(J) + 66 + 100 * (e(J) > 33)
b0(J) = 255 * Abs(si(d))
For p = 0 To 99 'posautetaan pallo
PSet (qx(J, p), qy(J, p)), RGB(r0(J), g0(J), b0(J))
Next
F(J) = 23
Case 23 To 80 'pallo laajenee hidastuen
a = 1 - 1 / (F(J) - 22) 'laajenemiskerroin
e(J) = e(J) + 1 'liutetaan väriä
d = e(J) + 100 * (e(J) > 99)
r0(J) = 255 * Abs(si(d))
d = d + 33 + 100 * (d > 66)
g0(J) = 255 * Abs(si(d))
d = d + 33 + 100 * (d > 66)
b0(J) = 255 * Abs(si(d))
vx(J) = vx(J) * 0.8: vy(J) = vy(J) * 0.8 - 0.1
X(J) = X(J) + vx(J): Y(J) = Y(J) + vy(J)
For p = 0 To 99
PSet (qx(J, p), qy(J, p)), 0 'sammutetaan edellinen
qx(J, p) = X(J) + t(J, p) * si(p) * a + Rnd - 0.5 'uudet pisteet
qy(J, p) = Y(J) + t(J, p) * co(p) * a + Rnd - 0.5
PSet (qx(J, p), qy(J, p)), RGB(r0(J), g0(J), b0(J))
Next
F(J) = F(J) + 1
Case 81 To 100
r0(J) = r0(J) * 0.95 'loppuhimmennys
g0(J) = g0(J) * 0.95
b0(J) = b0(J) * 0.95
For p = 0 To 99
PSet (qx(J, p), qy(J, p)), 0
qx(J, p) = qx(J, p) + 2 * Rnd - 1
qy(J, p) = qy(J, p) + 2 * Rnd - 1 + vy(J)
PSet (qx(J, p), qy(J, p)), RGB(r0(J), g0(J), b0(J))
Next
F(J) = F(J) + 1
Case 101
For p = 0 To 99 'sammutetaan lopuksi
PSet (qx(J, p), qy(J, p)), 0
Next
F(J) = 0
End Select
If F(J) Then
'piirretään nousuvana
PSet (px(J, K(J)), py(J, K(J))), _
RGB(r(J, K(J)), g(J, K(J)), b(J, K(J)))
If K(J) = 29 Or N(J) > 0 Then
N(J) = K(J): L = 28
Else
L = K(J) + (K(J) > 0)
End If
Do 'piirretään himmenevä häntä
If r(J, L) > 9 Then r(J, L) = r(J, L) - 9 Else r(J, L) = 0
If g(J, L) > 9 Then g(J, L) = g(J, L) - 9 Else g(J, L) = 0
If b(J, L) > 9 Then b(J, L) = b(J, L) - 9 Else b(J, L) = 0
PSet (px(J, L), py(J, L)), _
RGB(r(J, L), g(J, L), b(J, L))
If L = K(J) Then Exit Do 'viimeinen piste piirretty
L = L - 1 - 30 * (L = 0) 'pyörivä silmukka
Loop
K(J) = -(K(J) + 1) * (K(J) < 29)
End If
Next
End SubKaunis kuin mikä mutta sairaaan hidas...
Ne voisi kyl olla isompia.
Jos grafiikkaa ohjelmoi, niin ei kannata käyttää viiveisiin timereitä... SUCKS!
ottakaa edes screenshotti. mulla on vaan kämänen visual basic 3 millä tämä ei toimi :/
Hitautta hiukan pelkäsin. Päivitin uudemman version, joka on parempi ja ehkä hiukka nopeampi. Itselläni Celeron 1700+ ja NVIDIA GeForce4 MX 440 ja nopeus riittää. Kuinkahan hidas tämä sitten on muilla versioilla?
Tuli vielä muutamaan kertaan korjailtua, juuri äsken viimeksi
Ei näy mitään ??? VB 6
Oho unohtu toinen timeri ;8
Voisko joku tehä tosta exen?
Mihinkäs sen exen vois heittää? Onko ohjelmointiputkassa sellaista komeroa?
Laittakaa ScaleWith ja ScaleHeight arvoon 1000, niin toimii jopa meitsin 466:lla...
ei toimi!!! vb6
toimii sittenkin
kun lomakkeen suurentaa koko näytölle, raketit menee minne vaan!
tää on kyllä nätti ja toimii minun koneessa hyvin, ja kun täällä on valitettu että jotkut asiat saisi olla suurempia tai jokin asia on nopeampi... tässä on teille malliesimerkki ja luokaa loput ite, ei luulis olevan vaikeaa tehdä raketista suurenpaa tai koko jutusta nopeampaa... :)
exe ei tappais
mulla toimi kunnolla vasta ku laitoin scalemoden pixeleiks
täs ois binääriä: http://kotisivu.mtv3.fi/koirula/
EDIT:siin on sit scalemode pixeleinä ku mul vaa bugitti scalemode twippinä
Aihe on jo aika vanha, joten et voi enää vastata siihen.