Inventory

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
Bambi
Member
Posts: 87
Joined: Sat Nov 24, 2007 12:51 pm

Inventory

Post by Bambi »

Nyt en hae suoraa koodia, miten toteuttaa inventory, vaan mieluummin teoriaa/selitystä. :) Ja kyllä, käytin hakua ja löytyikin aika hyviä funktioita by Henkru, mutta tykkään koodata kaiken, tai ainakin suurimman osan itse. ;)

Onnistuin kyllä jollain purkkasysteemillä lisäämään tavaran inventoryyn ja sijoittamaan koko systeemin jonnekki päin pelimaailmaa, mutta siihen se oikeastaan jääkin. :D

Edit: tuossa osa (vain kaikki, joka liittyy tuohon inventoryyn) mun koodia, josta voi huomata nykyisen tsydeemini ongelmat.

Code: Select all

Type Varuste
    *tässä muita fieldejä*
    Field inventoryssa '0 = ei, 1 = joo
End Type 

Global seuraavaX,inventoryssa2
    seuraavaX = 300 
    inventoryssa2 = 0

Tormaykset:
    For isankari.Sankari = Each Sankari
    For ivarusteet.Varuste = Each Varuste
        If ImagesOverlap(isankari\obj,isankari\x,isankari\y,ivarusteett\obj,ivarusteet\x,ivarusteet\y) And ivarusteet\inventoryssa = 0 Then 
            ivarusteet\inventoryssa = 1
            ivarusteet\x = LisaaInva() : ivarusteet\y = 10
        EndIf 
    Next ivarusteet
    Next isankari
Return 

Function PiirraVaruste(ax=-2,ay=-2)
    For ivarusteet.Varuste = Each Varuste
        If ax < 0 And ay < 0 Then DrawImage ivarusteet\obj,ivarustete\x,ivarusteet\y
        If ax >= 0 And ay >= 0 Then DrawImage ivarusteet\obj,ax,ay
    Next ivarusteet
EndFunction 

Function LisaaInva()
    If inventoryssa2 <= 20 Then seuraavaX + 10
    Return seuraavaX
EndFunction 
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: Inventory

Post by Sly_Jack0 »

Itse olen havainnut hyväksi tavaksi tehdä hahmolle/hahmoille muistipalan nimeltä inventory. Tähän sitten talletetaan varusteiden/esineiden id:t ja tavaroiden määrä inventoryssä. Laitan vaikka esimerkin myöhemmin tänään, mutta nyt ei kerkiä.
EDIT:

Tässä tämä lupaamani esimerkki. Ei todellakaan paras mahdollinen. Toivottavasti saat tästä jotain selvää.

Code: Select all

//Pelaajan inventory.
Global playerInventory

//Tavarat.
Type ITEM
	Field name$
	
	Field price
	
	Field id
EndType

For k = 0 To 4
	
	i.ITEM = New(ITEM)
		i\name$ = Chr(Rand(255))
		
		i\price = Rand(10,1000)
		
		i\id = ConvertToInteger(i)
		
	addToInventory(i\id,Rand(2,10))
		
Next k

printItems()
waitkey




//Palauttaa tavaran sijainnin inventoryssä.
//Jos tavaraa ei löydy, palautetaan -1.
Function itemPosition(itemId)
	
	//Tavararoisden määrä.
	tmpItems = MEMBlockSize(playerInventory) / 5 '(Int + Byte = 5 tavua)
	
	For i = 0 To tmpItems - 1
		If PeekInt(playerInventory,i * 5) = itemId
			Return i * 5
		EndIf
	Next i
	
	Return -1

EndFunction

//Lisää tavaran inventoryyn.
Function addToInventory(itemId,amount)
	
	//Jos inventoryä ei ole, luodaan se.
	If playerInventory = 0
		playerInventory = MakeMEMBlock(5)
	EndIf
	
	tmpPos = itemPosition(itemId)
	
	//Jos tavara ON jo inventoryssä, kasvatetaan sen määrää.
	If tmpPos <> - 1
		//Luetaan entinen määrä.
		tmpAmount = PeekByte(playerInventory,tmpPos + 4)
		//Lisätään määrää.
		tmpAmount = tmpAmount + amount
		//Kirjoitetaan uusi määrä muistipalaan.
		PokeByte playerInventory,tmpPos + 4,tmpAmount
	Else //Jos tavaraa ei ole inventoryssä.
		//Inventoryn koko. Tallennetaan muuttujaan optimoinnin takia.
		tmpSize = MEMBlockSize(playerInventory)
		
		//Jos inventoryn lopussa ON tyhjää, lisätään tavara sinne.
		If PeekInt(playerInventory,tmpSize - 5) = 0
			PokeInt playerInventory,tmpSize - 5,itemId
			PokeByte playerInventory,tmpSize - 1,amount
		Else //Muuten lisätään loppuun tyhjää ja lisätään tavara sinne.
			ResizeMEMBlock playerInventory,tmpSize + 5
			PokeInt playerInventory,tmpSize,itemId
			PokeByte playerInventory,tmpSize + 4,amount
		EndIf
	EndIf
	
EndFunction


//Tulostaa tavarat.
Function printItems()

	tmpItems = MEMBlockSize(playerInventory) / 5
	
	For k = 0 To tmpItems - 1
		i.ITEM = ConvertToType(PeekInt(playerInventory,k * 5))
		
		Print "Name: " + i\name$ + "  Price: " + i\price + "  Amount: " + PeekByte(playerInventory,k * 5 + 4)
	Next k
	
EndFunction
[/edit]
Last edited by Sly_Jack0 on Mon Jul 06, 2009 2:05 pm, edited 1 time in total.
DatsuniG
Advanced Member
Posts: 367
Joined: Fri Aug 15, 2008 9:57 pm

Re: Inventory

Post by DatsuniG »

Tässä on jonkinmoinen esimerkki. Suosittelen kuitenkin tekemään oman inventoryn piirron. ; )

Code: Select all

Const INVENTORYWIDTH = 3 ' Inventoryn leveys paikoissa
Const INVENTORYHEIGHT = 3 ' Inventory korkeus paikoissa
Const MAXITEMSPERSLOT = 2 ' Maksimi määrä tavaroita yhdessä paikassa

Dim Inventory(INVENTORYWIDTH - 1,INVENTORYHEIGHT - 1,1) ' Luodaan tarvittavan kokoinen taulukko

Dim Items(2) ' Luodaan taulukko tavaroille
Dim ItemData(2) As String ' Kuvaus tavaroille

Items(1) = LoadImage("media/cow.bmp") ' Ladataan tavaran kuva
Items(2) = LoadImage("media/tatti.bmp") ' Ladataan tavaran kuva

ItemData(1) = "It's a cow" ' Tallennetaan kuvaus taulukkoon 
ItemData(2) = "Shroom of mass destruction" ' Tallennetaan kuvaus taulukkoon 

Type OBJECTS ' Esimerkin materiaalia
    Field ID
    Field img
    Field x
    Field y
    Field SpeedX As Float
    Field SpeedY As Float
EndType 

For i = 1 To 20 ' Esimerkin materiaalia
    uusi.OBJECTS = New(OBJECTS)
    uusi\ID = Rand(1,2)
    uusi\img = CloneImage(Items(uusi\ID))
    uusi\x = Rand(150)
    uusi\y = Rand(150)
    Ra = Rand(359)
    uusi\SpeedX = Cos(ra)
    uusi\SpeedY = Sin(ra)
Next i 

Repeat
    For uusi.OBJECTS = Each OBJECTS ' Esimerkin materiaalia
        uusi\x = uusi\x + uusi\SpeedX
        uusi\y = uusi\y + uusi\SpeedY
        If uusi\x < 0 Or uusi\x > 150 Then uusi\SpeedX = -uusi\SpeedX
        If uusi\y < 0 Or uusi\y > 150 Then uusi\Speedy = -uusi\Speedy
        DrawImage uusi\img,uusi\x,uusi\y
        If MouseHit(1) And MouseX() > uusi\x And MouseX() < uusi\x + ImageWidth(uusi\img) And MouseY() > uusi\y And MouseY() < uusi\y + ImageHeight(uusi\img) Then 
            If AddToInventory(uusi\id) Then Delete uusi
        EndIf
    Next uusi
    DrawInventory(250,100)    
    DrawScreen
Forever 

Function AddToInventory(ID)
    For a = 0 To INVENTORYHEIGHT - 1
        For i = 0 To INVENTORYWIDTH - 1
            If Inventory(i,a,1) = 0 Then 
                Inventory(i,a,0) = ID
                Inventory(i,a,1) = Inventory(i,a,1) + 1
                Return True 
                Goto purQ
            ElseIf Inventory(i,a,0) = ID And Inventory(i,a,1) < MAXITEMSPERSLOT Then 
                Inventory(i,a,1) = Inventory(i,a,1) + 1
                Return True 
                Goto purQ
            EndIf 
        Next i
    Next a
    Return False 
    purQ:
EndFunction 

Function RemoveFromInventory(i,a)
    If Inventory(i,a,1) = 1 Then 
        Inventory(i,a,0) = 0
    EndIf 
    Inventory(i,a,1) = Inventory(i,a,1) - 1
EndFunction 

Function DrawInventory(x,y)
   For a = 0 To INVENTORYHEIGHT - 1
        For i = 0 To INVENTORYWIDTH - 1
            Box x + i * 32,y + a * 32,32,32,0
            If MouseX() > x + i * 32 And MouseX() < x + i * 32 + 32 And MouseY() > y + a * 32 And MouseY() < y + a * 32 + 32 And Inventory(i,a,1) > 0 Then 
                If MouseHit(1) Then RemoveFromInventory(i,a)
            EndIf 
            If Inventory(i,a,1) > 0 Then 
               If MouseX() > x + i * 32 And MouseX() < x + i * 32 + 32 And MouseY() > y + a * 32 And MouseY() < y + a * 32 + 32 Then 
                    Text 2,ScreenHeight() - TextHeight(ItemData(Inventory(i,a,0))),ItemData(Inventory(i,a,0))
                EndIf 
                DrawImage Items(Inventory(i,a,0)),x + i * 32 + 1,y + a * 32 + 1
                Text x + i * 32,y + a * 32 + 2, Inventory(i,a,1)
            EndIf 
            
        Next i
    Next a
EndFunction  
Hengität nyt manuaalisesti.
User avatar
Bambi
Member
Posts: 87
Joined: Sat Nov 24, 2007 12:51 pm

Re: Inventory

Post by Bambi »

Kiitos molemmille! Sain hyvin toimimaan soveltamalla teidän koodianne. :P
Post Reply