Tyhmät kysymykset (I/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
Eräs Vierailija

Re: Tyhmät kysymykset

Post by Eräs Vierailija »

bool cppNerd=!false; wrote:Tällä tavalla:

Code: Select all

Dim bx1,by1,bx2,by2,check,nbx1,nby1,nbx2,nby2

Repeat

    // muuta koodia...
    
    If check = 0 Then
        If MouseDown(1) Then 
            check = 1
            bx1 = MouseX()
            by1 = MouseY()
        End If
    ElseIf check = 1 Then
        If MouseDown(1) = 0 Then 
            check = 0
        Else
            bx2 = MouseX()
            by2 = MouseY()
            
            nbx1 = bx1
            nby1 = by1
            nbx2 = bx2
            nby2 = by2
            
            If bx1 > bx2 Then
                nbx1 = nbx1 + nbx2
                nbx2 = nbx1 - nbx2
                nbx1 = nbx1 - nbx2
            End If
            
            If by1 > by2 Then
                nby1 = nby1 + nby2
                nby2 = nby1 - nby2
                nby1 = nby1 - nby2            
            End If
            
            Box nbx1,nby1,nbx2-nbx1,nby2-nby1,0
        End If
    End If

    DrawScreen
Forever
Yksiköiden valinnan teko riippuu siitä miten olet ne tehnyt. Tuskin kuitenkaan on liian hankalaa käydä kaikki yksiköt läpi ja katsoa, mitkä niistä ovat laatikon sisällä, kun hiirennappi nostetaan, eli esimerkkini rivien 14 ja 16 sisällä.
Okei. Kiitoksia.
Eräs Vierailija

Re: Tyhmät kysymykset

Post by Eräs Vierailija »

Eräs Vierailija wrote:
bool cppNerd=!false; wrote:Tällä tavalla:

Code: Select all


Yksiköiden valinnan teko riippuu siitä miten olet ne tehnyt. Tuskin kuitenkaan on liian hankalaa käydä kaikki yksiköt läpi ja katsoa, mitkä niistä ovat laatikon sisällä, kun hiirennappi nostetaan, eli esimerkkini rivien 14 ja 16 sisällä.
Okei. Kiitoksia.
Äh, tuli nyt vielä tälläinen probleema että laitetaanko ukkojen valinta noilla nbx-jutuilla sitten näin? Ainakaan se ei toimi...

Code: Select all

 
If ObjectX(solttu\obj)<nbx2 And ObjectX(solttu\obj)>nbx2-nbx1 And ObjectY(solttu\obj)<nby2 And ObjectY(solttu\obj)>nby2-nby1 Then
      solttu\valittu=1
EndIf
Alligaattori
Active Member
Posts: 135
Joined: Fri Mar 07, 2008 8:49 pm

Re: Tyhmät kysymykset

Post by Alligaattori »

Pienempi kuin ja suurempi kuin -operaattorit taitavat olla väärin päin. Muutenkin tulisi ongelmaa, koska objekteja käsitellään maailmakoordinaattien mukaan, mutta näyttämäni valintalaatikko toimii näyttökoordinaattien mukaan. Voin tehdä muutoksen, kun ehdin.
Eräs Vierailija

Re: Tyhmät kysymykset

Post by Eräs Vierailija »

bool cppNerd=!false; wrote:Pienempi kuin ja suurempi kuin -operaattorit taitavat olla väärin päin. Muutenkin tulisi ongelmaa, koska objekteja käsitellään maailmakoordinaattien mukaan, mutta näyttämäni valintalaatikko toimii näyttökoordinaattien mukaan. Voin tehdä muutoksen, kun ehdin.
Juu, olisin todella kiitollinen tuosta avusta. Korjasin nuo <:t ja >:t nyt oikein päin.
Alligaattori
Active Member
Posts: 135
Joined: Fri Mar 07, 2008 8:49 pm

Re: Tyhmät kysymykset

Post by Alligaattori »

Tässä on lupaamani versio.

Code: Select all

    Dim bx1,by1,bx2,by2,check,nbx1,nby1,nbx2,nby2

    Repeat
    
        DrawToWorld 1

        // muuta koodia...
       
        If check = 0 Then
            If MouseDown(1) Then
                check = 1
                bx1 = MouseWX()
                by1 = MouseWY()
            End If
        ElseIf check = 1 Then
            If MouseDown(1) = 0 Then
                check = 0
            Else
                bx2 = MouseWX()
                by2 = MouseWY()
               
                nbx1 = bx1
                nby1 = by1
                nbx2 = bx2
                nby2 = by2
               
                If bx1 > bx2 Then
                    nbx1 = nbx1 + nbx2
                    nbx2 = nbx1 - nbx2
                    nbx1 = nbx1 - nbx2
                End If
               
                If by1 < by2 Then
                    nby1 = nby1 + nby2
                    nby2 = nby1 - nby2
                    nby1 = nby1 - nby2           
                End If
               
                Box nbx1,nby1,nbx2-nbx1,-nby2+nby1,0
            End If
        End If

        DrawScreen
    Forever
Tein muutoksia vain riveille 12, 13, 19, 20, 33 ja 39 ja niihinkin lisäilin tai vaihdoin yksittäisiä merkkejä.
Eräs Vierailija

Re: Tyhmät kysymykset

Post by Eräs Vierailija »

Selvä, kiitoksia paljon :D
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Tyhmät kysymykset

Post by DatsuniG »

ONGELMA RATKAISTU
Last edited by DatsuniG on Tue Sep 09, 2008 5:10 pm, edited 3 times in total.
Hengität nyt manuaalisesti.
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Tyhmät kysymykset

Post by otto90x »

nyt sattu juhaa leukaan wrote:
Koodi toimi vai loopin sisälle laitettuna, jolloin peli hidastui diashowksi.(siis omaan peliin sovellettuna^^)
Noo joko teit sen jotenkin väärin tai sitten sinulla on liikaa törmääviä objekteja. CoolBasic kun ei tunnetusti ole niin hirveän nopea. Siis tuo törmäysten asettaminen tulee tehdä vain kerran, ei loopissa.

Siis näin

Code: Select all

SCREEN 1024,768

Type vihu
    Field obj
End Type


mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF

For i=1 To 30
    v.vihu=New(vihu)
    v\obj=CloneObject(mastervihu)
Next i


//tässä asetetaan törmäykset kaikille äsken luoduille vihuille
For v.vihu=Each vihu //Käydään lista läpi

    vv.vihu=First(vihu) // otetaan vv muuttujaan ensimmäisen vihun osoitin
    vv=After(v) // vaihdetaan se niin että se on v muuttujan jälkeisen vihun osoitin
    While vv<>NULL //jatketaan kunnes vv on käynyt listan läpi
   
        SetupCollision vv\obj,v\obj,2,2,2//asetetaan törmäykset
        SetupCollision v\obj,vv\obj,2,2,2
        vv=After(vv) //vaihdetaan taas vv muuttujaa siten että siinä on seuraavan vihun osoitin
    Wend
   
Next v

//Eli jos ajatellaan että vihuja on 3
// tällöin vihujen lista on 1 2 3
//siis ensin asetetaan törmäys 1 ja 2 välillä sitten 1 ja kolmosen välillä
// sitten vasta siirrytään kakkosen ja asetataan törmäys sen ja kolmosen välille

//tällöin säästetään hieman resursseja


DrawToWorld ON


Repeat

    Circle -200,200,400,0
   

    For v.vihu=Each vihu
        MoveObject v\obj,3
        If Rand(20)=5 Then TurnObject v\obj,Rand(-60,60)
        If Distance(ObjectX(v\obj),ObjectY(v\obj),0,0)>200 Then RotateObject v\obj,GetAngle(ObjectX(v\obj),-ObjectY(v\obj),0,0)
    Next v



    DrawScreen

Forever
Eikä näin

Code: Select all

SCREEN 1024,768

Type vihu
    Field obj
End Type


mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF

For i=1 To 30
    v.vihu=New(vihu)
    v\obj=CloneObject(mastervihu)
Next i




DrawToWorld ON


Repeat

        //tässä asetetaan törmäykset kaikille äsken luoduille vihuille
    For v.vihu=Each vihu //Käydään lista läpi
    
        vv.vihu=First(vihu) // otetaan vv muuttujaan ensimmäisen vihun osoitin
        vv=After(v) // vaihdetaan se niin että se on v muuttujan jälkeisen vihun osoitin
        While vv<>NULL //jatketaan kunnes vv on käynyt listan läpi
       
            SetupCollision vv\obj,v\obj,2,2,2//asetetaan törmäykset
            SetupCollision v\obj,vv\obj,2,2,2
            vv=After(vv) //vaihdetaan taas vv muuttujaa siten että siinä on seuraavan vihun osoitin
        Wend
       
    Next v
    
    //Eli jos ajatellaan että vihuja on 3
    // tällöin vihujen lista on 1 2 3
    //siis ensin asetetaan törmäys 1 ja 2 välillä sitten 1 ja kolmosen välillä
    // sitten vasta siirrytään kakkosen ja asetataan törmäys sen ja kolmosen välille
    
    //tällöin säästetään hieman resursseja


    

    Circle -200,200,400,0
   

    For v.vihu=Each vihu
        MoveObject v\obj,3
        If Rand(20)=5 Then TurnObject v\obj,Rand(-60,60)
        If Distance(ObjectX(v\obj),ObjectY(v\obj),0,0)>200 Then RotateObject v\obj,GetAngle(ObjectX(v\obj),-ObjectY(v\obj),0,0)
    Next v



    DrawScreen

Forever
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
nyt sattu juhaa leukaan

Re: Tyhmät kysymykset

Post by nyt sattu juhaa leukaan »

nyt sattu juhaa leukaan wrote:
Koodi toimi vai loopin sisälle laitettuna, jolloin peli hidastui diashowksi.(siis omaan peliin sovellettuna^^)



Noo joko teit sen jotenkin väärin tai sitten sinulla on liikaa törmääviä objekteja. CoolBasic kun ei tunnetusti ole niin hirveän nopea. Siis tuo törmäysten asettaminen tulee tehdä vain kerran, ei loopissa.

Siis näin

Code: Select all
SCREEN 1024,768

Type vihu
Field obj
End Type


mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF

For i=1 To 30
v.vihu=New(vihu)
v\obj=CloneObject(mastervihu)
Next i


//tässä asetetaan törmäykset kaikille äsken luoduille vihuille
For v.vihu=Each vihu //Käydään lista läpi

vv.vihu=First(vihu) // otetaan vv muuttujaan ensimmäisen vihun osoitin
vv=After(v) // vaihdetaan se niin että se on v muuttujan jälkeisen vihun osoitin
While vv<>NULL //jatketaan kunnes vv on käynyt listan läpi

SetupCollision vv\obj,v\obj,2,2,2//asetetaan törmäykset
SetupCollision v\obj,vv\obj,2,2,2
vv=After(vv) //vaihdetaan taas vv muuttujaa siten että siinä on seuraavan vihun osoitin
Wend

Next v

//Eli jos ajatellaan että vihuja on 3
// tällöin vihujen lista on 1 2 3
//siis ensin asetetaan törmäys 1 ja 2 välillä sitten 1 ja kolmosen välillä
// sitten vasta siirrytään kakkosen ja asetataan törmäys sen ja kolmosen välille

//tällöin säästetään hieman resursseja


DrawToWorld ON


Repeat

Circle -200,200,400,0


For v.vihu=Each vihu
MoveObject v\obj,3
If Rand(20)=5 Then TurnObject v\obj,Rand(-60,60)
If Distance(ObjectX(v\obj),ObjectY(v\obj),0,0)>200 Then RotateObject v\obj,GetAngle(ObjectX(v\obj),-ObjectY(v\obj),0,0)
Next v



DrawScreen

Forever



Eikä näin

Code: Select all
SCREEN 1024,768

Type vihu
Field obj
End Type


mastervihu=LoadObject("media/guy.bmp",36)
ShowObject mastervihu,OFF

For i=1 To 30
v.vihu=New(vihu)
v\obj=CloneObject(mastervihu)
Next i




DrawToWorld ON
Tajusin vihdoin mikä mättää. Vihuja luodaan loopissa kokoajan uusia, jolloin törmäys pätee vain kun sen laittaa loopin sisälle!

oman koodin ongelmapätkä

Code: Select all

Type VIHU
    Field obj
    Field health
End Type

mvihu=LoadObject("Media\zombi.bmp",360)
ShowObject mvihu,OFF

uus = 30

ukko = LoadObject("media\soldier.bmp",360)
PositionObject ukko,0,200

aim=LoadObject("Media\crosshair.bmp")

repeat

    PositionObject aim,MouseWX(),MouseWY()
    PointObject ukko, aim
    
    If KeyDown(cbkeyw) Then MoveObject ukko, 3
    If KeyDown(cbkeys) Then MoveObject ukko, -3
    If KeyDown(cbkeyd) Then MoveObject ukko, 0, 3
    If KeyDown(cbkeya) Then MoveObject ukko, 0, -3
        
    If ObjectX(ukko)<-500 Then PositionObject ukko,-500,ObjectY(ukko)
    If ObjectX(ukko)>500 Then PositionObject ukko,500,ObjectY(ukko)
    If ObjectY(ukko)<-400 Then PositionObject ukko,ObjectX(ukko),-400
    If ObjectY(ukko)>400 Then PositionObject ukko,ObjectX(ukko),400

    If uus=0 Then
        v.VIHU = New (VIHU)
        v\obj = CloneObject (mvihu)
        uus = 30
        v\health = 2
        ScreenPositionObject v\obj,Rand(ScreenHeight()),Rand(ScreenWidth())
    EndIf
   
    uus = uus-1 

forever
nyt sattu juhaa leukaan

Re: Tyhmät kysymykset

Post by nyt sattu juhaa leukaan »

sori, tuli pitkä...-.-...
Jonhu
Active Member
Posts: 186
Joined: Mon Aug 04, 2008 5:45 pm

Re: Tyhmät kysymykset

Post by Jonhu »

Sain tehtyä jonkinlaisen ristinollapelin, mutta huomasin, että hyvän tekoälyn kehittäminen on todella monimutkaista. Joten päätin aloittaa neljänsuoralla, mutta tuli pieni pulma.. Pitäisi saada tämä koodi toimimaan, että ympyröiden värit säilyisivät oikein (muutakin hienosäätöä vielä puuttuu).

Code: Select all

SCREEN 800,600
FrameLimit 40 'rajoita nopeutta
alku:
Dim ruudukko(100,100)
Const ympkoko=60
ClsColor cbblack
turn_mem=1
Repeat 
    turn=turn_mem
    For x=0 To 10
        For y=0 To 7
            Color cbwhite
            If ruudukko(x,y)=0 Then
                Circle 12+x*65+ympkoko/2,12+y*65+ympkoko/2,ympkoko
                Box 10+x*65+ympkoko/2,10+y*65+ympkoko/2,65,65,0
            ElseIf ruudukko(x,y)=1 Then
                Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
                Color cbblue
                Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
            ElseIf ruudukko(x,y)=2 Then
                Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
                Color cbred
                Circle 10+x*65+ympkoko/2,10+y*65+ympkoko/2,ympkoko
            EndIf
            If MouseX()>40+(x)*65 And MouseX()<40+(x)*65+65 Then
            'If BoxOverlap(MouseX(),MouseY(),1,1,40+(x)*65,1,1000,65) Then
                If turn=1
                    Color cbblue
                Else
                    Color cbred
                EndIf
                Circle 40+(x)*65,12+(x),65
                If MouseUp(1) Then
                    a=7
                    While a>0
                        If ruudukko(x,(a-y))=0 Then 
                            If turn=1 'And ruudukko(x,(a-y))=0 Then
                                ruudukko(x,a)=1 
                                turn_mem=2
                                Exit
                            ElseIf turn=2 Then
                                ruudukko(x,a)=2
                                turn_mem=1
                                Exit
                            EndIf
                        Else 
                            a=a-1
                        EndIf
                   Wend
                EndIf 
            EndIf
        Next y
    Next x
    DrawScreen
Forever
kyssärimies

Re: Tyhmät kysymykset

Post by kyssärimies »

Terve,

Saako tiedostosta luetun ja ruudulle tulostetun tekstin pysymään jotenkin vaikka jos laittaa loopin ja drawscreenin??

Tällain

Code: Select all

While Not EOF(f)
        
        Text 0,textline,ReadLine(f)
        textline=textline+12 
       
Wend
ku tekee ja sitte pistää drawscreenin ni teksti katoaa.
Alligaattori
Active Member
Posts: 135
Joined: Fri Mar 07, 2008 8:49 pm

Re: Tyhmät kysymykset

Post by Alligaattori »

Laita näin.

Code: Select all

While Not EOF(f)
       
        AddText ReadLine(f)

        DrawScreen
       
Wend
kyssärimies

Re: Tyhmät kysymykset

Post by kyssärimies »

bool cppNerd=!false; wrote:Laita näin.

Code: Select all

While Not EOF(f)
       
        AddText ReadLine(f)

        DrawScreen
       
Wend

Kiitos paljon, toimii :)

Ajatuksenani oli yrittää saada luotua vähän nethack tyyliseen peliin kartat suoraan notepadilla :D

Mutta ei taida taidot riittää, ongelmaksi muodostuu nyt törmäykset... eli jos vaikka # on puu niin miten voi tietää missä kaikkialla # on jotta voisi estää hahmoa liikkumasta siihen kohtaan... vaikeaa. :P
jack-ass

Re: Tyhmät kysymykset

Post by jack-ass »

Miten on mahdollista saada vihuja spawnaamaan randomilla tiettyyn paikkaan?

näinkö? tai yms...?

Code: Select all

  If uus=0 Then
        v.VIHU = New (VIHU)
        v\obj = CloneObject (mvihu)
        uus = 25
        PositionObject v\obj,Rand 100-200,Rand 100-200
Alligaattori
Active Member
Posts: 135
Joined: Fri Mar 07, 2008 8:49 pm

Re: Tyhmät kysymykset

Post by Alligaattori »

EDIT:

Katso CBSDK:sta SpawnObject. Jos sinulla ei ole sitä, tässä on linkki

jack-ass

Re: Tyhmät kysymykset

Post by jack-ass »

eli näin...?

Code: Select all

    If uus=0 Then
        v.VIHU = New (VIHU)
        v\obj = CloneObject (mvihu)
        uus = 25
        SetupCollision v\obj,kartta,1,4,2
        SetupCollision kartta,v\obj,1,4,2

Function SpawnObject(v\obj)
    // Loopataan niin kauan että sopiva paikka kartalta löytyy.
    While True
        // Ensin arvotaan x ja y.
        x = Rand(1, MapWidth())
        y = Rand(1, MapHeight())
       
        // Tutkitaan back- ja hit-kerosten tilet arvotusta paikasta.
        tBack = GetMap2(0, x, y)
        tHit = GetMap2(2, x, y)
        // back-kerroksessa pitää olla jotain mutta hit-kerroksessa ei saa olla mitään.
        If tBack > 0 And tHit = 0 Then
            // Jos ehto täyttyi niin sijoitetaan objekti kartalle
            ObjectToMap (v\obj, x, y)
            // Sopiva paikka löytyi joten homma on sillä selvä ja voidaan poistua.
            Exit
         EndIf
    Wend
EndFunction
Alligaattori
Active Member
Posts: 135
Joined: Fri Mar 07, 2008 8:49 pm

Re: Tyhmät kysymykset

Post by Alligaattori »

Mukana täytyisi olla myös ObjectToMap-funktio, minkä huomasin vasta jälkeenpäin. Lataa SDK ja käytä sitä.

Funktioiden parametreihin ei saa koskea, kutsu SpawnObject(v\obj). Älä kirjoita sille riville muuta kuin kommentteja.
jack-ass

Re: Tyhmät kysymykset

Post by jack-ass »

latasin(ja asensin)skd:n ja net frameworkin, muttei toimi. en tiedä miksi. "ObjectToMap can't be uset like this" "object requered"
Alligaattori
Active Member
Posts: 135
Joined: Fri Mar 07, 2008 8:49 pm

Re: Tyhmät kysymykset

Post by Alligaattori »

Kuinka yrität käyttää funktiota? Onko mahdollista, että parametrit ovat vääränlaisia? Lähetä koodisi tänne.
Locked