mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
Add example/sprites (#83)
This commit is contained in:
parent
5a354684c5
commit
665ef46064
131
example/sprites/main.go
Normal file
131
example/sprites/main.go
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
// Copyright 2015 Hajime Hoshi
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/hajimehoshi/ebiten"
|
||||||
|
"github.com/hajimehoshi/ebiten/ebitenutil"
|
||||||
|
_ "image/png"
|
||||||
|
"log"
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
screenWidth = 320
|
||||||
|
screenHeight = 240
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ebitenImage *ebiten.Image
|
||||||
|
)
|
||||||
|
|
||||||
|
type Sprite struct {
|
||||||
|
image *ebiten.Image
|
||||||
|
x int
|
||||||
|
y int
|
||||||
|
vx int
|
||||||
|
vy int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Sprite) Update() {
|
||||||
|
s.x += s.vx
|
||||||
|
s.y += s.vy
|
||||||
|
if s.x < 0 {
|
||||||
|
s.x = -s.x
|
||||||
|
s.vx = -s.vx
|
||||||
|
}
|
||||||
|
if s.y < 0 {
|
||||||
|
s.y = -s.y
|
||||||
|
s.vy = -s.vy
|
||||||
|
}
|
||||||
|
w, h := s.image.Size()
|
||||||
|
if screenWidth <= s.x+w {
|
||||||
|
s.x = 2*(screenWidth-w) - s.x
|
||||||
|
s.vx = -s.vx
|
||||||
|
}
|
||||||
|
if screenHeight <= s.y+h {
|
||||||
|
s.y = 2*(screenHeight-h) - s.y
|
||||||
|
s.vy = -s.vy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Sprite) Dst() (x0, y0, x1, y1 int) {
|
||||||
|
w, h := s.image.Size()
|
||||||
|
return s.x, s.y, s.x + w, s.y + h
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Sprite) Src() (x0, y0, x1, y1 int) {
|
||||||
|
w, h := s.image.Size()
|
||||||
|
return 0, 0, w, h
|
||||||
|
}
|
||||||
|
|
||||||
|
type Sprites []*Sprite
|
||||||
|
|
||||||
|
func (s Sprites) Update() {
|
||||||
|
for _, sprite := range s {
|
||||||
|
sprite.Update()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Sprites) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Sprites) Dst(i int) (x0, y0, x1, y1 int) {
|
||||||
|
return s[i].Dst()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Sprites) Src(i int) (x0, y0, x1, y1 int) {
|
||||||
|
return s[i].Src()
|
||||||
|
}
|
||||||
|
|
||||||
|
var sprites = make(Sprites, 2500)
|
||||||
|
|
||||||
|
func update(screen *ebiten.Image) error {
|
||||||
|
sprites.Update()
|
||||||
|
op := &ebiten.DrawImageOptions{
|
||||||
|
ImageParts: sprites,
|
||||||
|
}
|
||||||
|
op.ColorM.Scale(1.0, 1.0, 1.0, 0.5)
|
||||||
|
if err := screen.DrawImage(ebitenImage, op); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
ebitenutil.DebugPrint(screen, fmt.Sprintf("FPS: %0.2f\nNum of sprites: %d", ebiten.CurrentFPS(), sprites.Len()))
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var err error
|
||||||
|
ebitenImage, _, err = ebitenutil.NewImageFromFile("images/ebiten.png", ebiten.FilterNearest)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
for i, _ := range sprites {
|
||||||
|
w, h := ebitenImage.Size()
|
||||||
|
x, y := rand.Intn(screenWidth-w), rand.Intn(screenHeight-h)
|
||||||
|
vx, vy := 2*rand.Intn(2)-1, 2*rand.Intn(2)-1
|
||||||
|
sprites[i] = &Sprite{
|
||||||
|
image: ebitenImage,
|
||||||
|
x: x,
|
||||||
|
y: y,
|
||||||
|
vx: vx,
|
||||||
|
vy: vy,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := ebiten.Run(update, screenWidth, screenHeight, 2, "Sprites (Ebiten Demo)"); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,8 @@
|
|||||||
package shader
|
package shader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"github.com/hajimehoshi/ebiten/internal/opengl"
|
"github.com/hajimehoshi/ebiten/internal/opengl"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -56,6 +58,10 @@ func DrawTexture(c *opengl.Context, texture opengl.Texture, projectionMatrix *[4
|
|||||||
if quads.Len() == 0 {
|
if quads.Len() == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
// TODO: Change this panic if image.DrawImage allows more than quadsMaxNum parts.
|
||||||
|
if quadsMaxNum < quads.Len() {
|
||||||
|
return errors.New(fmt.Sprintf("len(quads) must be equal to or less than %d", quadsMaxNum))
|
||||||
|
}
|
||||||
|
|
||||||
f := useProgramTexture(c, glMatrix(projectionMatrix), texture, geo, color)
|
f := useProgramTexture(c, glMatrix(projectionMatrix), texture, geo, color)
|
||||||
defer f.FinishProgram()
|
defer f.FinishProgram()
|
||||||
|
@ -23,8 +23,9 @@ var (
|
|||||||
programRect opengl.Program
|
programRect opengl.Program
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const quadsMaxNum = 10000
|
||||||
|
|
||||||
func initialize(c *opengl.Context) error {
|
func initialize(c *opengl.Context) error {
|
||||||
const size = 10000
|
|
||||||
const uint16Size = 2
|
const uint16Size = 2
|
||||||
|
|
||||||
shaderVertexNative, err := c.NewShader(c.VertexShader, shader(c, shaderVertex))
|
shaderVertexNative, err := c.NewShader(c.VertexShader, shader(c, shaderVertex))
|
||||||
@ -62,10 +63,10 @@ func initialize(c *opengl.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const stride = 4 * 4
|
const stride = 4 * 4
|
||||||
c.NewBuffer(c.ArrayBuffer, stride*size, c.DynamicDraw)
|
c.NewBuffer(c.ArrayBuffer, stride*quadsMaxNum, c.DynamicDraw)
|
||||||
|
|
||||||
indices := make([]uint16, 6*size)
|
indices := make([]uint16, 6*quadsMaxNum)
|
||||||
for i := uint16(0); i < size; i++ {
|
for i := uint16(0); i < quadsMaxNum; i++ {
|
||||||
indices[6*i+0] = 4*i + 0
|
indices[6*i+0] = 4*i + 0
|
||||||
indices[6*i+1] = 4*i + 1
|
indices[6*i+1] = 4*i + 1
|
||||||
indices[6*i+2] = 4*i + 2
|
indices[6*i+2] = 4*i + 2
|
||||||
|
Loading…
Reference in New Issue
Block a user