Tyhmät kysymykset (I/2011)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
jaahas
Advanced Member
Posts: 307
Joined: Fri Feb 05, 2010 11:36 pm
Location: Tornio

Re: Tyhmät kysymykset (I/2011)

Post 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.
jaahas
Advanced Member
Posts: 307
Joined: Fri Feb 05, 2010 11:36 pm
Location: Tornio

Re: Tyhmät kysymykset (I/2011)

Post 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?
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by temu92 »

Ilman koodia kukaan ei pysty muuta kuin arvaamaan. Lähettäisitkö palan sitä? :p
jaahas
Advanced Member
Posts: 307
Joined: Fri Feb 05, 2010 11:36 pm
Location: Tornio

Re: Tyhmät kysymykset (I/2011)

Post 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?
User avatar
Noun
Newcomer
Posts: 19
Joined: Sun May 08, 2011 8:17 pm
Contact:

Re: Tyhmät kysymykset (I/2011)

Post 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
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2011)

Post 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.
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
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post 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öä(?).
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Tyhmät kysymykset (I/2011)

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

Attachments
nimetön.png
nimetön.png (5.27 KiB) Viewed 15707 times
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post 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ä.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2011)

Post 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.
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
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset (I/2011)

Post 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 :)
User avatar
Laurenzo
Member
Posts: 85
Joined: Mon Apr 25, 2011 8:28 am
Location: Tampere
Contact:

Re: Tyhmät kysymykset (I/2011)

Post 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 15560 times
Painan ok:ta ja
eitoimi2.jpg
eitoimi2.jpg (12.6 KiB) Viewed 15560 times
Aloittelija koodari joka
osaa jo jotain (ehkä) :)
KOTISIVU
legend
Advanced Member
Posts: 371
Joined: Wed Nov 18, 2009 8:06 pm

Re: Tyhmät kysymykset (I/2011)

Post 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...
User avatar
Laurenzo
Member
Posts: 85
Joined: Mon Apr 25, 2011 8:28 am
Location: Tampere
Contact:

Re: Tyhmät kysymykset (I/2011)

Post 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 :)
Aloittelija koodari joka
osaa jo jotain (ehkä) :)
KOTISIVU
äijä

Re: Tyhmät kysymykset (I/2011)

Post by äijä »

haluasin tietää miten pystyy lukemaan .txt tiedostosta esim. nimi=äijä ikä=22 ja laittaa ne muuttujaan ilman tuota nimi= ja ikä=
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tyhmät kysymykset (I/2011)

Post 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.
jaahas
Advanced Member
Posts: 307
Joined: Fri Feb 05, 2010 11:36 pm
Location: Tornio

Re: Tyhmät kysymykset (I/2011)

Post 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
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post 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
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post 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.
Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Tyhmät kysymykset (I/2011)

Post 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ää.
- - - -
Locked