Coolbasicin sisäiset tehtävät

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Coolbasicin sisäiset tehtävät

Post by temu92 »

Character wrote:C1 ainakin itseni mielestä selkeämpänä versiona
Valitettavasti C1 tehtävän tarkoitus on juuri tehdä se asia vain yhtä riviä käyttämällä. Tuo ei ole sallittu ratkaisu.
random koodari

Re: Coolbasicin sisäiset tehtävät

Post by random koodari »

A3 lyhyesti

Code: Select all

Repeat
    Cls         : Wait 500
    Print "ASD" : Wait 500
Forever
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Coolbasicin sisäiset tehtävät

Post by otto90x »

Pistetääs vielä tuo a2 pari riviä lyhyempänä.

Code: Select all

Repeat
    If getRGB(1)>=255 Or getRGB(1)<=0 Then a=Int(getRGB(1)/255)*2
    Color getRGB(1)-(a-1),getRGB(1)-(a-1),0
    Box 180,130,40,40
    DrawScreen
Forever
Vaikka eihän tuo nyt yhtään selkeämpi tai parempi ole :D
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Coolbasicin sisäiset tehtävät

Post by Awaclus »

Necropotency!

Nyt kun tätä aihetta jossain muussa threadissa linkitettiin ja erehdyin vilkuilemaankin tätä, niin tuli mieleen, että näihinhän sopii Spoiler-tagit kuin spoiler-tagit spoilauksiin.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Coolbasicin sisäiset tehtävät

Post by DatsuniG »

Chaosworm wrote:Necropotency!

Nyt kun tätä aihetta jossain muussa threadissa linkitettiin ja erehdyin vilkuilemaankin tätä, niin tuli mieleen, että näihinhän sopii Spoiler-tagit kuin spoiler-tagit spoilauksiin.
Ehdotusta on kuultu.
EDIT:

@koodaaja: Päivitetty

Last edited by DatsuniG on Sun Jan 17, 2010 9:51 pm, edited 2 times in total.
Hengität nyt manuaalisesti.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Coolbasicin sisäiset tehtävät

Post by koodaaja »

Nostettu on jo kuitenkin niin haluaisin ehdottaa pientä lyhennystä A2:teen ja A3:een.

A2:

Code: Select all

Repeat
    Color 127.5+(127.5*Sin(Timer()Shr 3)), (Sin(Timer()Shr 3)*127.5)+127.5, 0
    Box 180,130,40,40
    DrawScreen
Forever
A3:

Code: Select all

Repeat
    If (Timer() Mod 1000)<500 Then Text 10, 10, "Text!"
    DrawScreen
Forever
Merkkejä ja avainsanoja A3:ssa enempi, rivejä vähenpi (jos ei oteta kaksoispistelyhennystä huomioon) Lisäksi ei käytä printtiä, mikä on ihan kiva sinänsä.
Tuxi
Active Member
Posts: 190
Joined: Wed Jan 21, 2009 10:25 pm
Contact:

Re: Coolbasicin sisäiset tehtävät

Post by Tuxi »

Tehtävän b3 ratkaisussa on virhe. Se ei tarkasta, päättyykö peli tasapeliin.
Peli osaa kertoa kumpi voitti vai päädyttiinkö tasapeliin.
Tuossa muokattu versio, missä on tasapeli mukana.

Code: Select all

    SCREEN 300,300
    Dim Ruudukko(2,2) As integer, Vuoro As Integer
    Repeat
        For a = 0 To 2
            For i = 0 To 2
                Box i * ScreenWidth() / 3, a * ScreenHeight() / 3, ScreenWidth() / 3, ScreenHeight() / 3, 0
                If MouseX() > i * ScreenWidth() / 3 And MouseX() < (i + 1) * ScreenWidth() / 3 And MouseY() > a * ScreenHeight() / 3 And MouseY() < (a + 1) * ScreenHeight() / 3 And MouseHit(1) And Ruudukko(i,a) = 0 Then
                    Ruudukko(i,a) = vuoro + 1
                    vuoro = Not vuoro
                ElseIf ruudukko(i,a) = 1 Then
                    Ellipse i * ScreenWidth() / 3, a * ScreenHeight() / 3, ScreenWidth() / 3, ScreenHeight() / 3,0
                ElseIf ruudukko(i,a) = 2 Then
                    Line i * ScreenWidth() / 3, a * ScreenHeight() / 3, (i + 1) * ScreenWidth() / 3 , (a + 1) * ScreenHeight() / 3
                    Line (i + 1) * ScreenWidth() / 3 , a * ScreenHeight() / 3 , i * ScreenWidth() / 3 , (a + 1) * ScreenHeight() / 3
                EndIf
                If ruudukko(i,a) > 0 Then merkkejä+1
                If (Ruudukko(a,0) = (Not vuoro) + 1 And Ruudukko(a,1) = (Not vuoro) + 1 And Ruudukko(a,2) = (Not vuoro) + 1) Or (Ruudukko(0,i) = (Not vuoro) + 1 And Ruudukko(1,i) = (Not vuoro) + 1 And Ruudukko(2,i) = (Not vuoro) + 1) Or (Ruudukko(0,0) = (Not vuoro) + 1 And Ruudukko(1,1) = (Not vuoro) + 1 And Ruudukko(2,2) = (Not vuoro) + 1) Or (Ruudukko(2,0) = (Not vuoro) + 1 And Ruudukko(1,1) = (Not vuoro) + 1 And Ruudukko(0,2) = (Not vuoro) + 1) Then MakeError Chr(79 + (Not vuoro) * 9) + " voitti!" 
           Next i
        Next a 
        If merkkejä = 9 Then MakeError "Tasapeli!" Else merkkejä = 0
        DrawScreen
    Forever
Projektit:
Jotain pientä (Ehkä vähän suurempaakin)

-Tuxi- (myös Tuxi4321)
Wanna Be Coder

Re: Coolbasicin sisäiset tehtävät

Post by Wanna Be Coder »

Kiitokset vaan kaikille :D , siintä se ura urkenee :arrow:
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: Coolbasicin sisäiset tehtävät

Post by Misthema »

Mitään tehtäviä en teille ratko, mutta pakko vain sanoa, että tämäkin ketju mennyt melkoiseen pätemiseen, eikä niinkään enää tehtävien ratkomiseen. =P

Toki ratkaisuja on tullut muutamat erilaisetkin, mutta silti pisti silmään ylemmällä rivillä mainittu asia.
User avatar
Gamgi
Newcomer
Posts: 10
Joined: Sun Aug 09, 2009 5:24 pm

Re: Coolbasicin sisäiset tehtävät

Post by Gamgi »

Anteeksi bumppailu, mutta teinpä tylsyyksissäni version tehtävästä C3.
Tarkoituksena on siis tehdä ylhäältäpäin kuvattu räiskintäpeli. Bottien määrää on 5, mutta sitä voi muuttaa.

Code: Select all

//tehtävä C3
 
 
//Hieman ohjelman rakenteesta:
// 1.0 Lataa ja asettaa muuttujia
// 2.0 Pääsilmukka
//      3.0 Syöttö (ohjaus)
//      4.0 Päivitys (liikutetaan ukkeleita ja tarkistetaan josko ammukset osuvat jne.)
//      5.0 Piirto (HUD)
// 6.0 Pääsilmukan loppu
// Funktiot
 
//Muuta:
// Vihollisia hallitaan taulukoilla, koska niitä on ennaltamäärätty määrä.
// Luoteja ja partikkeleita taas tyypeillä, koska se on helpompaa.
// Käytän jännää "continue" menetelmää (gotolla). koska CoolBasicista puuttuu Continue-käsky joka mahdollistaisi for-loopin alkuun hyppäämisen
//INFO LOPPU
 
Const enemies = 5
 
//ASETA RUUTU
SCREEN 640,480
SetWindow "Ultimate Death"
FrameLimit 60
//--//1.0 LADATAAN ja ALUSTETAAN
    //--//FONTIT
    Global font_0,font_1 'fontit ovat globaaleja, jotta niitä voi käyttää funktioissa
    font_0 = LoadFont("Arial",12)
    font_1 = LoadFont("Arial",22)
 
    //--//KARTTA
    map = LoadMap("Media\cdm2.til", "Media\tileset.bmp")
    ObjectPickable map, ON
    //--//PELAAJA
        //OBJEKTI
        player = LoadObject("media\soldier.bmp",72)
        SetupCollision player, map, 2, 4, 2
        Dim player_gun As Byte 'mikä ase käytössä (0=pistooli, 1=plasmakivääri, 2=liekinheitin, 3=raketti)
        Dim player_shoot_delay As integer 'milloin saa ampua (kun timer()>tämä muuttuja)
        Dim player_shoot_lock As Byte   'jos 1 niin pelaaja joutuu päästämäänn ampumanäppäimen jotta hän voi ampua uudestaan
        Dim player_reload As integer    'reload-palkki (arvo 0-100)
    //--//ASEET ja liittyvät muuttujat
        Const guns = 3
        Dim gun_delay(guns) As integer 'kuinka pitkä aika ammusten välillä on (esim. konekivääri = lyhyt aika), -1=ampuu kerran
        gun_delay(0) = 700
        gun_delay(1) = 300
        gun_delay(2) = 100
        gun_delay(3) = 2000
 
        Dim gun_retrigger(guns) As Byte 'ampuuko ase uudestaan jos näppäintä pidetään pohjassa, 1= kyllä
        gun_retrigger(0) = 0
        gun_retrigger(1) = 0
        gun_retrigger(2) = 0
        gun_retrigger(3) = 1        
 
        Dim gun_damage(guns) As Byte    'paljonko healthia menettää
        gun_damage(0) = 10
        gun_damage(1) = 5
        gun_damage(2) = 5
        gun_damage(3) = 40
 
        Dim gun_name(guns) As String   'aseen nöytöllä näkyvä nimi
        gun_name(0) = "Pistol"
        gun_name(1) = "Plasma Gun"
        gun_name(2) = "Flamethrower"
        gun_name(3) = "Rocket Laucher"
 
        Dim gun_speed(guns) As integer 'aseen nopeus pikseli/frame. -1 = instant hit, eli luoti kulkee äärettömällä nopeudella
        gun_speed(0) = -1
        gun_speed(1) = 3.0
        gun_speed(2) = 3.0
        gun_speed(3) = 3.0
 
        Dim gun_lifetime(guns) As integer 'luodin olemassaoloaika millisekunteina, -1 = ikuinen
        gun_lifetime(0) = -1
        gun_lifetime(1) = 1500
        gun_lifetime(2) = 1000
        gun_lifetime(3) = 3000
 
    //LUODIT
        Type bullet
            Field obj       'jokainen luoti on objekti
            Field lifetime  'elinaika, kuolee jos timer()>lifetime
            Field shot_by   'kenen ampuma, -1=pelaaja, 0...n = botti. Tämä on tärkeä silloin kun pistoolilla ammuttaessa piirretään viiva ampujasta luotiin
            Field speed#    'nopeus pikseleissä per frame
            Field damage    'paljonko healthia lasketaan osuttaessa
            Field bul       'tyyppi 0=pistooli,1=plaskakivääri, jne.
            Field angle     'mhin suuntaan mennään (mahdollistaa itse objektin pyörittämisen ilman että suunta muuttuu)
        EndType
        //luotien "originaali" objektit joista ne sitten kloonataan
        Dim gun_bullet(guns)
        gun_bullet(0) = LoadObject("Media\bullet.bmp")
        gun_bullet(1) = MakeObject(4)
        gun_bullet(2) = LoadAnimObject("Media\bang.bmp",32,32,0,8,8)
        gun_bullet(3) = LoadObject("Media\bigbullet.bmp",72)
 
        For i = 0 to 3 'piilotetaan ne
            ShowObject gun_bullet(i), OFF
        Next i
 
    //--//VIHOLLISET
        //itse vihollisobjektit (kloonataan pelaajasta ja sijoitetaan taulukkoon)
        Dim enemy(enemies)
        Dim enemy_turn_delay(enemies) As integer
        Dim enemy_ox(enemies) As Float
        Dim enemy_oy(enemies) As Float
        Dim enemy_mode(enemies) As Byte ' 0=kuljeskelee, 1=kääntyy, 2=ampuu
        Dim enemy_mode_timer(enemies) As integer 'onko aika siirtyä tilaan 0? (on jos timer()>tämä)
        Dim enemy_maxd(enemies) As Float 'kääntymiseen liityviä
        Dim enemy_maxda(enemies) As integer 'se kulma josta on pisin matka seinään (botit katsovat siis tilassa 1 aina pisimmän matkan ja menevät sinne)
        Dim enemy_turn_dir(enemies) As integer 'vähän satunnaisuutta. mihin suuntaan käännytään
        Dim enemy_shoot_delay(enemies) As integer 'pelaaja saa ampua kun timer()>tämä
        Dim enemy_oa(enemies) 'original_angle... eli
        Dim enemy_health(enemies)
        Dim enemy_dead(enemies) As Byte 'vihollista ei päivitetä jos se on kuollut
        Dim enemies_left As integer  
        enemies_left = enemies
        'alustetaan viholliset
        For i = 0 To enemies
            enemy_health(i) = 50 'aloittavat 50hp
            enemy(i) = CloneObject(player)
            SetupCollision enemy(i), map, 2, 4, 2
        Next i
    //--//PARTIKKELIlLÄHTEET (efektit)
        Type emitter
            Field obj
            Field lifetime
        EndType
 
    //KONSOLI
    Dim console_line(4) As String   'konsolirivi
//--//HIEMAN GENEROINTIA
    //PLASMATEKSTUURI
    plasma_texture = MakeImage(16,16)
    DrawToImage plasma_texture
        For i=0 To 36
            Color 0, Rand(50,200), Rand(0, 50)
            Circle Rand(0,14), Rand(0,14), 2
        Next i
    DrawToScreen
    PaintObject gun_bullet(1), -plasma_texture 'miinusmerkki viittaa kuvaan, tämä on tojain coolbasicin omaa säveltämistä
    DeleteImage plasma_texture
    //KIPINÄT
    spark = MakeImage(2,2)
    DrawToImage spark
        Color 255,172,0
        Box 0,0,2,2
    DrawToScreen
    //VERI
    splat = MakeImage(2,2)
    DrawToImage splat
        Color 255,0,0
        Box 0,0,2,2
    DrawToScreen
    //plasmaroiske
    blob = MakeImage(2,2)
    DrawToImage blob
        Color 0,202,0
        Box 0,0,2,2
    DrawToScreen
    //rakettiblast
    boom = MakeImage(5,5)
    DrawToImage boom
        Color 255,150,0
        Box 0,0,5,5
    DrawToScreen
 
//--//ALUSTETAAN JUTTUJA
    console_write("-------------ULTIMATE DEATH-----------")
    console_write("arrows:  aim")
    console_write("space:   shoot")
    console_write("ctrl:    change weapon")
    console_write("---------------------------------------------------")
 
    //sijoitetaan viholliset
    For i = 0 To enemies
        PositionObject enemy(i), Rand(-500,500), Rand(-500,500)
        collisions = CountCollisions(enemy(i))
        While collisions <> 0 //jos seinän sisässä...tehdään uudestaan
            //näin ei kannata tehdä, koska viholliset voivat joutua seinän sisään tai pelikentän ulkopuolelle, mutta 500<mapw/2 joten eivät ainakaan mene ulkopuolelle
            PositionObject enemy(i), Rand(-500,500), Rand(-500,500)
            collisions = CountCollisions(enemy(i))
        Wend
    Next i
    //pelaaja
    player_health = 100
    PositionObject player, -130, 1050 'alkupaikka
//-----------------------------------------//MAIN 2.0
Repeat

//--//3.0 SYÖTTÖ
    //PELAAJAN SYÖTTÖ
    'ohjaus
    If LeftKey() Then TurnObject player, 2
    If RightKey() Then TurnObject player, -2
    If UpKey() Then MoveObject player, 2
    If DownKey() Then MoveObject player, -2
    'aseen vaihto
    If KeyHit(cbKeyLControl) Then player_gun = (player_gun + 1) Mod 4 //todo: tässä on joku jännä juttu että asetta ei voi vaihtaa ammuttaessa...
    'ampuminen
    If KeyDown(cbKeySpace) And (Timer()>player_shoot_delay) And (player_shoot_lock = 0) And (player_reload > 0) Then 
        //AMMUTAAN VAAN
        'luodaan luoti
        handle.bullet = New(bullet)
        handle\obj = CloneObject(gun_bullet(player_gun)) 'kloonataan se luoti joka vastaa käytössä olevaa asetta
        'laitetaan luoti kuntoon
        CloneObjectPosition handle\obj, player  'sijoitetaan pelaajan kohdalle
        CloneObjectOrientation handle\obj, player   'asetetaan lähtösuunta
        handle\angle = ObjectAngle(player)
        MoveObject handle\obj, 20    'piipun päähän
        handle\speed = gun_speed(player_gun)    'asetetaan nopeus
 
        If gun_lifetime(player_gun) <> -1 Then  'asetetaan elinaika
            handle\lifetime = Timer() + gun_lifetime(player_gun) 'elinaikaa tästä hetkestää se määrätty aika
        Else
            handle\lifetime = -1 'luotia ei poisteta automaattisesti
        EndIf
 
        //TÖRMÄYKSENTUNNISTUS
        SetupCollision handle\obj, map, 2, 4, 2 'törmäilyä
        ObjectRange handle\obj, 2 'luodin halkaisija on 2px
        For i = 0 To enemies
            SetupCollision handle\obj, enemy(i), 2,2,2  'luoti tunnistaa viholliset
        Next i
        //minkälainen luoti kyseessä?
        handle\bul = player_gun 'bul = luoti...eli minkä aseen luoti?
        handle\shot_by = -1 '-1 = pelaaja. 0...n = botit
        //ESTETÄÄN HETI PERÄÄN AMPUMISTA
        player_shoot_delay = Timer() + gun_delay(player_gun)
        player_shoot_lock = gun_retrigger(player_gun)
 
        //EFEKTIT
        If handle\bul = 3 Then //raketti saa peräänsä komeat lieskat
            //KIPINÄT
            rocket_particle = MakeEmitter (spark, 7)    'näin ei tietenkään kannattaisi tehdä. YKSI objekti, vaikka raketteja perjaatteessa voi olla monta. niitä ei kuitenkaan ole.
            CloneObjectPosition rocket_particle, handle\obj
            RotateObject rocket_particle, ObjectAngle(handle\obj) + 180
            ParticleMovement rocket_particle ,2 ,0
            ParticleEmission rocket_particle ,1, 8,60
        EndIf
        If player_gun <> 2 Then player_reload = 0 Else player_reload = player_reload - 15   //RELOAD nollataan...liekinheitin reloadaa erilailla kuin muut.
    ElseIf player_reload<100 And player_gun = 2 And (Timer()>player_shoot_delay)
        //FLAMETHROWERIN RELOAD
        player_reload = player_reload + 1
        player_reload = Min(100,player_reload)
    EndIf
    If KeyUp(cbKeySpace) And player_shoot_lock = 1 Then //lukituksen poisto. joillakin aseilla on näppäintä nostettava ennen uudelleenampumista
        player_shoot_lock = 0
    EndIf
 
 
 
//--//4.0 PÄIVITETÄÄN
    //AMMUKSET
    For handle.bullet = Each bullet
        //ELINAIKA
        If Timer() > handle\lifetime And handle\lifetime <> -1 Then
            //poista luoti
            DeleteObject handle\obj
            Delete handle
            //poista raketin partikkelit
            If handle\bul = 3
                DeleteObject rocket_particle
            EndIf
            //homma hoidettu
            Goto continue ' tämä luoti on nyt käsitelty
        EndIf
        //ANIMOINTI
        If handle\bul = 1 Then TurnObject handle\obj, 11.25
        If handle\bul = 2 Then PlayObject handle\obj, 0, 8, 0.008
        //RAKETIN kipinät kiinni rakettiin
        If handle\bul = 3 Then
            CloneObjectPosition rocket_particle, handle\obj
            MoveObject rocket_particle, 5
        EndIf
 
        //LIIKE,    liike suoritetaan niin että luotia liikutetaan aina yksi pikseli kerralla ja tarkistetaan osuuko se johonkin
        speed_steps = Int(handle\speed) 'haluan painostaa tuota INT:ttiä. eli hypellään aina pikseli (kokonaisluku)
 
        i = 0
        While (i <> speed_steps) //kikkailtu for-looppi :D
            blood = 0 'alustetaan. jos blood=1 niin luodaan veriemissio luodin loppupäähän... SPLÄT!
            //liikutetaan pikselin verran kulkusuuntaan
            TranslateObject handle\obj, Cos(handle\angle), Sin(handle\angle)
            UpdateGame  'ilman tätä peli ei huomaisi tötmäyksiä
            //TÖRMÄYKSENTARKISTUS
            collisions = CountCollisions(handle\obj)
            If collisions > 0 Then
                //MIHIN OSUTTIIN?
                For j = 0 To collisions
                    collision = GetCollision(handle\obj, j)
                    //PELAAJA
                    If collision = player Then
                        player_health = player_health - gun_damage(handle\bul)
                        If player_health<=0 Then splash("Game Over","You have died. That's soo sad :( BUT HEY... YOU CAN PLAY AGAIN..."):End
                        //VERI
                        blood = 1
                        Exit
                    EndIf
                    //VIHOLLISET
                    For k = 0 To enemies
                        If collision = enemy(k) And enemy_dead(k)=0 Then
                            enemy_health(k) = enemy_health(k) - gun_damage(handle\bul)
                            //kuoleeko vihollinen?
                            If enemy_health(k)<=0 Then ShowObject enemy(k),OFF:enemy_dead(k)=1:enemies_left - 1:console_write("Enemy killed! "+(enemies_left+1)+" enemies l"+"eft")
                            If enemies_left<0 Then splash("Mission accomplished!","Congratulations! You managed To take down all the enemies. You are now a hero."):End
                            //veri
                            blood = 1
                            Exit
                        EndIf
                    Next k
 
                    If handle\bul = 3 And collision = map Then // jos on raketti niin seinään tulee reikä
                        //nämä kusee vähän, koska jostain syystä collisionx() ei toiminut vaan palautti aina 0,0
                        x = (ObjectX(handle\obj) +16 )/32.0 + MapWidth()/2.0
                        y = -(ObjectY(handle\obj) -16)/32.0 + MapHeight()/2.0  - sgn(Sin(ObjectAngle(handle\obj)))
                        SetWindow ""+CollisionX(handle\obj,j)
                        For jj=0 To 8
                            //tarkistaetaan getmapilla, että poistettava tosiaan on seinä
                            If GetMap2(2,x+Cos(jj*45), y-Sin(jj*45))=1 Then
                                EditMap map, 0, x+Cos(jj*45), y-Sin(jj*45), 137
                                EditMap map, 2, x+Cos(jj*45), y-sin(jj*45), 0
                            EndIf
                        Next jj
                        EditMap map, 0, x, y, 137 'muutetaan karttaa
                        EditMap map, 2, x, y, 0   'poistetaan törmäys
                        UpdateGame//bugi: kaikki näkee pelaajan kun karttaa muutetaan. siksi updategame
                    EndIf
 
                Next j
                //LUO VÄHÄN KIPINÖITÄ riippuen aseesta(cool!)
                If handle\bul = 0 Then //PISTOOLI
                    //KIPINÄT
                    If blood = 0
                        par.emitter = New(emitter)
                        par\obj = MakeEmitter (spark, 10)
                        CloneObjectPosition par\obj, handle\obj
                        ParticleMovement par\obj ,2 ,0
                        ParticleEmission par\obj ,5, 4,360
                        par\lifetime = Timer() + 200
                    EndIf
 
                    Color 200,200,200
                    //hieno viiva kuvaamaan lentorataa
                    DrawGame : game_drawn = 1
                    DrawToWorld ON
                    If handle\shot_by = -1 Then
                        Line ObjectX(player) + Cos(ObjectAngle(player))*25, ObjectY(player) + Sin(ObjectAngle(player))*25, ObjectX(handle\obj), ObjectY(handle\obj)
                    Else
                        Line ObjectX(enemy(handle\shot_by)) + Cos(ObjectAngle(enemy(handle\shot_by)))*25, ObjectY(enemy(handle\shot_by)) + Sin(ObjectAngle(enemy(handle\shot_by)))*25, ObjectX(handle\obj), ObjectY(handle\obj)
                    EndIf
                    DrawToWorld OFF
                ElseIf handle\bul = 1 //PLASMAKIVÄÄRI
                    //KIPINÄT
                    If blood=0 Then
                        par.emitter = New(emitter)
 
                        par\obj = MakeEmitter (blob, 10)
                        CloneObjectPosition par\obj, handle\obj
                        ParticleMovement par\obj ,2 ,0
                        ParticleEmission par\obj ,2, 4,360
                        par\lifetime = Timer() + 200
                    EndIf
                ElseIf handle\bul = 3 //RAKETTI
                    //poista kipinät
                    DeleteObject rocket_particle
                    //boom
                    par.emitter = New(emitter)
                    par\obj = MakeEmitter (boom, 30)
                    CloneObjectPosition par\obj, handle\obj
                    ParticleMovement par\obj ,2 ,0
                    ParticleEmission par\obj ,2, 14,360
                    par\lifetime = Timer() + 400
                EndIf
                //VERI, eli verta tulee jos blood=1
                If blood Then
                    par.emitter = New(emitter)
                    par\obj = MakeEmitter (splat, 10)
                    CloneObjectPosition par\obj, handle\obj
                    ParticleMovement par\obj ,2 ,0
                    ParticleEmission par\obj ,5, 8,360
                    par\lifetime = Timer()+200
                EndIf
                //poista luoti, sehän osui johonkin
                DeleteObject handle\obj
                Delete handle
 
 
 
                Goto continue' tämä luoti on nyt käsitelty
            EndIf
            i = i + 1
        Wend
        //Muista ohjelmointikielistä tuttu continue mahdollistaa sen että tämänhetkisen luodin käsittelyn voi lopettaa ja hypätä seuraavaan
        continue:
    Next handle
 
    //PARTIKKELIT (niiden poisto)
    For handle2.emitter = Each emitter
        If Timer() > handle2\lifetime Then  'eloaika loppui
            DeleteObject handle2\obj
            Delete handle2
        EndIf
    Next handle2
 
    //BOTIT - AI on huonosti komentoitua. tärkeää on että botit toimivat eri "moodeissa". 0=kävely, 1=pyöriominen, 2=ampuminen
    For i = 0 To enemies
        If enemy_dead(i)=0 Then 'ei päivitetä kuolleita
            If enemy_mode(i)=0 Then
 
                //käänny randomilla
                'If Rand(0,200) = 0 Then TurnObject enemy(i),Rand(-1,0)*180+90
 
                //OLLAANKO JUMISSA?
                If enemy_ox(i) = ObjectX(enemy(i)) And enemy_oy(i) = ObjectY(enemy(i)) And Distance2(enemy(i), player)>60 Then 'tuo distance on tuossa sen takia ettei bot pysähtyessään luulisi olevan jumissa
                    TurnObject enemy(i), Rand(-2,2)*45 : enemy_turn_delay(i) = Timer() + Rand(0,1000)
                EndIf
                //MENNÄÄNKÖ PÄIN SEINIÄ?
                oa = ObjectAngle(enemy(i)) 'old_angle
                na = oa 'new_angle
                maxd = 50 'max_distance
                For k=-10 To 10 'käydään läpi kulmat (-45...45 pelaajasta käsin). tarkistetaan ettei olla menossa päin seinää
                    RotateObject enemy(i),oa+k*45/10
                    ObjectPick enemy(i)
 
                    d = Distance(ObjectX(enemy(i)), ObjectY(enemy(i)), PickedX(), PickedY())
                    If d<30 Then enemy_mode(i) = 1:enemy_maxd(i)=0:enemy_mode_timer(i) = Timer()+ Rand(2,5)*1000 :enemy_turn_dir(i)=Rand(-1,0)*2+1:enemy_oa(i)=oa 'seinä edessä! aika kääntyä!
                    If k=0 Then maxd=d 'liittyy käytävien etsintään (sivuilla)
                Next k
                //OISKO SIVUILLA KÄYTÄVIÄ?
                na = oa+Rand(-1,1)*90
                RotateObject enemy(i),na
                ObjectPick enemy(i)
                d = Distance(ObjectX(enemy(i)), ObjectY(enemy(i)), PickedX(), PickedY())
                If d>maxd And d>100 And rand(0,50)=0 Then oa=na
 
                //PAALAUTELLAAN takaisin kulmaan (edellä käänneltiin jotta huomattaisiin seinät)
                RotateObject enemy(i), oa
                enemy_ox(i)=ObjectX(enemy(i)) : enemy_oy(i)=ObjectY(enemy(i)) 'tallennetaan "vanhat" koordinaatit jotta voidaan huomata jumitukset
 
                //ONKO PELAAJA NÄKYVISSÄ?
                If ObjectSight(enemy(i), player) And (Timer() > enemy_turn_delay(i)) Then
                    na = Int(GetAngle2(enemy(i), player)/45.0)*45
                    RotateObject enemy(i), na
                    enemy_turn_delay(i) = Timer() + Rand(1000,2000)
                    If Distance2(enemy(i), player)<300 And Timer()>enemy_shoot_delay(i)  Then enemy_mode(i)=2:enemy_mode_timer(i)=Timer()+1000 'AMMUTAAN!
                EndIf
 
                //LIIKUTAAN jos ei olla menossa pelaajan päälle
                If Distance2(enemy(i), player)>60 Then MoveObject enemy(i),1
            EndIf
 
 
            //ROTATEMODE, eli pyöritään (kryptinen toteutus)
            If enemy_mode(i)=1 Then
                //ROTATEEEE
                enemy_maxd(i)=0
                oa = ObjectAngle(enemy(i))
                na = oa
 
                For k=-2 To 2 'tarkistetaan kulmat -90, -45, 0, 45, 90 josko löytyisi mukavia pitkiä matkoja = käytäviä
                    RotateObject enemy(i),oa+k*45
                    ObjectPick enemy(i)
 
                    d = Distance(ObjectX(enemy(i)), ObjectY(enemy(i)), PickedX(), PickedY())
                    If d>enemy_maxd(i) And k<>0 And d>30 Then enemy_maxd(i)=d: enemy_maxda(i) = oa+k*45 'talletaan paras suunta
                Next k
 
                enemy_mode(i)=0
                RotateObject enemy(i),enemy_maxda(i)
            EndIf
 
            //AMPUMODE, ammuskellaan pelaajaa kohti
            If enemy_mode(i)=2 Then
                If Timer() > enemy_shoot_delay(i) Then //ammutaan jos ei olla ammuttu
                    oa = ObjectAngle(enemy(i))
                    PointObject enemy(i),player //tähdätään pelaajaan
                    TurnObject enemy(i), Rand(-15, 15) //..randomia...että voi ampua hutikin
                    enemy_shoot_delay(i)=Timer()+gun_delay(0)+1500 //1500 siksi etteivät kokoajan tulittaisi, olisi liian vaikeaa :D
 
                    //AMMUTAAN
                   'luodaan luoti
                    handle.bullet = New(bullet)
                    handle\obj = CloneObject(gun_bullet(0)) 'kloonataan pistoolin panos
 
                    CloneObjectPosition handle\obj, enemy(i)  'sijoitetaan pelaajan kohdalle
                    CloneObjectOrientation handle\obj, enemy(i)   'asetetaan lähtösuunta
                    handle\angle = ObjectAngle(enemy(i))
                    MoveObject handle\obj, 20    'piipun päähän
                    handle\speed = gun_speed(0)    'asetetaan nopeus 
                    handle\lifetime = Timer() + gun_lifetime(0)+100 'elinaikaa tästä hetkestää se määrätty aika
                    //TÖRMÄYKSENTUNNISTUS
                    SetupCollision handle\obj, map, 2, 4, 2 'törmäilyä (bugivaroitus, 2,4,1 = bugi)
                    SetupCollision handle\obj, player, 2,2,2
                    ObjectRange handle\obj, 2
                    //minkälainen luoti kyseessä?
                    handle\bul = 0
                    handle\shot_by = i
                EndIf
                //nyt on seisty hetki, aika jatkaa matkaa
                If timer()>enemy_mode_timer(i) Then enemy_mode(i)=0:RotateObject enemy(i), oa
 
            EndIf
            //HEALTHBAR
            If game_drawn = 0 Then DrawGame : game_drawn = 1
 
            DrawToWorld ON,OFF,ON
            Color 80,0,0
            Box ObjectX(enemy(i))-15,ObjectY(enemy(i))+30,30,2,0
            Color 255,0,0
            Box ObjectX(enemy(i))-15,ObjectY(enemy(i))+30,enemy_health(i)*0.6,2
            DrawToWorld OFF
        EndIf
    Next i
 
 
 
 
    //KAMERA
    CloneCameraPosition player
    //RELOAD-PALKKI
    If player_gun <> 2 Then 'flamethrowerin reload-palkki
        player_reload = 100-(Float(max(0,player_shoot_delay-Timer()))/float(gun_delay(player_gun)))*100 'hoho, prosenttilaskua jne...
    EndIf
 
//--//4.0 PIIRRETÄÄN
    If game_drawn = 0 Then DrawGame
    game_drawn = 0
 
    //KÄYTTÖLIITTYMÄ (harmaat palkit jne)
    'harmaa palkki
    Color 40,40,40
    Box 0,420,640,60
    Color 20,20,20
    Box 0,420,640,2
    'käytössä oleva ase
    SetFont font_1
    Color 190,190,190
    Text 10, 440, gun_name( player_gun)
    'health palkki
    Color 80,0,0
    Box 159,430,102,17
    Color 200,0,0
    Box 159,430,player_health,17
    Color 200,100,100
    Box 159,430,102,17,0
    'reload palkki
    Color 20,20,20
    Box 159,452,102,17
    Color 100,100,100
    Box 159,452,102,17,0
    Color 80,80,80
    Box 160,453,player_reload,15
    'keskipalkki
    Color 20,20,20
    Box 319,420,2,60
    'konsoli
    SetFont font_0
    Color 200,200,0
    For i=0 To 4
        Text 325,420+i*12,console_line(i)
    Next i
    DrawScreen
Forever
//-----------------------------------------//END MAIN 6.0
 
 
 
 
Function console_write(s$) 'kirjoita konsoliin
    For i=0 To 3
        console_line(i)=console_line(i+1)
    Next i  
    console_line(4)=s
EndFunction
 
Function sgn(f#) 'sign +/-1
    If f>=0 Then Return 1.0 Else Return -1.0
EndFunction
 
Function splash(otsikko$,viesti$) 'viesti ruudulle
    SetFont font_1
    h=(Len(viesti)/26)*20+100
    DrawGame
    //loota
    Color 80,80,80
    Box 320-150,100,300,h
    Color 20,20,20
    Box 320-150,100,300,h,0
    //otsikko
    Color 155,155,155
    CenterText 322,122,otsikko
    Color 255,255,255
    CenterText 320,120,otsikko
    //teksti (lolol rivitys)
    For i=0 To Len(viesti)/26 
        Text 180,160+i*20,Mid(viesti,i*26+1,26)
    Next i
    DrawScreen OFF
    WaitKey
    WaitKey
EndFunction
Törmäsin ongelmiin tuon seinäntuhouksen kanssa, koska CollisionX(handle\obj, j) ei jostain syystä palauttanut luodin ja kartan välistä törmäyspistettä. En sen enempää jaksanut selvitellä. (rivit 313-325)

Edit: getmap2 toimii nyt. Niin ja tämänpituinen koodi ei oikeastaan toimi esimerkkinä.
~Pyöriny millon missäkin since 2005~ Image
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Coolbasicin sisäiset tehtävät

Post by MaGetzUb »

Gamgi wrote:Anteeksi bumppailu, mutta teinpä tylsyyksissäni version tehtävästä C3.
Tarkoituksena on siis tehdä ylhäältäpäin kuvattu räiskintäpeli. Bottien määrää on 5, mutta sitä voi muuttaa.

Code: Select all

..koodia..
Törmäsin ongelmiin tuon seinäntuhouksen kanssa, koska CollisionX(handle\obj, j) ei jostain syystä palauttanut luodin ja kartan välistä törmäyspistettä. En sen enempää jaksanut selvitellä. (rivit 313-325)

Edit: getmap2 toimii nyt. Niin ja tämänpituinen koodi ei oikeastaan toimi esimerkkinä.
Erinomaista, sanoisinko eniromaista. :) Tästähän on hyötyä monelle tämmöisen pelin pohjaa haluaville. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Post Reply