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ää:

Code: Select all

Print "HelloWorld"
WaitKey
Niin tuli virheilmoitus:
eitoimi1.jpg
eitoimi1.jpg (18.52 KiB) Viewed 15614 times
Painan ok:ta ja
eitoimi2.jpg
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ää:

Code: Select all

Print "HelloWorld"
WaitKey
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ää:

Code: Select all

Print "HelloWorld"
WaitKey
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ää.