Tyhmät kysymykset (I/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post by Jonez »

Kirjotin tätä mut koodaaja ehti ekaks. Tää on kuitenkin näin vaatimattomasti sanottuna selvästi paremmin selitetty, että postaan silti :)

Qesti:
Tee vaikka muuttuja joka kertoo hahmon nopeuden (siis: MoveObject hahmo, nopeus), ja muutat muuttujan nopeutta jos kohdataan tietynlainen tile. Kannattaa tehdä vaikka näin:

Code: Select all

If tileId then
   nopeus = 1
Elseif tileId2 then
   nopeus = 3
Else
   nopeus = 2
Endif
Eli varmistat aina tolla 'Elsellä' että on jokin oletusnopeus.

Se tietty tile sitten saadaankin funktiolla GetMap(). Ohjeet sen käyttöön löydät manuaalista. Tässä on se huono puoli, että ellet käytä tähän systeemiin datakerrosta, saattaa hidastavan tilen järjestysluku olla eri kun tilesetti vaihtuu, ts. jos meet esim. kaupungista maalle pelissäsi.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Guest

Re: Tyhmät kysymykset

Post by Guest »

Matemaattinen ongelma tällä kertaa:
Pitäisi saada sivulta kuvatussa pelissä kuolevan hahmon kappaleet lentämään oikealla nopeudella oikeaan suuntaan. Eli jos hahmo lentää kovaa vauhtia oikealle, sen palaset lentävät kovalla vauhdilla oikealle sen kuollessa.

Minulla on tiedossa hahmon nopeudet X- ja Y-akseleilla. Veripartikkeleja tekevällä funktiolle pitäisi antaa parametreiksi partikkelien kulma, miniminopeus ja maksiminopeus. Miten saan laskettua ne?
//Guest//

Re: Tyhmät kysymykset

Post by //Guest// »

Tämmöseen kysymykseen törmäsin: Mietin pääni puhki miten saada luolalentelyssä aluksen vauhti vähenemään pikkuhiljaa eli se hidastuisi aina kun ylösnuolinäppäintä ei paineta? Itse koodi on simppeli suoraan (painovoima muutettu nollaksi) cb omista esimerkeistä:

Code: Select all

Const gravity= 0

'declare variables as decimal 
Dim target_movex As Float, target_movey As Float
Dim movex As Float, movey As Float

'change the display mode (low reolution, zoomed display) 
SCREEN 320,240,16,cbsizable
SetWindow "",3
DrawToWorld ON

'load the image-map (NO rotation detail) 
map=LoadObject("Media\level.bmp")
ObjectPickable map,3

'load the ship 
ship=LoadObject("Media\ship.bmp",72)

Repeat

    oldx#=ObjectX(ship) 'memorize the old coordinates
    oldy#=ObjectY(ship)

    'turn the ship
    If LeftKey() Then TurnObject ship,5
    If RightKey() Then TurnObject ship, -5
    
    'thrust/update physics
    If UpKey() Then 
        target_movex=Cos(ObjectAngle(ship))*3
        target_movey=Sin(ObjectAngle(ship))*3
        
        If target_movex< movex Then movex=movex-0.05
        If target_movex> movex Then movex=movex+0.05
        If target_movey< movey Then movey=movey-0.05
        If target_movey> movey Then movey=movey+0.05
    EndIf
    
    'move the ship according to physics
    movey=movey+gravity
    If movey< -4 Then movey= -4
    TranslateObject ship,movex,movey

    'make the camera follow the ship
    CloneCameraPosition ship 
    
    'COLLISION FOR THE LEVEL
    CameraPick 160,120
    If PickedObject()=map Then
        PositionObject ship,oldx,oldy
        movey=0
    EndIf
    
    DrawGame 'for drawing
    
    'figure out where the pick intersects with the level
    PixelPick ship
    If PickedObject() Then
        Circle PickedX() -5,PickedY()+5,10
    EndIf

    DrawScreen

Forever
Marcoder
Active Member
Posts: 120
Joined: Tue Aug 28, 2007 8:21 am

Re: Tyhmät kysymykset

Post by Marcoder »

//Guest// wrote:Tämmöseen kysymykseen törmäsin: Mietin pääni puhki miten saada luolalentelyssä aluksen vauhti vähenemään pikkuhiljaa eli se hidastuisi aina kun ylösnuolinäppäintä ei paineta?
Koko kiihdytyssysteemi on tuossa aika purkkaa.
Seuraava esimerkki on yksinkertainen ja toimiva.

Code: Select all

    If UpKey() Then 
        movex = movex + Cos(ObjectAngle(ship)) * 0.05
        movey = movey + Sin(ObjectAngle(ship)) * 0.05
    Else
        movex = movex * 0.99
        movey = movey * 0.99
    EndIf
//Guest//

Re: Tyhmät kysymykset

Post by //Guest// »

Marcoder wrote:
//Guest// wrote:Tämmöseen kysymykseen törmäsin: Mietin pääni puhki miten saada luolalentelyssä aluksen vauhti vähenemään pikkuhiljaa eli se hidastuisi aina kun ylösnuolinäppäintä ei paineta?
Koko kiihdytyssysteemi on tuossa aika purkkaa.
Seuraava esimerkki on yksinkertainen ja toimiva.

Code: Select all

    If UpKey() Then 
        movex = movex + Cos(ObjectAngle(ship)) * 0.05
        movey = movey + Sin(ObjectAngle(ship)) * 0.05
    Else
        movex = movex * 0.99
        movey = movey * 0.99
    EndIf
Jep melkoista purukumia joten ei eihme ettei tullut päähän. Kiitos esimerkistä. 8-)
Tiedoton

Re: Tyhmät kysymykset

Post by Tiedoton »

Tarvisin tietoa checkpointista!
Teen autopeliä ja haluaisin nyt saada maalin ja checkpointin paikolleen!

Jonkinlaista koodia checkpointista?

Cb:n manuaalista en saanut mitään tietoon :/

Help!
Auttajille kiitos!
duck_

Re: Tyhmät kysymykset

Post by duck_ »

Tiedoton wrote:Tarvisin tietoa checkpointista!
Teen autopeliä ja haluaisin nyt saada maalin ja checkpointin paikolleen!

Jonkinlaista koodia checkpointista?

Cb:n manuaalista en saanut mitään tietoon :/

Help!
Auttajille kiitos!
jotenkin tähän tyyliin:

Code: Select all

ollaan_pointilla=0
peli_läpi=0

loadobject auto (media/auto.bmp,72)
loadobject checkpoint (media/checkpointti.bmp)
loadobject maali (media/maali.bmp)

repeat

'auton osuttua checkpointtiin, ollaan_pointilla=1
if objectsoverlap (auto,checkpoint) and ollaan_pointilla=0 then ollaan_pointilla=1

'jos auto on osunut checkpointtiin ja se menee maaliin, peli on läpi. 
if objectsoverlap (auto,maali) and ollaan_pointilla=1 then peli_läpi=1
sovella tuo jotenki peliis.
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post by Harakka »

Täytyy sanoa että vähänkään monimutkaisissa radoissa en todellakaan suosittelisi ylempää tapaa. Cool Racerissa ratojen checkpointit ovat viivoja, joiden kordinaatit (x1,y1,x2,y2) tallennetaan taulukkoon. Ajettaessa tarkastetaan, leikkaako viiva auton etuakselin keskipisteestä vanhaan etuakselin keskipisteeseen viivan, jonka kordinaatit ovat kohdecheckpointin kordinaatit. Jos leikkaa, kohteeksi asetetaan seuraava checkpoint. Käytän tähän LinesIntersect()-funktiota, joka on CBSDK:ssa.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
SuperRally

Re: Tyhmät kysymykset

Post by SuperRally »

Kiitos Duck Ja Harakka!

uus ongelma! :P

tein checkpointit ja kun laitoin et kierrokset tulee lukemaa ylälaidas,
ni kun oli 1 checkpoint se toimi , mutta sitte ku laitoin toisen checkpointin ni se ei onnistunu :(

ylälaidan teksti = Kierrokset:

lopussa jäi ylälaidan teksti vielä kartan alle :(:(:(

tässä koodini:´

Code: Select all

FrameLimit 40
SCREEN 800,800
Kierros = 0
Point = 0 
kartta = LoadMap("Media\autorata1.til","Media\tilesetauto.bmp")
PlayObject kartta,0,0,1
maali = LoadObject ("Media\maali.bmp")
piste = LoadObject ("Media\CheckPoint.bmp")
piste2 = LoadObject ("Media\CheckPoint.bmp")
ukko = LoadObject ("Media\car.bmp",72)
SetupCollision ukko, kartta, 1, 4, 2
PositionObject ukko,  -100,0  
PositionObject maali, -80,50
PositionObject piste, -80,78
PositionObject piste2, 560,0
RotateObject ukko, 90
Repeat 
   If UpKey() Then MoveObject ukko,10
   If DownKey() Then MoveObject ukko,-8
   If LeftKey()And UpKey() Then TurnObject ukko,5
   If RightKey()And UpKey() Then TurnObject ukko,-5  
   If LeftKey()And DownKey() Then TurnObject ukko,5
   If RightKey()And DownKey() Then TurnObject ukko,-5
   If ObjectsOverlap (ukko,piste) Then Point = 1
   If ObjectsOverlap (ukko,piste2) Then Point = 1
   If ObjectsOverlap (ukko,maali) And point = 2 Then 
   Point = 0 
   Kierros = kierros+1 
   EndIf
   Text 10,10,"Kierros:"+kierros  
   CloneCameraPosition ukko
   DrawScreen
Forever 
Akatsuki
Member
Posts: 56
Joined: Thu Jan 03, 2008 1:39 pm
Location: Ylöjärvi
Contact:

Re: Tyhmät kysymykset

Post by Akatsuki »

Millä koodilla tehään että kun sä vaikka astut johonkin laatalle niin siitä pääsee sit seuraavaan kenttään?!?
(huom. olen vielä aloittelija ja en osaa)
Älä kysy multa!
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: Tyhmät kysymykset

Post by Harakka »

Laita sen laatan kohdalle tilekarttaan datakerrokseen esim. numero 5. Sitten koodissa:

Code: Select all

If GetMap(3,ObjectX(ukko),Objecty(ukko)) = 5 Then
  DeleteObject kentta
  kentta = LoadMap("uusikentta.til","tileset.png")
  PositionObject ukko,0,0
  'muut resetointisälät
EndIf
Kentän resetoimisen voisi tehdä hienomminkin, mutta tämä on karkea esimerkki.

EDIT: Kiitos, deletoiminen tosiaan unohtui. Lisäsin sen koodiin.
Last edited by Harakka on Fri Jan 04, 2008 8:00 pm, edited 1 time in total.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset

Post by koodaaja »

Akatsuki wrote:Millä koodilla tehään että kun sä vaikka astut johonkin laatalle niin siitä pääsee sit seuraavaan kenttään?!?
(huom. olen vielä aloittelija ja en osaa)
Teet tilekartan datakerrokseen merkki, siis joku luku, siihen kohtaan mistä siirrytään seuraavaan kenttään. Oletetaan, että valitset luvun 1. Sitten tarkistat pelisi koodissa, ollaanko siinä päällä seuraavasti:

Code: Select all

If Getmap(3, ObjectX(pelaaja), ObjectY(pelaaja))=1 Then
    'siirrytään seuraavaan kenttään...
EndIf
Siirtymisen voit toteuttaa monella tavalla, periaatteessa poistat vanhan kentän, lataat uuden ja teet kaikki hianot alkuvalmistelut (ukko oikeaan paikkaan, vihut, objektit yms. paikoilleen). Eli DeleteObject Map ja LoadMap() käyttöön. Kentät voi olla fiksua nimetä tyyliin "kenttä1.til", "kenttä2.til"... jolloin voit tehdä muuttujan, jota kasvatetaan aina kentän vaihtuessa, sitten kenttää ladatessa kirjoitat map=LoadMap("kenttä"+muuttuja+".til"). Koita käsittää, jos selitin turhan sekavasti, sano vain. Tästä oli muuten juttua ylempänä topikissa, taitaa olla jopa tämän sivun eka viesti.

ÖffTöpik:
Köh, kysy mieluummin millä "koodinpätkällä" jne., ilmaus "koodi" kuulostaa korvaani huijauskoodien hakemiselta, tämä käy itseäni aina häiritsemään.. Lisäksi koodi viitannee yhteen riviin, eikä johonkin kokonaisuuteen O__O tai sitten olen muuten vain outo.


EDIT: Olenpas hidas tänään. Harakka: wanha kartta on toki poistettava, muutenhan se jää kummittelemaan muistiin hidastaen konetta.
Last edited by koodaaja on Fri Jan 04, 2008 7:54 pm, edited 1 time in total.
Akatsuki
Member
Posts: 56
Joined: Thu Jan 03, 2008 1:39 pm
Location: Ylöjärvi
Contact:

Re: Tyhmät kysymykset

Post by Akatsuki »

Harakka wrote:Laita sen laatan kohdalle tilekarttaan datakerrokseen esim. numero 5. Sitten koodissa:

Code: Select all

If GetMap(3,ObjectX(ukko),Objecty(ukko)) = 5 Then
  kentta = LoadMap("uusikentta.til","tileset.png")
  PositionObject ukko,0,0
  'muut resetointisälät
EndIf
Kentän resetoimisen voisi tehdä hienomminkin, mutta tämä on karkea esimerkki.
Thanks wery much! :D
Molemmillle!
Älä kysy multa!
Akatsuki
Member
Posts: 56
Joined: Thu Jan 03, 2008 1:39 pm
Location: Ylöjärvi
Contact:

Re: Tyhmät kysymykset

Post by Akatsuki »

Vielä semmonen että miten saa tehtyy alkuvalikossa sen että voit painaa että new game tai exit hiirellä?
Kiitos jo etukäteen! :roll:
Älä kysy multa!
Raspful
Member
Posts: 83
Joined: Tue Aug 28, 2007 2:40 pm
Location: Raisio
Contact:

Re: Tyhmät kysymykset

Post by Raspful »

En tiedä ymmärsikö oikein, eli tarkoititko miten voit tehdä hiiri valikon?

Jos tarkoitit niin täällä on siitä topikki.
Tiimin kotisivut

Ydintuhon edistyminen:

Koodi=[70%]
Grafiikka=[60%]
Kentät=[40%]
Musiikki=[50%]
Akatsuki
Member
Posts: 56
Joined: Thu Jan 03, 2008 1:39 pm
Location: Ylöjärvi
Contact:

Re: Tyhmät kysymykset

Post by Akatsuki »

Raspful wrote:En tiedä ymmärsikö oikein, eli tarkoititko miten voit tehdä hiiri valikon?

Jos tarkoitit niin täällä on siitä topikki.
Kiitos. Juuri tuota tarkoitin :D
Älä kysy multa!
Akatsuki
Member
Posts: 56
Joined: Thu Jan 03, 2008 1:39 pm
Location: Ylöjärvi
Contact:

Re: Tyhmät kysymykset

Post by Akatsuki »

No nyt tuli onkelma uusimman pelin kanssa!
En läydä koodista mitään vikaa mutta kun käynnistän pelin niin se ei mene mihinkään alku valikosta!!!
Help!
Koodi:

Code: Select all

SCREEN 954,604

Const PAINOVOIMA = -0.1

Type HAHMO
    Field yPlus#                
    Field vauhti
    Field pelaaja
    Field maassa
    Field obj
End Type
 
alku = LoadImage("Media/j.tapettimies2/j.tapettimies2/taustat/logo kuva.bmp")
uusipeli = LoadImage("media/uusipeli.bmp")
exit1 = LoadImage("media/exit.bmp")
hiiri=LoadImage("Media\cursor.bmp")
ShowMouse hiiri
Color cbred
AddText "Paina 1 niin pääset peliin"
AddText "Paina 2 niin poistut"



Repeat


DrawGame


DrawImage alku,0,0
DrawImage exit1,450,520
DrawImage uusipeli,20,480

    hiiriX=MouseX()
    hiiriY=MouseY()
    
If KeyDown(cbkey1) Then
DeleteObject alku
DeleteObject uusipeli
DeleteObject exit1



kenttä = LoadMap("media/j.tapettimies2/j.tapettimies2/kenttiä/kenttä1.til", "media/j.tapettimies2/j.tapettimies2/kenttiä/karkkimaa.bmp")

oikea=LoadAnimObject("Media\j.tapettimies2\j.tapettimies2\player.bmp",47,51,0,10)
MaskObject oikea,cbMagenta
ShowObject oikea,OFF
ObjectRange oikea,30,51


vasen=LoadAnimObject("Media\j.tapettimies2\j.tapettimies2\Vasemmalle.bmp",47,51,0,10)
MaskObject vasen,cbMagenta
ShowObject vasen,OFF
ObjectRange vasen,30,51 

uusihahmo.HAHMO = New(HAHMO)
    uusihahmo\obj = CloneObject(oikea)
    SetupCollision uusihahmo\obj,kenttä,1,4,2
    ObjectRange uusihahmo\obj,30,51 
    uusihahmo\pelaaja = 1
 EndIf 
 
Repeat 

    For iHahmo.HAHMO = Each HAHMO
        iHahmo\vauhti=0
   
        p = iHahmo\pelaaja
        If (RightKey() And p = 1) Or (KeyDown(cbkeyd) And p = 2) Then

            PaintObject iHahmo\obj,oikea 
            If iHahmo\maassa Then PlayObject iHahmo\obj,2,11,0.25
            iHahmo\vauhti=2 
        ElseIf (LeftKey() And p=1) Or (KeyDown(cbkeya) And p = 2) Then
          
            PaintObject iHahmo\obj,vasen 
            If iHahmo\maassa Then PlayObject iHahmo\obj,2,11,0.25
            iHahmo\vauhti=-2 
        Else
  
            PlayObject iHahmo\obj,0
        EndIf
       

        TranslateObject iHahmo\obj,iHahmo\vauhti,iHahmo\yPlus#
        iHahmo\yPlus=iHahmo\yPlus+PAINOVOIMA 
       
        UpdateGame 
        CloneCameraPosition iHahmo\obj 
       
        iHahmo\maassa=0 
        törmäykset=CountCollisions(iHahmo\obj)

        For i=1 To törmäykset
            If GetCollision(iHahmo\obj,i)=kenttä

                If CollisionAngle(iHahmo\obj,i)=90 Then
                    iHahmo\yPlus#=-1
                    iHahmo\maassa=1 
                EndIf

                If CollisionAngle(iHahmo\obj,i)=270 Then
                    iHahmo\yPlus#=-1
                EndIf
            EndIf
        Next i
           

        If törmäykset=0 Then PlayObject iHahmo\obj,12,0
       

        If (KeyDown(cbkeyup) And p = 1) Or (KeyDown(cbkeyw) And p = 2) Then
            If iHahmo\maassa Then iHahmo\yPlus#=4.5 'voimaa ylös päin
        EndIf
    Next iHahmo

Until EscapeKey()
Forever 
DrawScreen


Älä kysy multa!
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset

Post by koodaaja »

Kehottaisin muokkaamaan koodin rakennetta rankasti. Laita itse peli funkkariin, se on paljon mukavampi käynnistää päävalikosta. Ja sinulta on muuten lipsahtanut kaksi viimeistä riviä väärinpäin, toki drawscreen ennen foreveriä. Lisäksi kakkosnamiskan painamista ei tarkisteta, ja kuvat tuhotaan luonnollisesti komennolla deleteimage, ei deleteobjectilla, kuten olet tuonne kirjoittanut.

Hahaa, löysinpä tässä vielä tutkiessani etsimäsi viankin: siirrä endif uuden hahmon luomisesta until escapekey():n alle. Näin toimii.
Akatsuki
Member
Posts: 56
Joined: Thu Jan 03, 2008 1:39 pm
Location: Ylöjärvi
Contact:

Re: Tyhmät kysymykset

Post by Akatsuki »

koodaaja wrote:Kehottaisin muokkaamaan koodin rakennetta rankasti. Laita itse peli funkkariin, se on paljon mukavampi käynnistää päävalikosta. Ja sinulta on muuten lipsahtanut kaksi viimeistä riviä väärinpäin, toki drawscreen ennen foreveriä. Lisäksi kakkosnamiskan painamista ei tarkisteta, ja kuvat tuhotaan luonnollisesti komennolla deleteimage, ei deleteobjectilla, kuten olet tuonne kirjoittanut.

Hahaa, löysinpä tässä vielä tutkiessani etsimäsi viankin: siirrä endif uuden hahmon luomisesta until escapekey():n alle. Näin toimii.
Kiitos avusta :D
Sinä näköjään olet taitava kun aina vaan jaksat neuvoa minu :roll:
Älä kysy multa!
superrally

Re: Tyhmät kysymykset

Post by superrally »

Koodasin autopeliini niin että sen pitäisi kolmenkierroksen jälkeen mennä valikkoon
mutta se ei mene :( peli vaan tilttaa ja pitää käynistää peli kokonaan uudelleen.


koodinpätkä millä sen pitäisi mennä valikkoon:

Code: Select all

If kierros = 3 Then Goto valikko
Auttajille kiitos!
Locked