0

最近、私は 3 番目の pygame ゲームを開始することにしました。そのゲームでは、プレーヤーはマウスで飛行機をポイントすることにより、画面の下部にある大砲から飛行機で発砲する必要があります。コードをより多くのモジュール (more.py ファイル) に入れました。 )理解を容易にするために、キャノンバレルをマウスの現在の位置に向かって回転させることから始めました。

main.py

import pygame,sys
import screen
import constants
from pygame.locals import *
from loop import *

screen.screen = pygame.display.set_mode((800,600))
main_loop()

constns.py

import pygame

pygame.init()

scr = pygame.display.list_modes()
resolution = (scr[0][0],scr[0][1])
angle = 0
barell = pygame.image.load("barell.png")
tux = pygame.image.load("tux.png")
tux2 = pygame.transform.scale(tux,(100,100))

loop.py

import pygame,event
import screen
import constants
import math
import random
import groups
from faster_barell import *


faster_barell = faster_barell()
faster_barell.add_to_group()

def main_loop():
    while True:
        mx,my = pygame.mouse.get_pos()
        event.Event()
        screen.screen.fill([0,0,0])
        groups.barell_group.draw(screen.screen)
        for t in groups.barell_group:
            dx = mx - t.rect.x
            dy = my - t.rect.y
            angle = math.atan2(dx,dy)
            angle2 = math.degrees(angle)
            constants.angle = angle2
            t.image = pygame.transform.rotate(constants.barell,angle2)

         pygame.display.flip()

screen.py

import pygame
import constants

pygame.init()

screen = None

event.py

import pygame,sys
from pygame.locals import *

class Event(object):
    def __init__(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

fast_barell.py

import pygame
import constants
import groups

class faster_barell(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = constants.barell
        self.rect = self.image.get_rect()
        self.rect.x = 750
        self.rect.y = 550

    def add_to_group(self):
        groups.barell_group.add(self)

groups.py

import pygame

barell_group = pygame.sprite.Group()

ここで、pygame を回転させる代わりに (どのように説明するかはわかりません)、バレル イメージをスケーリングします。 .rotate(constants.barell,angle2) constants.barell を constants.tux2 に変更します (これは単なる tux イメージです (テストのためだけにゲームには含まれません)、すべて正常に動作します!これが私が作業した tux イメージです) http://upload.wikimedia.org/wikipedia/commons/3/3e/Tux-G2.png .math.atan2 の dx と dy を別のもの (dy,dx,-dy) に変更して問題を解決しようとしました、dx、-dx、-dy など) 助けてください。約 6 時間、この問題を解決しようとしています (コードを機能させるために本当に何もできない場合を除き、stackoverflow について質問することはありません)。

4

2 に答える 2

0

回答ありがとうございます。すべて試してみましたが、どれもうまくいきませんでした。代わりに、このように修正しました

pygame.transform.scale の代わりに pygame.transform.rotozoom(constants.barell,angle2,1) を使用します。

ありがとうございました:D

于 2013-08-04T17:46:47.747 に答える
0

ここにいくつかの役立つリンクがあります: docs

回転関数ドキュメントから:

"90 度単位で回転しない限り、画像は新しいサイズを保持するために大きくパディングされます。"

解決策は、回転するたびに画像をトリミングすることです。新しいサーフェスを作成する小さな関数を記述してトリミングし、中央部分を新しいサーフェスにブリットすることができます。この問題はすでにここで解決されています:

于 2013-08-03T15:07:56.737 に答える