For x=1 To MapWidth()
For y=1 To MapHeight()
If GetMap2 (0, x, y) = 7 then moveobject obj,- 2
If GetMap2 (0, x, y) = 8 then moveobject obj,2
if GetMap2 (0, x, y) = 9 then turnobject obj,60
Next y
Next x
Milläs kaavalla saisin laskettua missä kulmassa toinen piste on toiseen pisteeseen nähden, kun tiedossa on kummankin pisteen sijainti (2D x,y)? GetAnglea en voi käyttää, koska työskentelen toisella kielellä ja kun se kaava on kuitenkin todella yksinkertainen niin turha lisäkirjastoillakaan on pelleillä.
Tässä siis helppo tapa käyttäen trigonometristä tan-funktiota (tai siis sen käänteisfunkkaria). Joudut tosin hieman kikkailemaan, sillä tulos on aina jotain väliltä -90 - 90 astetta, ja ettei mene liian helpoksi, niin riippuen kummalla puolella x2 on x1:stä tämän negatiivisen arvon toinen pää heittelee. Kuva kertoo nopsasti miten tuloksen arvo on joko positiivinen tai negatiivinen riippuen x2:n sijainnista koordinaatistossa.
Eli kannattaa tarkistaa kumpi on isompi, x1 vai x2, ja sen mukaan sitten muokkailla tulosta. Kaava myös kertoo vain sen kulman, jonka toinen sivu on x-akselilla, joten jos haluat y-akselin välisen, niin sitten vähentelet 90 asteesta. Sekavaa, mutta yritä ymmärtää ;).
Ratkaisit juuri universaaliongelman! Hienoa, ota keksi.
Filosofia on ajattelun taidetta, mutta sen maalari elää juoden apurahojaan masennukseensa.
En kyllä ymmärtänyt O_o Kiitos kuitenkin vastauksesta, ja kysymys ratkesikin jo, kun muistin tämän koodin, jonka toivottavasti saan käännettyä C++:ssaksi.
For u.ob = Each OB
If ObjectsOverlap(u\obj,objcar) Or ObjectSight(u\obj,objcar) Then ammutaan=1
If ammutaan=1 Then
patim.AMMUS = New (AMMUS)
patim\obj = CloneObject (pati)
patim\vahinko = 1 'Säädetään padille vahinko ja nopeus
patim\nopeus = 4
SetupCollision patim\obj,map, 2, 4, 1
CloneObjectPosition patim\obj,u\obj 'Asetetaaan luoti oikein
CloneObjectOrientation patim\obj,u\obj
ResetObjectCollision patim\obj
Else
ammutaan=0
EndIf
Next u
For u.ob = Each ob
For ipati.AMMUS = Each AMMUS
MoveObject ipati\obj,ipati\nopeus
If ObjectsOverlap (objcar,ipati\obj) Then
hp - ipati\vahinko
DeleteObject ipati\obj
Delete ipati
Exit
EndIf
For i = 1 To CountCollisions (ipati\obj)
If Distance2(ipati\obj,u\obj) => 2500 Or GetCollision (ipati\obj,i) =map Then
DeleteObject ipati\obj
Delete ipati
ammutaan=0
Exit
EndIf
Next i
Next ipati
Exit
Next u
Johtuu tosta ammutaan-muuttujasta: Jos vihu näkee sut, se muutetaan ykköseksi ja jätetään tähän tilaan. Kun käydään loput vihut läpi, ammutaan on edelleen yksi ja näin ollen muutkin viholliset ampuvat. Nollaa se ammutaan-muuttuja ihan silmukan alussa.
Toi: Else ammutaan = 0 on ihan turha, koska tämä muuttaa ammutaan-muuttujan nollaan vain aina kun muuttuja on eri kuin 1, eli esim. 2 tai jo valmiiksi 0.
Lisäks on turha tehdä kaks kertaa For u.ob ... next u - silmukkaa. Tää vaan hidastaa peliä turhaan. Voit heittää ton kaiken koodin vain yhden silmukan sisään.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
<- protestipelikilpailun voittaja. Space War
Osaako kukaan sanoa minkä takia teksti ei tule näkyviin? Kyllä sitä tekstiä tulee, kun kerran laatikko siirtyy oikealle kirjoitettaessa. Olen melko varma että tähän on melko simppeli vastaus, mutta olen juuri aloittanut funktioiden käytön harjoittelemisen. (Huonot sisennykset)
Global blinker, currentuser$, blink, cmd$
ClsColor 0,0,128
Repeat
Color cbwhite
cmdinput()
DrawScreen
Forever
Function cmdinput()
Color cbwhite
Text 3,3,currentuser$+"//"+cmd$
Locate -20,-20
Cmd$=Input("")
If TIMER()>blinker+400 Then
blink=Not blink
blinker=TIMER()
EndIf
If blink Then
Color cbwhite
Box TextWidth(currentuser$+"//"+cmd$)+4,3,7,14
EndIf
EndFunction
Global blinker, currentuser$, blink, cmd$
ClsColor 0,0,128
Repeat
cmdinput()
DrawScreen
Forever
Function cmdinput()
Color cbwhite
Text 3,3,currentuser$+"//"+cmd
Locate -20,-20
Cmd=Input("")
If Timer()>blinker+400 Then
blink=Not blink
blinker=Timer()
EndIf
If blink Then Box TextWidth(currentuser$+"//"+cmd)+4,3,7,14
EndFunction
Samalla parantelin sisennystä.
Last edited by Koodiapina on Fri Aug 22, 2008 2:41 pm, edited 1 time in total.
Global tekstiä As String
tekstiä = "Globaali"
tekstiä$ = "lokaali"
Print tekstiä + " " + tekstiä$
WaitKey
Tossa sun koodissa oli vain se ongelmana, että globaali muuttuja oli cmd ilman dollarimerkkiä, ja sinä käytit cmd-muuttujaa dollarimerkin kanssa. Bugin vika siis.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
<- protestipelikilpailun voittaja. Space War
Taas jatkuu pelinteko ja ongelma syntyi. Ideana on saada hahmo liikkumaan tiettyyn suuntaan (likuhihnan tavoin), jos on tietyllä datanumerossa. Ja tämähän toimii siihen saakka kunnes tulee seuraava tile. Nimittäin silloin se jää siihen tilen reunalle mutta kun painaa kerran menosuuntaan taas likutaan yksi tile ja töks..
On yritetty MoveObjectia ja TranslateObjectia ja vaikka mitä muuta mutta kun ei niin ei. Alla koodinpätkä:
For hihna.LHIHNAT = Each LHIHNAT
If ObjectsOverlap(hihna\obj,pelihahmo) Then
MoveObject pelihahmo, 2 // TranslateObject pelihahmo, 2,0
EndIf
Next hihna
Smuliii wrote:Ideana on saada hahmo liikkumaan tiettyyn suuntaan (likuhihnan tavoin), jos on tietyllä datanumerossa. Ja tämähän toimii siihen saakka kunnes tulee seuraava tile. Nimittäin silloin se jää siihen tilen reunalle mutta kun painaa kerran menosuuntaan taas likutaan yksi tile ja töks..
Kokeileppa muuttaa tarkistus Getmapiksi, eli jos ukon alla on datakerroksen tietty numero, liikutaan vähän eteenpäin. ObjectsOverlap tuskin on paras tapa toteuttaa tätä .
Ratkaisit juuri universaaliongelman! Hienoa, ota keksi.
Filosofia on ajattelun taidetta, mutta sen maalari elää juoden apurahojaan masennukseensa.
If GetMap(3,ObjectX(pelihahmo),ObjectY(pelihahmo)) Then
MoveObject pelihahmo, 2
EndIf
Tai (itse suosittelen ylempää) voisit myös vaihtoehtoisesti käyttää objectrangea hihna\obj-objektin törmäysalueen säätämiseksi (oletan nyt että "media/piste2.png" on aika pieni kuva jonka on tarkoitus olla käytännössä näkymätön, tai ainakaan sen koko ei taida olla sama kuin tilenkoko) Tämä siis hihnan luonnissa "hihna\obj = loadobject(...)" tilalle
elikkä mulla olis sellainen tosi tyhmä kysymys, eli kun otan vaikka learning centeristä ton ammukset 2 ja lisään sinne vihollisen, niin mikä koodi pätkä siihen pitää pistää ,että ammus ei mene vaan läpi vaan esim. vihun hp vähenee.
ei ole toiminut countsollisiont ja objectsoverlapit.