Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: FreeBASIC: Kuinka tutkia kolikon osumista viivaan?

PetriKeckman [13.02.2023 21:50:10]

#

Yritän tehdä yhden kolon pajatsopeliä Free Basicillä: http://petke.info/jasso.exe (Windows) Kokeile peliä, niin tiedät mistä puhun. Tarvitset tämän kuvan euron kolikosta samaan kansioon, missä .exen ajat: https://petke.info/euro.bmp

Ongelmani on: kuinka kannattaisi tutkia osuuko kolikko johonkin viivaan jostain suunnasta ja ponnahtaa takaisin? Suuntia on kolme: vasemmalta, oikealta tai ylhäältä. Ruudun yläreunaa en tutki, sillä sinne ei kolikko ponnahtele.

Viivoja on yksitoista. Ne ovat taulukossa:
(tuolla https://petke.info/jassotausta.png vielä kuva, missä viivat numeroitu keltasella ja valkoinen numero kertoo mistä suunnasta törmäämistä viivaan tutkitaan: 1, oikealta, 2, vasemmalta ja 3, ylhäältä)

Dim As Integer viivat(1 To 11,1 To 5) = {{0,0,0,1024,1},{0,1024,256,1024,3},{256,512,256,1024,2},...jne Alkiot ovat viivan alkupisteen x- ja y-koordinaatta sekä loppupisteen x- ja y-koordinaatta. Viides alkion jäsen, jonka arvot ovat joko 1, 2 tai 3 kertoo tutkitaanko viivaan osumista oikealta päin, vasemmalta päin vai lähestyykö euron kolikko viivaa ylhäältä päin.

Ruudun vasen reuna ja oikea reuna toimivat - mikseivät sitten muut viivat? Vai onkohan virhe pitkällä rivillä 20, millä syötän noita viivojen alku- ja loppupisteiden koordinaatteja ja tietoa, mistä suunnasta tutkitaan törmäsytä?

Onko tapani tutkia koko hommaa ihan retuperällä, kun en ole saanut hommaa toimimaan?

Koodi saattaa olla sotkuista, mutta kysyä saa. Euron kolikon resoluutio on 83x83, siksi luku 83 kummittelee koodissa.
EDIT: Otin koodista ehdon pois, että otetaan uusi kolikko, jos menee kuvaruudun ulkopuolelle - nyt täytyy hieman odottaa uudessa ohjelmassa, että askelia ollaan otettu 400 ennen kuin uusi kolikko tulee oikeaan yläkulmaan.

Print "Paina hiiren vasenta näppäintä. Mitä kauemmin painat sitä nopeammin kolikko lähtee. Odota hetki aina seuraavaa kolikkoa"
Print "Lopeta ohjelma painamalla hiiren oikeaa näppäintä"
Screen 21,16
Dim As Integer maxx=1280, maxy=1024
Type kolikko_koko
    As Integer leveys,korkeus
End Type
Dim  kolikko As String ="euro.bmp"
Dim As Any Ptr kuvabufferi, kuvabufferi2
Sub load(Byref bmp As String,Byref pixelit As Any Ptr) 'ladataan kolikko kuvaruutumuistiin
    Bload bmp
    Dim temp As kolikko_koko=(83,83)
    pixelit = Imagecreate(temp.leveys + 1, temp.korkeus + 1)
    Get (0, 0)-(temp.leveys, temp.korkeus), pixelit
End Sub
'XXXXXXXXXXXXXXXXXXXXXXX
load kolikko,kuvabufferi 'asetetaan kolikko kuvaan
Dim As Integer nopeus,mx,my,mb,ind, silmukka
                 						'1 oikealta		2 ylhäältä          3 vasemmalta         4 päältä            5 oikealta            6 päältä                7 vasemmalta          8 päältä             9 vasemmalta           10 päältä               11 vasemmalta
Dim As Integer viivat(1 To 11,1 To 5) = {{0,0,0,1024,1},{0,1024,256,1024,3},{256,512,256,1024,2},{256,512,512,512,3},{512,512,512,819.2,1},{512,819.2,768,819.2,3},{768,512,768,819.2,2},{768,512,1024,512,3},{1024,512,1024,1024,1},{1024,1024,1280,1024,3},{1280,0,1280,1024,2}}
Dim As Double x 'kolikon x alkukoordinaatta
Dim As Double y0 'kolikon y alkukoordinaatti. Oikeassa yläkulmassa
Dim As Double vx 'kolikon vaakasuora nopeus
Dim As Double v0 'vauhti alussa
Dim As Double t0 'aika alussa
Dim As Double g 'kiihtyvyys
Dim As Double Dt = 1/100 'kolikon asemaa tutkitaan sadaosan välein
Dim As Double y = y0
Dim As Double vy = v0
Dim As Double t = t0
Getmouse(mx,my,,mb)
Do Until (mb=2)
'asetetaan alkuarvoja
	x=maxx-83
	y0 = 48
	v0 = 0
	t0 = 0
	g = 4000
	Dt = 1/100
	y = y0
	vy = v0
	t = t0
	Cls
	Put (x, y), kuvabufferi, pset
	For ind = 1 To 11 Step 1 'Piirretaan jasson viivat
		Line (viivat(ind,1),viivat(ind,2))-(viivat(ind,3),viivat(ind,4)),rgb(255,0,0)
	Next ind
	Getmouse(mx,my,,mb)
	While (mb<>1) 'odotetaan, että pelaaja painaa hiiren vasenta näppäintä tai lopettaa ja painaa hiiren oikeaa nappulaa
	Getmouse(mx,my,,mb)
	If mb=2 Then
		exit While
	End If
	wend
	nopeus=0
	while (mb=1) 'pelaaja painaa hiiren vasenta näppäintä
		Getmouse(mx,my,,mb)
		nopeus=nopeus+1
	wend
	vx=-nopeus/10000
	silmukka=1
	Do until (silmukka > 400)
	    cls
	    Screenlock 'lukitaan screeni siksiajaksi kun kirjoitetaan grafiikka puskuriin
	    For ind = 1 To 11 Step 1 'Piirretaan jasson viivat
			Line (viivat(ind,1),viivat(ind,2))-(viivat(ind,3),viivat(ind,4)),rgb(255,0,0)
		Next ind
	    Put (x,y), kuvabufferi, pset
	    Screenunlock 'otetaan screeni lukituksesta pois
	    vy = vy - g*Dt
	    y = y-vy*Dt-g*Dt*Dt/2
	    x=x+vx*Dt
		sleep 2,1
	    For ind=1 To 11 Step 1 ' osuuko kolikko johonkin yhdestätoista viivoista?
	    	If viivat(ind,5)=1 Then' tutkitaan osumista oikealta päin
	    		If (x<viivat(ind,1)) and (vx<=0) and ((y >= viivat(ind,2)) and ((y+83) <= viivat(ind,4)))Then 'on osunut viivaan
	    			vx = -0.994*vx
	    		End If
	    	End If
	    	If viivat(ind,5)=2 Then 'onko osunut vasemmalta päin viivaan?
	    		If ((x+83)>viivat(ind,1)) and (vx>=0) and ((y>= viivat(ind,2)) and ((y+83) <= viivat(ind,4))) Then 'on osunut viivaan
	    			vx = -0.994*vx
	    		End If
	    	End If

	    	If viivat(ind,5)=3 Then 'onko osunut ylhäältä päin?
	    		If (y+83)>=viivat(ind,2) And (vy>0) and (x>=viivat(ind,1)) And ((x+83)<=viivat(ind,3)) Then 'on osunut viivaan
	    			vy = -0.994*vy
	    		End If
	    	End If
	    Next ind
	    t = t + Dt
	    Getmouse(mx,my,,mb) 'Peli lopetetaan painamalla hiiren oikeaa näppäintä
		If mb=2 Then
			exit Do
		End If
		silmukka=silmukka+1
	Loop
Loop
Screenlock
Cls
Imagedestroy kuvabufferi

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta