Kiitos luulen, että saan toimimaan.Sly_Jack0 wrote:https://github.com/SlyJack0/CoolTD/blob ... s/tower.CB Tuolta, UpdateTowers()-funktiosta voit katsoa, mitenkä minä tein vastaavan systeemin.
Elikkä siis, jos ei koodista selviä tarpeeksi: tornit ovat TOWER typessä ja niillä on kenttä "targetId". Viholliset ovat typessä ENEMY ja niillä on kenttä "id", johon tallennetaan vihollista luotaessa vihollisen id, joka saadaan ConvertToInteger()-funktiolla. Jos tornilla ei ole vielä kohdetta (targetId = 0), käydään kaikki viholliset läpi ja jos vihollinen on tornin kantaman sisällä asetetaan tornin targetId vihollisen id:ksi (kyseisessä koodissa otetaan huomioon lentvät viholliset, mutta siitä ei tarvitse välittää). Sitten taas, jos tornilla on kohde (targetId <> 0) (ja se on vielä elossa), asetetaan tEnemy.ENEMY osoittamaan kyseiseen instanssiin ENEMY-typessä (ConvertToType()-funktio). Tässä kohdassa hoidetaan sitten tähtäys ja ampuminen. Sitten vielä tarkistetaan, että jos vihollinen on liikkunut tornin kantaman ulkopuolella, asetetaan tornin targetId nollaksi, jolloin se etsii taas uuden kohteen.
Tyhmät kysymykset (I/2011)
Re: Tyhmät kysymykset (I/2011)
Re: Tyhmät kysymykset (I/2011)
Kun yritin tehdä tuohon Tower Defenceen sitä gridiä, huomasin, että gridin ruudut on isompia kuin tornit, vaikka tornien koot on 40x40 ja ruutujen koot 40x40. Mikä vikana?
Re: Tyhmät kysymykset (I/2011)
Ilman koodia kukaan ei pysty muuta kuin arvaamaan. Lähettäisitkö palan sitä? :p
Re: Tyhmät kysymykset (I/2011)
Code: Select all
SCREEN 1024,768,32,0
AAgun_gun=LoadAnimObject("Media/Friendly/AA gun_gun.png",40,40,0,6,90)
ShowObject AAgun_gun,OFF
AAgun_platform=LoadObject("Media/Friendly/AA gun_platform.png",90)
ShowObject AAgun_platform,OFF
repeat
if towertype<>0 then drawgrid() //Jos uutta tornia asetetaan
drawscreen
forever
Function drawgrid()
Color cbwhite
For i=1 To 1024/40
Line i*40,0,i*40,768
Next i
For i=1 To 768/40
Line 0,i*40,1024,i*40
Next i
EndFunction
towernew:
...
//Tehdään uusi torni
newTOWER.TOWER = New(TOWER)
newTOWER\tower=17
newTOWER\platform=CloneObject(AAgun_platform)
newTOWER\gun=CloneObject(AAgun_gun)
newTOWER\hp=50
newTOWER\damage=2
newTOWER\level=1
newTOWER\enemyid=0
newtower\x=MouseX()-(MouseX() Mod 20)-10
newtower\y=MouseY()-(MouseY() Mod 20)-10
newtower\ground=1
newtower\range=100
newtower\frate=200
newtower\lshot=Timer()+200
newtower\id=ConvertToInteger(newtower)
towertype=newtower\id
PositionObject newtower\platform,newtower\x,newtower\y
PositionObject newtower\gun,newtower\x,newtower\y
...
//Jos asettetaan uutta tornia
itower.tower = ConvertToType(towertype)
If MouseWX()>0 Then x=MouseWX()-(MouseWX() Mod 20)+10
If MouseWX()<-1 Then x=MouseWX()-(MouseWX() Mod 20)-10
If MouseWY()>0 Then y=MouseWY()-(MouseWY() Mod 20)+10
If MouseWY()<-1 Then y=MouseWY()-(MouseWY() Mod 20)-10
itower\x=x
itower\y=y
PositionObject itower\platform,itower\x,itower\y
PositionObject itower\gun,itower\x,itower\y
If MouseHit(2) Or showmain=1 Then
DeleteObject itower\gun
DeleteObject itower\platform
Delete itower
towertype=0
UpdateGame()
EndIf
...
Return
Re: Tyhmät kysymykset (I/2011)
Tervepä taas. Yritän saada kahta (tyypeillä luotua) vihollisjoukkuetta sotimaan keskenään, mutta kun hahmo huomaa vihollisen se käytännössä alkaa hyppiä seinille (yrittää ilmeisesti tähdätä kaikkiin vihuihin kerralla). Miten saisin hahmon kohdistamaan huomionsa ainoastaan yhteen viholliseen, esimerkiksi lähimpään, kerralla?
Koodiviritelmäni menee pelkistettynä näin:
Koodiviritelmäni menee pelkistettynä näin:
Code: Select all
If ObjectSight(vihu\obj,vihu2\obj) then vihu\alert=1
If vihu\alert=1 then PointObject vihu\obj,vihu2\obj:MoveObject vihu\obj,3
Re: Tyhmät kysymykset (I/2011)
Käy kaikki vihulaisobjektit läpi ja vertaa vihujen ja pelaajan välisiä etäisyyksiä. Aina kun lyhyempi etäisyys löytyy, tallenna muistiin viittaus tyypin jäseneen. Etäisyyksien tarkastelun jälkeen tähtää vain lähimpään viholliseen.Noun wrote:Tervepä taas. Yritän saada kahta (tyypeillä luotua) vihollisjoukkuetta sotimaan keskenään, mutta kun hahmo huomaa vihollisen se käytännössä alkaa hyppiä seinille (yrittää ilmeisesti tähdätä kaikkiin vihuihin kerralla). Miten saisin hahmon kohdistamaan huomionsa ainoastaan yhteen viholliseen, esimerkiksi lähimpään, kerralla?
Tämän tyylisesti:
Code: Select all
etaisyys# = -1.0
lahinvihu = 0
For iVihu.VIHUT = Each VIHUT
tmpEtaisyys# = Distance2( iVihu\obj, pelaaja_obj )
If etaisyys < 0.0 Then
// Otetaan talteen ensimmäinen etäisyys
etaisyys = tmpEtaisyys
// ...ja viittaus tyypin jäseneen
lahinvihu = ConvertToInteger(iVihu)
ElseIf tmpEtaisyys < etaisyys
// Löydettiin lyhyemmältä matkalta vihu
etaisyys = tmpEtaisyys
// Otetaan talteen viittaus
lahinvihu = ConvertToInteger(iVihu)
EndIf
Next iVihu
// Tarkistetaan, onko meillä vihua
If lahinvihu <> 0 Then
// Muunnetaan lahinvihu osoittimeksi tiettyyn VIHUT-kokoelman jäseneen
iLahinVihu.VIHUT = ConvertToInteger( lahinvihu )
// Käännetään pelaaja osoittamaan kyseiseen vihuun
PointObject pelaaja_obj, iLahinVihu\obj
EndIf
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Re: Tyhmät kysymykset (I/2011)
Voisi olla myös fiksua, että lähin vihollinen haettaisiin vain silloin kun pitäisi päättää mihin tähdätään. Luulen, että voisi olla nopeampaa, että jokaisella vihollisella olisi tiedossa oma kohteensa jota ammuttaisiin kunnes se kuolisi. Silloin tuollainen selaaminen jäisi paljon vähemmälle ja ukkeleiden käytöskään ei varmaan olisi niin hölmöä(?).VesQ wrote:Käy kaikki vihulaisobjektit läpi ja vertaa vihujen ja pelaajan välisiä etäisyyksiä. Aina kun lyhyempi etäisyys löytyy, tallenna muistiin viittaus tyypin jäseneen. Etäisyyksien tarkastelun jälkeen tähtää vain lähimpään viholliseen.Noun wrote:Tervepä taas. Yritän saada kahta (tyypeillä luotua) vihollisjoukkuetta sotimaan keskenään, mutta kun hahmo huomaa vihollisen se käytännössä alkaa hyppiä seinille (yrittää ilmeisesti tähdätä kaikkiin vihuihin kerralla). Miten saisin hahmon kohdistamaan huomionsa ainoastaan yhteen viholliseen, esimerkiksi lähimpään, kerralla?
Tämän tyylisesti:Jotta saisit tuon toimimaan siis sitten kahdelle kokoelmalle vihollisia, niin saat hieman säätää sisäkkäisten silmukoiden kanssa. ezben Type-tutoriaalista löytyy hyvät vinkit tuolle läpikäymiselle - ettei tarvitsisi kaikkia objekteja käydä kahteen kertaan läpi turhaan kahdessa sisäkkäisessä For...next-silmukassa.Code: Select all
etaisyys# = -1.0 lahinvihu = 0 For iVihu.VIHUT = Each VIHUT tmpEtaisyys# = Distance2( iVihu\obj, pelaaja_obj ) If etaisyys < 0.0 Then // Otetaan talteen ensimmäinen etäisyys etaisyys = tmpEtaisyys // ...ja viittaus tyypin jäseneen lahinvihu = ConvertToInteger(iVihu) ElseIf tmpEtaisyys < etaisyys // Löydettiin lyhyemmältä matkalta vihu etaisyys = tmpEtaisyys // Otetaan talteen viittaus lahinvihu = ConvertToInteger(iVihu) EndIf Next iVihu // Tarkistetaan, onko meillä vihua If lahinvihu <> 0 Then // Muunnetaan lahinvihu osoittimeksi tiettyyn VIHUT-kokoelman jäseneen iLahinVihu.VIHUT = ConvertToInteger( lahinvihu ) // Käännetään pelaaja osoittamaan kyseiseen vihuun PointObject pelaaja_obj, iLahinVihu\obj EndIf
Re: Tyhmät kysymykset (I/2011)
Nyt tuli yksinkertaiselta kuulostava ongelma. Miten saan laskettua onko piste henkilön/objectin näköalueella 3d-maailmassa? Henkilö/objecti voi olla kääntyneenä mihin suuntaan tahansa.
Laitoin tähän kuvan havainnollistamaan asiaa. Punaiset viivat rajaavat näköalueen. Musta on henkilö/objecti. Pitäisi laskea onko vihreä piste näköalueella. Kuva on 2d....
Laitoin tähän kuvan havainnollistamaan asiaa. Punaiset viivat rajaavat näköalueen. Musta on henkilö/objecti. Pitäisi laskea onko vihreä piste näköalueella. Kuva on 2d....
EDIT:
Tiedän pisteen ja henkilön sijainnin. Tiedän myös henkilön kulman suhteessa y-akseliin.
EDIT:
Selkeennetty laskutapa voi riittä
- Attachments
-
- nimetön.png (5.27 KiB) Viewed 15759 times
Re: Tyhmät kysymykset (I/2011)
Onnistuisikohan sillälailla että tekisit suunta vektorin katselevasta kohteeseen (miinustat paikat toisistaan) ja vertaat sitä katselusuunnan vektoriin ja jos niiden kahden ero on pienempi kuin joku tietty arvo niin kohde on näkökentässä.legend wrote:Nyt tuli yksinkertaiselta kuulostava ongelma. Miten saan laskettua onko piste henkilön/objectin näköalueella 3d-maailmassa? Henkilö/objecti voi olla kääntyneenä mihin suuntaan tahansa.
Laitoin tähän kuvan havainnollistamaan asiaa. Punaiset viivat rajaavat näköalueen. Musta on henkilö/objecti. Pitäisi laskea onko vihreä piste näköalueella. Kuva on 2d....EDIT:Tiedän pisteen ja henkilön sijainnin. Tiedän myös henkilön kulman suhteessa y-akseliin.
EDIT:Selkeennetty laskutapa voi riittä
Re: Tyhmät kysymykset (I/2011)
Täältä voisit löytää jonkinmoisen selityksen tuon toteuttamiseen, jos englanti ei hirvitä.
http://www.flipcode.com/archives/Frustum_Culling.shtml
Saat kyllä säätää 3D-vektoreiden kanssa, jos CB:n puolella meinaat tuon toteuttaa.
http://www.flipcode.com/archives/Frustum_Culling.shtml
Saat kyllä säätää 3D-vektoreiden kanssa, jos CB:n puolella meinaat tuon toteuttaa.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Tyhmät kysymykset (I/2011)
Jos katseen suunta on yksinkertaisesti vektori, voit normalisoida sen ja kappaleiden välisen vektorin ja niiden pistetulosta (eli välisen kulman kosinista) päätellä onko kappale näkyvissä. Tällöin näkökenttä on suoran ympyräkartion muotoinen, joten jos haluat muun muotoisen, joudut käyttämään eri tapaa, mutta tällä selviää varsin vähillä ja helpoilla laskuilla :)
Re: Tyhmät kysymykset (I/2011)
Asensin eilen CoolBasicin WIN7 koneelle mutta kun kokeilin tälläistä koodinpätkää:
Niin tuli virheilmoitus:
Painan ok:ta ja
Code: Select all
Print "HelloWorld"
WaitKey
Aloittelija koodari joka
KOTISIVU
Re: Tyhmät kysymykset (I/2011)
Ensimmäinen viesti toinen kohta...Laurenzo wrote:Asensin eilen CoolBasicin WIN7 koneelle mutta kun kokeilin tälläistä koodinpätkää:Niin tuli virheilmoitus:Code: Select all
Print "HelloWorld" WaitKey
Re: Tyhmät kysymykset (I/2011)
kitooslegend wrote:Ensimmäinen viesti toinen kohta...Laurenzo wrote:Asensin eilen CoolBasicin WIN7 koneelle mutta kun kokeilin tälläistä koodinpätkää:Niin tuli virheilmoitus:Code: Select all
Print "HelloWorld" WaitKey
Aloittelija koodari joka
KOTISIVU
Re: Tyhmät kysymykset (I/2011)
haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
Re: Tyhmät kysymykset (I/2011)
OpenToRead, ReadLine ja esimerkiksi GetWord. Näillä komennoilla ainakin onnistuu.äijä wrote:haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
Re: Tyhmät kysymykset (I/2011)
Lue while not eof(tiedosto)- wend silmukassa rivi tiedostostasi jokaisen lukemisen jälkeen tarkasta instr:llä kumpi on kyseessä ikä vai nimi. Ja sitte vaan poistat sen alun siitä rivistä.äijä wrote:haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
Esim.
Code: Select all
Dim etsityt(1) as string
While Not EOF(file)
f$=Lower(ReadLine(file))
If InStr(Lower(f$),"nimi") Then
etsitty(0)=Right(f$,Len(f$)-InStr(f$,"nimi")-4)
ElseIf InStr(Lower(f$),"ikä") Then
etsitty(1)=Right(f$,Len(f$)-InStr(f$,"ikä")-4)
EndIf
Wend
Re: Tyhmät kysymykset (I/2011)
En suosittele tuollaista taktiikkaa, sillä esimerkiksi jos nimeksi laittaa "ikä" niin systeemi voi mennä sekaisin. Helpompaa ja kätevämpää on "katkaista" rivit GetWordin avulla käyttäen erottimena "=" - merkkiä. Jolloin automaattisesti ensimmäinen sana on avain ja toinen sen arvo. Luonnollisesti molemmat kannattaa käsitellä Trim:in avulla että välilyönnit eivät tulisi mukaan. Tähän on muutama erilainen toteutuskin jo valmiiksi toteutettuna: Minun versioni ja MaGetzUbin versiojaahas wrote:Lue while not eof(tiedosto)- wend silmukassa rivi tiedostostasi jokaisen lukemisen jälkeen tarkasta instr:llä kumpi on kyseessä ikä vai nimi. Ja sitte vaan poistat sen alun siitä rivistä.äijä wrote:haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
Esim.Code: Select all
Dim etsityt(1) as string While Not EOF(file) f$=Lower(ReadLine(file)) If InStr(Lower(f$),"nimi") Then etsitty(0)=Right(f$,Len(f$)-InStr(f$,"nimi")-4) ElseIf InStr(Lower(f$),"ikä") Then etsitty(1)=Right(f$,Len(f$)-InStr(f$,"ikä")-4) EndIf Wend
Re: Tyhmät kysymykset (I/2011)
Helpointahan tietysti on vain kirjoittaa tekstitiedostoon kaikki arvot jossain tietyssä järjestyksessä, ja lukea ne sieltä aina siinä samassa järjestyksessä. Näin minä olen toteuttanut mm. Ultimate Stickfigure Gamen leveleditorin.
-
- Devoted Member
- Posts: 594
- Joined: Tue Sep 30, 2008 4:30 pm
- Location: Ruudun toisella puolella
Re: Tyhmät kysymykset (I/2011)
luulen että tässä on kyse enemän selkokielellä tehtävistä asetuksista tekstitiedostoon. Helppoahan Chaoswormin tapa on, muttei siitä tekstitiedostosta saa silloin selvää.