Tyhmät kysymykset (I/2010)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
ezbe
Tech Developer
Tech Developer
Posts: 93
Joined: Fri May 08, 2009 6:53 pm

Re: Tyhmät kysymykset (I/2010)

Post by ezbe »

MrMonday wrote:Osaako kukaan kertoa, miten teen funktion rotaatiolle 2D-Avaruudessa,
eli esimerkiksi olisi neljästä pisteestä muodostettu neliö(Piste1X, Piste1Y, Piste2X, Piste2Y, Piste3X, Piste3Y, Piste4X, Piste4Y), jota pitäisi pystyä kääntämään..
Eli voisiko joku osaava henkilö kirjoittaa koodinpätkän, jossa on funktio, jolla pystyy kääntämään, tai oikeammin kaiketi kiertämään edellä mainittua neliötä..
Toivottavasti ymmärsitte mitä haen takaa, olisi suuri apu päästä näkemään esimerkki kyseisestä operaatiosta :)
2d-rotaatiomatriisilla onnistuu tuo. Ulkomuistista heittelisin jotain tällaista:

Code: Select all

// [  cos(a) , sin(a) ]  *  [x]
// [ -sin(a) , cos(a) ]     [y]

uusix = cos(kulma) * x + sin(kulma) * y
uusiy = -sin(kulma) * x + cos(kulma) * y
Tuo siis pyörittää pisteitä x ja y origon ympäri kulman verran ja tallentaa tulokset muuttujiin uusix ja uusiy.
Last edited by ezbe on Wed Jun 30, 2010 7:15 pm, edited 1 time in total.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset (I/2010)

Post by koodaaja »

Juurikin noin, jos haluaa jonkin muun ympäri pyörittää niin lisää vaan vakiokoordinaatit x- ja y-komponentteihin (neliön suhteen vakio eli joka kulmalle sama ;>).

Tässäpä hieman optimoitu malli, jonka löysin kovalevyni syövereistä:

Code: Select all

Function drawbox(x, y, w, h, ang#)
    cw = Cos(ang#)*w/2.0: ch = Cos(ang#)*h/2.0: sw = Sin(ang#)*w/2.0: sh = Sin(ang#)*h/2.0
    Line x + cw - sh, y + sw + ch, x - cw - sh, y - sw + ch
    Line x - cw - sh, y - sw + ch, x - cw + sh, y - sw - ch
    Line x - cw + sh, y - sw - ch, x + cw + sh, y + sw - ch
    Line x + cw + sh, y + sw - ch, x + cw - sh, y + sw + ch
EndFunction

w = 40
h = 30

Repeat
    w = w + (RightKey()-LeftKey())
    h = h + (UpKey()-DownKey())
    ang = wrapangle(ang + (MouseDown(2)-MouseDown(1)))
    
    drawbox(MouseX(), MouseY(), w, h, ang)
    DrawScreen
Forever
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by MrMonday »

Jees, kiitos paljon näistä :) Hieman kun enemmän näitä tutkailen, niin alkaa varmaankin jo muistua mieleen nuo kaikki matematiikan ihmeellisyydet :D
Ja kiitos vielä kerran..
sankja
Newcomer
Posts: 30
Joined: Thu Jan 29, 2009 10:32 pm

Re: Tyhmät kysymykset (I/2010)

Post by sankja »

Miksiköhän 1. jäsen on numero 2 , vaikka minun käsittääkseni se pitäisi olla numero 1 ? KEV='kiitos etukäteen vastauksesta." :o

Code: Select all



 
    Type KORTIT
        Field muoto
        Field valittu
    EndType

    SCREEN 600,600

    Dim varit(8,3)
    Dim vlippu
    vlippu=1
    
    Restore Varivakiot
        For i=1 To 8
            For j=1 To 3
                varit(i,j)=Read()
            Next j
        Next i

    'luodaan 8 eriväristä kortti-paria
    For i=1 To 2
        For j=1 To 8
            'luodaan uusi jäsen k - KORTIT kokoelmaan
            k.KORTIT=New(KORTIT)
            
            'asetetaan väri
            Color varit(j,1),varit(j,2),varit(j,3)
            
            'luodaan visuaalinen muoto
            img_kortti=MakeImage(2*32,4*32)
            DrawToImage img_kortti
                Box 0,0,2*32,4*32
            DrawToScreen
            
            'luodaan jäsenelle objekti,jolla on
            'kuvan mukainen väri ja muoto
            k\muoto=MakeObject()
            PaintObject k\muoto,-img_kortti
            
            ObjectPickable k\muoto,1
            
            k\valittu=0
            
        Next j
    Next i


cursor=LoadImage("cursor.bmp")
ShowMouse cursor



While vlippu=1



'korttipakan sekoitus
 '3 kortin satunnais-siirtäminen 
 'riittänee sekoittamaan pakan
'For i=1 To 3
remstart   
    Arvonta:
    k.KORTIT = First(KORTIT)
    
    s=Rand(1,15) 'siirtymä luku
    's=15
    a=1
    While a<=s 'toistetaan niin kauan että
    'ehto toteutuu ,eli a = s
        k = After(k) '1.siirtymä tapahtuu
        'kun siirrytään 1:stä jäsenestä toiseen
        'siksi siirtymiä voi olla korkeintaan 15
        '15:llä siirtymällä siirrytään 16:een jäseneen
        a=a+1
    Wend
    
    'katsotaan onko tämän jäsenen valittu-kentän
    'arvo nolla,jos ei arvotaan uudestaan jäsen
    If k\valittu=1
        Goto Arvonta
    EndIf
    
    'ja nyt kun ollaan s:n ilmoittamassa 
    'paikassa listaa,merkataan se jäsen valituksi
    k\valittu=1
    
    'siirretään se jäsen listan kärkeen
    Insert k,First(KORTIT)
    
'Next i   
remend

    'asetellaan kortit nätisti 4x4 muodostelmaan
    i=0:rivi=0
    For k.KORTIT=Each KORTIT
       
        'WaitKey:ClearKeys
        'If k=NULL Then Exit
        Askel:
        If i<4
            ScreenPositionObject k\muoto,100+(i*(2*32)),100+(rivi*(4*32))
            i+1
        Else
            i=0:rivi+1:Goto Askel
        EndIf 
       
    Next k
    
    Repeat 
    
        CameraPick MouseX(),MouseY()
        
        e=PickedObject() 
    
        For k.KORTIT=Each KORTIT
            If k\muoto=e
                Text 0,0,"Kortti "+e+" valittu"
            EndIf 
        Next k
    
    
    DrawScreen
    Until KeyHit(cbkeys)
    
        
    'tähän sisempi toimintasilmukka vois päättyä

Wend 


End 
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2010)

Post by Awaclus »

sankja wrote:Miksiköhän 1. jäsen on numero 2 , vaikka minun käsittääkseni se pitäisi olla numero 1 ? KEV='kiitos etukäteen vastauksesta." :o
Taulukon ensimmäinen jäsen on 0. Johtuisikohan tästä?
sankja
Newcomer
Posts: 30
Joined: Thu Jan 29, 2009 10:32 pm

Re: Tyhmät kysymykset (I/2010)

Post by sankja »

Tarkoitan siis kokoelman jäseniä , että miks tuo mun ohjelma ilmoittaa , että kokoelman eka jäsen on numero 2.
Vaikka ne pitäis olla jäsenet 1 - 16 ,(nyt ne on 2 -17)
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2010)

Post by Jonez »

Vaikuttaisi johtuvan jostain cb:n hienosta "ominaisuudesta"...

Objektihan saa tietyn numeroarvon aina latauksen yhteydessä, johon objektimuuttuja "viittaa". Objektien tapauksessa numerot alkavat ykkösestä. Sinä käytät tätä ominaisuutta hyväksesi koodissasi.

Näyttäisi kuitenkin siltä että jokainen koodissa oleva tyyppikokoelma siirtää tätä aloitusnumeroa yhdellä ylöspäin (piti tehdä pientä salapoliisityötä cb:n parissa tämän selvittämiseksi). SInun koodissasi on yksi tyyppilohko, joten tunnisteet alkavat kakkosesta.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: Tyhmät kysymykset (I/2010)

Post by phons »

Nyt iskee sellaista mysteeriMAVia, että huhhuh!! Siis koodini on clear, mutta sitten jos lisään sinne jotain, esim. lol = 1, niin iskee MAV, muuten ei.. Mikä on?

Onko tämä nyt taas niitä cb:n hienoja ominaisuuksia?
EDIT:

Hmm.. nyt pienensin yhden suuuren taulukon kokoa ja johan rullaa... Eli syynä taisi olla se että yritin varata liikaa muistia..

EDIT:

e2: Nyt tosin Escin painaminen tuottaa MAVin.. ja sitten kun poistan SPunten tekemän funktion, mouse_pos_karteesi->isometrinen, niin kaikki skulaa ilman MAVii

Last edited by phons on Thu Jul 01, 2010 9:40 pm, edited 3 times in total.
Image
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by valscion »

phons wrote:E: Onko tämä nyt taas niitä cb:n hienoja ominaisuuksia?
Luultavasti. Ehkä jos kokeilisit, tuleeko ongelma jollain toisella koneella? Tai että tuleeko ongelma, kun kirjoittelet vähän lisää sitä koodia?
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
koodi

Re: Tyhmät kysymykset (I/2010)

Post by koodi »

Ei viittis nyt koodia postaa mut jos joku tietäis missä vika.Ukon animaatiossa näkyy välillä sellanen musta boksi sen ukon ympärillä :D.Jos kävelee vasemmalle ei näy,jos oikeelle ei näy sitä boksii,mut jos kävelen ylös tai alas nii näkyy sellane musta ohut boksi sen ukon ympärillä :shock: .Kaikille suunnille on omat animaationsa,eli onko koodissa jotai vikaa vai sitte niissä animaatioissa?
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 »

koodi wrote:Ei viittis nyt koodia postaa mut jos joku tietäis missä vika.Ukon animaatiossa näkyy välillä sellanen musta boksi sen ukon ympärillä :D.Jos kävelee vasemmalle ei näy,jos oikeelle ei näy sitä boksii,mut jos kävelen ylös tai alas nii näkyy sellane musta ohut boksi sen ukon ympärillä :shock: .Kaikille suunnille on omat animaationsa,eli onko koodissa jotai vikaa vai sitte niissä animaatioissa?
a) Oletko kääntänyt objektia?
b) Oletko varma, ettei spritesheetissäsi vahingossa ole tummaa reunusta ko. framen ympärillä?
koodi

Re: Tyhmät kysymykset (I/2010)

Post by koodi »

no tossa toi koodi nyt on kaikki muu poistettuna.. ja aikamonessa muussakin animaatiossa on se neliö esim taioissa :D
tuo on sitten lähes suoraan cb esimerkeistä muokattunua..

Code: Select all

SCREEN 250,188,0,cbsizable 


FrameLimit 40 

zeroright=LoadAnimObject("Media\kävely.png",24,31,0,3)
MaskObject zeroright,0,0,255
ShowObject zeroRight,OFF
 
zeroleft=LoadAnimObject("Media\kävely3.png",24,31,0,3)
MaskObject zeroleft,0,0,255
ShowObject zeroleft,OFF
zeroup=LoadAnimObject("Media\kävely1.png",24,34,0,3)
MaskObject zeroup,0,0,255
ShowObject zeroup,OFF
zerodown=LoadAnimObject("Media\kävely2.png",24,33,0,3)
MaskObject zerodown,0,0,255
ShowObject zerodown,OFF

taikapallo1=LoadAnimObject("Media\pallo.png",34,27,0,3,4)
MaskObject taikapallo1,128,192,192
ShowObject taikapallo1,OFF

zero=CloneObject(zerodown)

ClsColor cbwhite
Cls



Repeat

    
    If RightKey() Then
    RotateObject zero,180
        PaintObject zero,zeroright
        PlayObject zero,0,3,0.25 
       TranslateObject zero,2,0 
       suuntax=4
       suuntay=0
       suunta=oikea
       
    
    ElseIf LeftKey() Then
    RotateObject zero,0
       PaintObject zero,zeroleft
        PlayObject zero,0,3,0.25 
        TranslateObject zero,-2,0 
        suuntax=-4
       suuntay=0
       suunta=vasen
       
       
    ElseIf UpKey() Then
     RotateObject zero,-90
       PaintObject zero,zeroup
        PlayObject zero,0,3,0.25 
        TranslateObject zero,0,2 
        suuntax=0
       suuntay=4
       suunta=ylös
      
         ElseIf DownKey() Then
         RotateObject zero,90
       PaintObject zero,zerodown
        PlayObject zero,0,3,0.25 
        TranslateObject zero,0,-2 
        suuntax=0
       suuntay=-4
       suunta=alas 
       
    EndIf

    

    DrawScreen

Until EscapeKey() 
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset (I/2010)

Post by esa94 »

Oletko varma, että animaatiosi ruudut ovat täsmälleen niin leveitä kuin sanoit ja ettei niiden välissä ole mitään?
koodi

Re: Tyhmät kysymykset (I/2010)

Post by koodi »

siinä ylös kävely animaatiossa tulee vaan se musta neliö.. sitte taioissa tulee melkee joka suuntaa,mut se ylöspäin animaatio on 72x34.Ja laskimella laskin,että 72/3=24.enkä nää noissa kuvissa mitään neliöitä tai muuta roskaa.Cb:ssä vikaa?
Koodi

Re: Tyhmät kysymykset (I/2010)

Post by Koodi »

nyt löyty vika.Heti ku otin sieltä upkeyn alapuolelta sen rotateobject pois nii lähti neliötki,mut ois iha hyvä että se kääntäs sitä objektia koska luodit lentää samaa suuntaa ku objekti osottaa.. ja kaikki muu säädetty nyt niin että sinne suuntaa minne objekti..tällä koodilla toimii ilman neliöitä.

Code: Select all

SCREEN 250,188,0,cbsizable 


FrameLimit 40 

zeroright=LoadAnimObject("Media\kävely.png",24,31,0,3)
MaskObject zeroright,0,0,255
ShowObject zeroRight,OFF

zeroleft=LoadAnimObject("Media\kävely3.png",24,31,0,3)
MaskObject zeroleft,0,0,255
ShowObject zeroleft,OFF
zeroup=LoadAnimObject("Media\kävely1.png",24,34,0,3)
MaskObject zeroup,0,0,255
ShowObject zeroup,OFF
zerodown=LoadAnimObject("Media\kävely2.png",24,33,0,3)
MaskObject zerodown,0,0,255
ShowObject zerodown,OFF

taikapallo1=LoadAnimObject("Media\pallo.png",34,27,0,3,4)
MaskObject taikapallo1,128,192,192
ShowObject taikapallo1,OFF

zero=CloneObject(zerodown)

ClsColor cbwhite
Cls



Repeat

    
    If RightKey() Then
    RotateObject zero,180
        PaintObject zero,zeroright
        PlayObject zero,0,3,0.25 
       TranslateObject zero,2,0 
       suuntax=4
       suuntay=0
       suunta=oikea
       
    
    ElseIf LeftKey() Then
    RotateObject zero,0
       PaintObject zero,zeroleft
        PlayObject zero,0,3,0.25 
        TranslateObject zero,-2,0 
        suuntax=-4
       suuntay=0
       suunta=vasen
       
       
    ElseIf UpKey() Then
     ''''''''''''''''''''''''''''''''''
     ''''''''''''''''''''''''''''''''''
     '''''''''''''''''''''''''''''''''''
       PaintObject zero,zeroup
        PlayObject zero,0,3,0.25 
        TranslateObject zero,0,2 
        suuntax=0
       suuntay=4
       suunta=ylös
      
         ElseIf DownKey() Then
         RotateObject zero,90
       PaintObject zero,zerodown
        PlayObject zero,0,3,0.25 
        TranslateObject zero,0,-2 
        suuntax=0
       suuntay=-4
       suunta=alas 
       Else
       
    EndIf

    

    DrawScreen

Until EscapeKey() 
sori tuplapostaus..
Nassi_Setä
Advanced Member
Posts: 281
Joined: Sat Jun 28, 2008 5:19 pm
Location: Hämeessä miä

Re: Tyhmät kysymykset (I/2010)

Post by Nassi_Setä »

Sellaiset mustat reunukset ilmaantuvat kun pyörittää maskattua objektia, kuten tuota painovoima esimerkin pelihahmoa jonka maskiväriksi
määritellään Magenta tai jokin muu väri. Ongelmaa ei ole objekteilla joiden maski väri on musta, joka on myös CB:n oletus jota ei tarvitse erikseen määritellä koodissa.
Joten seuraavan kerran kun teet grafiikkaa peleihisi "maalaa" kaikki minkä et halua piirtyä mustalla (0, 0, 0) ja jos haluat että grafiikassasi on
vaikkapa mustat ääriviivat tee ne melkein mustalla (1, 0, 0) ja ne piirtyvät näytölle.
EDIT:

Toivottavasti en feilannut kovin pahasti tuota selitystäni :D Ja sitten asiaan: onko olemassa komentoa tyyliin PlayImage , jolla saisi kuvien animaation helposti soitettua?

\../(-_-)\../ <---klick MyBrute Image
Jotain evilii on tekeillä....
DumBasZ
Newcomer
Posts: 20
Joined: Fri Aug 29, 2008 7:52 am

Re: Tyhmät kysymykset (I/2010)

Post by DumBasZ »

Manuaalissa sanotaan, että läpinäkyvien kuvien (DrawGhostImage) piirtäminen on raskasta ja sitä pitäisi käyttää säästeliäästi. Kuinka raskas se silloin on? Kannattaako sitä käyttää juuri ollenkaan? Entä kuinka suuria kuvia sillä uskaltaa piirtää?
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2010)

Post by Latexi95 »

DumBasZ wrote:Manuaalissa sanotaan, että läpinäkyvien kuvien (DrawGhostImage) piirtäminen on raskasta ja sitä pitäisi käyttää säästeliäästi. Kuinka raskas se silloin on? Kannattaako sitä käyttää juuri ollenkaan? Entä kuinka suuria kuvia sillä uskaltaa piirtää?
Kyllähän se aika raskas on joten ei peliä kannata niillä täyttää, mutta kyllä muutaman läpinkyvän kuvan voit piirtää huoletta. Kokeilemallahan sen raskaus selviää, joten kokeile vaikka tulostamalla ruudunpäivitys nopeus(FPS()) yläkulmaan ja piirtelemällä muutamia läpinäkyviä kuvia ruudulle.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2010)

Post by valscion »

Nassi_Setä wrote:Ja sitten asiaan: onko olemassa komentoa tyyliin PlayImage , jolla saisi kuvien animaation helposti soitettua?
Ei ole olemassa, mutta väsäsinpä sinulle sellaisen. Ollos hyvä:

Code: Select all

// TARVITTAVA GLOBAALI MUUTTUJA
Global gPlayImageRec
gPlayImageRec=0


// ESIMERKKI
anim=LoadAnimImage("Media/note.bmp",32,32,0,8) 
MaskImage anim,cbmagenta

speed = 100

Repeat

    speed = speed + MouseMoveZ()*10
    
    x = x + (RightKey() - LeftKey()) * 4
    y = y + (DownKey() - UpKey()) * 4
    
    frame = PlayImage( speed, anim, x, y, 8, frame )
    
    Text 5, 200, "X: "+x
    Text 5, 215, "Y: "+y
    Text 5, 230, "Framen nopeus: "+speed + "ms"
    Text 5, 245, "Vaihda nopeutta hiiren rullalla. Liikuta"
    Text 5, 260, "kuvaa nuolinäppäimillä."
    
    DrawScreen
    
Forever

//***********************************************************************
// PlayImage()-funktio by VesQ
// Funktio kuvasarjan toistamista varten.
//
// Huomaa, että funktion paluuarvo pitää ottaa talteen ja antaa
// saatu arvo funktiolle uudelleen _frame -parametriin. Katso esimerkki.
//
// Funktio tarvitsee toimiakseen globaalin kokonaislukumuuttujan 
// gPlayImageRec, jonka avulla ajastin toimii.
//
// Parametrien selitys:
//  _speed       = yhden framen kesto millisekunteina
//  _img         = LoadAnimImage()-funktiolla ladattu kuvamuuttuja
//  _x#          = Kuvan x-koordinaatti
//  _y#          = Kuvan y-koordinaatti
//  _frameamount = Montako framea kuvasarjassa on
//  _frame       = Tällä hetkellä menevä frame. TÄRKEÄ!
//  _transperency= Läpinäkyvyys OFF/ON. Oletuksena normaali läpinäkyvyys
//***********************************************************************
Function PlayImage( _speed, _img, _x#, _y#, _frameamount, _frame, _transparency=1 )
    
    DrawImage _img, _x, _y, _frame, _transparency
    
    If gPlayImageRec=0 Then gPlayImageRec=Timer()
    If Timer() > gPlayImageRec + _speed Then
        gPlayImageRec = 0
        If _frame >= _frameamount-1 Then Return 0 Else Return _frame+1
    EndIf
    
    Return _frame
EndFunction
EDIT: Hifistelin vähän esimerkkiä.
EDIT2: Korjasin vähän funktiota. Nyt se aloittaa ensimmäisestä framesta, kun funktiota käytetään ensimmäisen kerran (ellei toisin ohjeisteta).
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
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2010)

Post by Kille »

Onko cb:llä mahdollista toistaa animoituja gif-kuvia?
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
Locked