Page 46 of 50
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Oct 11, 2011 3:17 pm
by jaahas
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.
Kiitos luulen, että saan toimimaan.
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Oct 18, 2011 11:30 pm
by jaahas
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)
Posted: Wed Oct 19, 2011 1:01 am
by temu92
Ilman koodia kukaan ei pysty muuta kuin arvaamaan. Lähettäisitkö palan sitä? :p
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Oct 19, 2011 10:59 am
by jaahas
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
Kuvien koot on 40x40, mutta pelissä ne on 39x39. Aiheuttaako tuo "SCREEN" sen?
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Oct 19, 2011 8:59 pm
by Noun
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:
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)
Posted: Wed Oct 19, 2011 9:38 pm
by valscion
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?
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.
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
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.
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Oct 19, 2011 11:41 pm
by Latexi95
VesQ wrote: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?
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.
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
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.
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öä(?).
Re: Tyhmät kysymykset (I/2011)
Posted: Fri Oct 28, 2011 9:28 am
by legend
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)
Posted: Fri Oct 28, 2011 10:14 am
by Latexi95
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ä
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ä.
Re: Tyhmät kysymykset (I/2011)
Posted: Fri Oct 28, 2011 10:27 am
by valscion
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.
Re: Tyhmät kysymykset (I/2011)
Posted: Mon Oct 31, 2011 5:06 pm
by koodaaja
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)
Posted: Tue Nov 01, 2011 7:26 am
by Laurenzo
Asensin eilen CoolBasicin WIN7 koneelle mutta kun kokeilin tälläistä koodinpätkää:
Niin tuli virheilmoitus:
- eitoimi1.jpg (18.52 KiB) Viewed 15614 times
Painan ok:ta ja
- eitoimi2.jpg (12.6 KiB) Viewed 15614 times
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Nov 01, 2011 8:35 am
by legend
Laurenzo wrote:Asensin eilen CoolBasicin WIN7 koneelle mutta kun kokeilin tälläistä koodinpätkää:
Niin tuli virheilmoitus:
Ensimmäinen viesti toinen kohta...
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Nov 01, 2011 2:40 pm
by Laurenzo
legend wrote:Laurenzo wrote:Asensin eilen CoolBasicin WIN7 koneelle mutta kun kokeilin tälläistä koodinpätkää:
Niin tuli virheilmoitus:
Ensimmäinen viesti toinen kohta...
kitoos
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Nov 02, 2011 4:56 pm
by äijä
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)
Posted: Wed Nov 02, 2011 5:13 pm
by Viltzu
äijä wrote:haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
OpenToRead, ReadLine ja esimerkiksi GetWord. Näillä komennoilla ainakin onnistuu.
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Nov 02, 2011 5:16 pm
by jaahas
äijä wrote:haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
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ä.
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)
Posted: Wed Nov 02, 2011 7:03 pm
by Latexi95
jaahas wrote:äijä wrote:haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
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ä.
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
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 versio
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Nov 02, 2011 7:43 pm
by Awaclus
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.
Re: Tyhmät kysymykset (I/2011)
Posted: Thu Nov 03, 2011 7:53 am
by Wingman
luulen että tässä on kyse enemän selkokielellä tehtävistä asetuksista tekstitiedostoon. Helppoahan Chaoswormin tapa on, muttei siitä tekstitiedostosta saa silloin selvää.